電平:
高電平 :1
低電平 :0
電平未知:X
高阻態 :Z
進位:
二進位 :b
八進位 :o
十進位 :d
十六進位: h
' 的概念:
舉例:
二進位 4』b0101 4位二進位為 0101
十進位 4』d2 4位十進位為 0010
十六進位 4』ha 4位十六進位為1010
_的概念:
目的:增加程序的可讀性。
舉例:(_不被編譯器編譯)
16』b0101_0011_1010_0101=16』h53a5
標識符:
類似於C語言的變量名,用於定義模塊名、埠號、信號名等。
標準:不建議大小寫混寫、普通內部信號全部小寫、需要表明標識符含義含義
Verilog數據類型:
1.寄存器數據類型
表示一個抽象的數據存儲單元,使用賦值語句可以改變寄存器的數值。
關鍵字reg ,只能在always和initial語句中被賦值,如果沒有賦值,為未知數值X。
對應的硬體關係:
在時序邏輯電路:觸發器 (時序邏輯--always語句塊中帶時鐘信號 )
在組合邏輯電路:硬體連線(組合邏輯--always語句塊中不帶時鐘信號)
舉例:
reg [31:0] delay_cnt //位寬為32位
reg key_reg // 位寬為1位
2.線網數據類型
含義:表示結構實體(例如門)之間的物理連線,不能存儲數值,只能由驅動它的元件所決定,驅動線網類型的元件有門、連續賦值語句、assign等,如果沒有驅動元件連接到線網類型的變量上,該變量為Z。
表示:wire和tri,最常用的wire。
舉例:wire key_flag //位寬為1的線網類型數據。
3.參數數據類型
參數是常量,在Verilog中用parameter定義常量,可以一次定義多個參數,參數和參數之間用逗號隔開,每個參數的右邊必須是一個常數表達式。
格式舉例:parameter H_SYNC = 11』d41
應用:
(1)參數型數據常用於定義狀態機的狀態、數據位寬和延遲大小等。
(2)採用標識符來代表一個常量可以提高程序的可讀性和可維護性。
(3)在模塊調用時,可通過參數傳遞來改變被調用模塊中已定義的參數。
localparam和parameter的唯一區別在於localparam不可用於參數的傳遞,對於參數傳遞,在後面的文章可能會提到,也可自己先理解。
運算符
1.算術運算符:+ - * / %
注意:除法只能取整數。
2.關係運算符:> < <= >= == !=
3.邏輯運算符:!&& ||
4.條件操作符(C語言中的三目運算符):a ? b :c
5.位運算符:~ & | ^(異或)
舉例:0+0=0 1+0=1 1+1=0
6.移位運算符:<< >>
注意:左移位寬增加,右移位寬不變。
7.拼接運算符:{a,b}
運算符的優先級:和C語言相同,可百度查看。
part two 程序框架
注釋:
1.代碼注釋://、/* */
2.XDC文件注釋 #
關鍵字:
input output .
這裡引用正點原子整理的文檔(以下此類文檔均引用正點原子):
框架:
Verilog的基本設計單元為---模塊block(和C語言中的函數很相似)。
一個模塊由兩部分組成:
描述接口、描述邏輯功能
每個Verilog程序有四個主要部分:埠定義、IO說明、內部信號說明、功能定義。
舉例:
module block(a,b,c,d);
input a,b;
output c,d;
assign c = a|b;
assign d = a&b;
endmodule
note:
module 為模塊的開始 endmodule 為模塊的結束
模塊名字:block ---儘量寫出此模塊的意義
abcd默認為wire類型的變量
關鍵字:input output 輸入輸出信號為IO的說明
功能定義有三種方法:assigan 描述組合邏輯、always 描述組合和時序邏輯、例化實例元件。
結構語句:
賦值語句:
兩種賦值方式:
1.阻塞賦值 :b=a 組合邏輯電路中always中使用
2.非阻塞賦值:b<= 時序邏輯電路always中使用
非阻塞賦值先計算出右邊的數值,再統一賦值給左邊,而且只能用於對寄存器類型的變量進行賦值,因此只能用在initial塊和always塊等過程塊中,不允許在多個always塊中對同一個變量進行賦值!
條件語句:
if else
if else if else if . else
Note:
1.條件語句必須在過程塊中使用,過程塊語句是指由initial和always語句引導的塊語句。
2.if語句對表達式的值進行判斷,若為0,x,z,則按假處理;若為1,按真處理。
case語句:
到此為止,基本語法知識介紹完畢!還剩verilog的靈魂---狀態機,下面關於verilog代碼的推文講,下面看一個簡單的小程序,理解一下上面的語法知識。
//定義輸入輸出埠
module led_twinkle(
input sys_clk ,
input sys_rst_n ,
output [1:0] led
);
reg [25:0] cnt; //定義一個26位計數器
assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10; //使用條件運算符的輸出部分
//時序邏輯電路,實現計數器功能
always @(posedge sys_clk , negedge sys_rst_n)begin
if(!sys_rst_n)
cnt <= 26'd0;
else if(cnt < 5000_0000)
cnt <= cnt+1'b1;
else
cnt <= 26'd0;
end
endmodule
這是簡單的對應硬體的led程序,如果想熟希verilog代碼,找些demo練手可以私信我要原始碼。在後面的推文中也可能會陸續發出。