本節主要講解了 Verilog 的基礎知識,包括 7 個小節,下面我們分別給大家介紹這 7 個小節的內容。
1.Verilog 的邏輯值
我們先看下邏輯電路中有四種值,即四種狀態:
邏輯 0:表示低電平,也就是對應我們電路的 GND;
邏輯 1:表示高電平,也就是對應我們電路的 VCC;
邏輯 X:表示未知,有可能是高電平,也有可能是低電平;
邏輯 Z:表示高阻態,外部沒有激勵信號是一個懸空狀態。
如下圖所示:
2.Verilog 的標識符
定義 :
標識符(identifier)用于定義模塊名、端口名和信號名等。Verilog 的標識符可以是任意一組字母、數字、$和_(下劃線)符號的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。以下是標識符的幾個例子:
Count,COUNT //與 Count 不同,R56_68,FIVE$;
雖然標識符寫法很多,但是要簡潔、清晰、易懂,推薦寫法如下:
Count,fifo_wr
不建議大小寫混合使用,普通內部信號建議全部小寫,參數定義建議大寫,另外信號命名最好體現信 號的含義。
規范建議 :
以下是一些書寫規范的要求:
2、用下劃線區分詞語組合,如 cpu_addr。
3、采用一些前綴或后綴,比如:時鐘采用 clk 前綴:clk_50m,clk_cpu;低電平采用_n 后綴:enable_n;
4、統一縮寫,如全局復位信號 rst。
5、同一信號在不同層次保持一致性,如同一時鐘信號必須在各模塊保持一致。
6、自定義的標識符不能與保留字(關鍵詞)同名。
7、參數統一采用大寫,如定義參數使用SIZE。
3.Verilog 的數字進制格式
Verilog 數字進制格式包括二進制、八進制、十進制和十六進制,一般常用的為二進制、十進制和十六 進制。
二進制表示如下:4’b0101 表示 4 位二進制數字 0101;十進制表示如下:4’d2 表示 4 位十進制數字 2(二進制 0010);十六進制表示如下:4’ha 表示 4 位十六進制數字 a(二進制 1010),十六進制的計數方式為 0,1,2…9,a,b,c,d,e,f,最大計數為 f(f:十進制表示為 15)。當代碼中沒有指定數字的位寬與進制時,默認為 32 位的十進制,比如 100,實際上表示的值為 32’d100。
4.Verilog 的數據類型
在 Verilog 語法中,主要有三大類數據類型,即寄存器類型、線網類型和參數類型。從名稱中,我們可 以看出,真正在數字電路中起作用的數據類型應該是寄存器類型和線網類型。
1) 寄存器類型
寄存器類型表示一個抽象的數據存儲單元,它只能在 always 語句和 initial 語句中被賦值,并且它的值從一個賦值到另一個賦值過程中被保存下來。如果該過程語句描述的是時序邏輯,即 always 語句帶有時鐘信號,則該寄存器變量對應為寄存器;如果該過程語句描述的是組合邏輯,即 always 語句不帶有時鐘信號,則該寄存器變量對應為硬件連線;寄存器類型的缺省值是 x(未知狀態)。寄存器數據類型有很多種,如 reg、integer、real 等,其中最常用的就是 reg 類型,它的使用方法如下:
//reg define reg [31:0] delay_cnt; //延時計數器 reg key_flag ; //按鍵標志 |
2) 線網類型
線網表示 Verilog 結構化元件間的物理連線。它的值由驅動元件的值決定,例如連續賦值或門的輸出。如果沒有驅動元件連接到線網,線網的缺省值為 z(高阻態)。線網類型同寄存器類型一樣也是有很多種,如 tri 和 wire 等,其中最常用的就是 wire 類型,它的使用方法如下:
//wire define wire data_en; //數據使能信號 wire [7:0] data ; //數據 |
3) 參數類型
我們再來看下參數類型,參數其實就是一個常量,常被用于定義狀態機的狀態、數據位寬和延遲大小等,由于它可以在編譯時修改參數的值,因此它又常被用于一些參數可調的模塊中,使用戶在實例化模塊時,可以根據需要配置參數。在定義參數時,我們可以一次定義多個參數,參數與參數之間需要用逗號隔開。這里我們需要注意的是參數的定義是局部的,只在當前模塊中有效。它的使用方法如下:
//parameter define parameter DATA_WIDTH =8; //數據位寬為8位 |
5.Verilog 的運算符
大家看完了 Verilog 的數據類型,我們再來介紹下 Verilog 的運算符。Verilog 中的運算符按照功能可以分為下述類型:1、算術運算符、 2、關系運算符、3、邏輯運算符、 4、條件運算符、 5、位運算符、 6、移位運算符、 7、拼接運算符。下面我們分別對這些運算符進行介紹。
1) 算術運算符
算術運算符,簡單來說,就是數學運算里面的加減乘除,數字邏輯處理有時候也需要進行數字運算,所以需要算術運算符。常用的算術運算符主要包括加減乘除和模除(模除運算也叫取余運算)如下表所示:
大家要注意下,Verilog 實現乘除比較浪費組合邏輯資源,尤其是除法。一般 2 的指數次冪的乘除法使用移位運算來完成運算,詳情可以看移位運算符章節。非 2 的指數次冪的乘除法一般是調用現成的 IP, QUARTUS/ISE 等工具軟件會有提供,不過這些工具軟件提供的 IP 也是由最底層的組合邏輯(與或非門等)搭建而成的。
2) 關系運算符
關系運算符主要是用來做一些條件判斷用的,在進行關系運算符時,如果聲明的關系是假的,則返回值是 0,如果聲明的關系是真的,則返回值是 1;所有的關系運算符有著相同的優先級別,關系運算符的優先級別低于算術運算符的優先級別如下表所示。
3) 邏輯運算符
邏輯運算符是連接多個關系表達式用的,可實現更加復雜的判斷,一般不單獨使用,都需要配合具體語句來實現完整的意思,如下表所示。
4) 條件運算符
條件操作符一般來構建從兩個輸入中選擇一個作為輸出的條件選擇結構,功能等同于 always 中的 if-else 語句,如下表所示。
5) 位運算符
位運算符是一類最基本的運算符,可以認為它們直接對應數字邏輯中的與、或、非門等邏輯門。常用 的位運算符如下表所示。
位運算符的與、或、非與邏輯運算符邏輯與、邏輯或、邏輯非使用時候容易混淆,邏輯運算符一在條件判斷上,位運算符一般用在信號賦值上。
6) 移位運算符
移位運算符包括左移位運算符和右移位運算符,這兩種移位運算符都用 0 來填補移出的空位。如下表所示。
假設 a 有 8bit 數據位寬,那么 a<<2,表示 a 左移 2bit,a 還是 8bit 數據位寬,a 的最高 2bit 數據被移位丟棄了,最低 2bit 數據固定補 0。如果 a 是 3(二進制:00000011),那么 3 左移 2bit,3<<2,就是 12(二進制:00001100)。一般使用左移位運算代替乘法,右移位運算代替除法,但是這種也只能表示 2 的指數次冪的乘除法。
7) 拼接運算符
Verilog 中有一個特殊的運算符是 C 語言中沒有的,就是位拼接運算符。用這個運算符可以把兩個或多個信號的某些位拼接起來進行運算操作。如下表所示。
8) 運算符的優先級
介紹完了這么多運算符,大家可能會想到究竟哪個運算符高,哪個運算符低。為了便于大家查看這些 運算符的優先級,我們將它們制作成了表格,如下表所示。
6.注釋
Verilog HDL 中有兩種注釋的方式,一種是以“/*”符號開始,“*/”結束,在兩個符號之間的語句都是注釋語句,因此可擴展到多行。如:
/*statement1 ,
statement2,
......
statementn */
以上 n 個語句都是注釋語句。
另一種是以//開頭的語句,它表示以//開始到本行結束都屬于注釋語句。如:
//statement1
建議的寫法:使用//作為注釋。
7.關鍵字
Verilog 和 C 語言類似,都因編寫需要定義了一系列保留字,叫做關鍵字(或關鍵詞)。這些保留字是識別語法的關鍵。我們給大家列出了 Verilog 中的關鍵字,如下表所示。
雖然上表列了很多,但是實際經常使用的不是很多,實際經常使用的主要如下表所示。
注意只有小寫的關鍵字才是保留字。例如,標識符 always(這是個關鍵詞)與標識符 ALWAYS(非關鍵詞)是不同的。
審核編輯:湯梓紅
-
Verilog
+關注
關注
28文章
1351瀏覽量
110074 -
標識符
+關注
關注
0文章
12瀏覽量
7339 -
GND
+關注
關注
2文章
539瀏覽量
38696
原文標題:七步來學習掌握Verilog 基礎知識
文章出處:【微信號:IC學習,微信公眾號:IC學習】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論