一、Verilog HDL 概述
1、Verilog HDL 是什么
Verilog HDL(Hardware Description Language)是一種硬件描述語言,用于從算法級、門級到開關(guān)級的多種抽象設(shè)計層次的數(shù)字系統(tǒng)建模?,F(xiàn)實生活中多用于專用集成電路(Application Specific Integrated Circuit,ASIC)和現(xiàn)場可編程門陣列(Field Programmabl Gate Array,FPGA)的實現(xiàn)。
2、Verilog HDL產(chǎn)生的背景
第一只晶體管出現(xiàn)后,數(shù)字集成電路設(shè)計密度越來越大、電路越來越復(fù)雜,傳統(tǒng)的畫圖或連線的設(shè)計方法已不再適用。
例如:設(shè)計4位移位寄存器,僅需簡短幾行代碼完成。
module register_four(
input clk,
input Reset,
input din,
output reg [3:0] qout
);
always @(posedge clk or posedge Reset)begin
if(Reset)
qout <= 4'b0;
else
qout <= {qout[2:0],din};
end
endmodule
若要將4位移位寄存器改為8位移位寄存器,僅需修改少量代碼。
module register_eight(
input clk,
input Reset,
input din,
output reg [7:0] qout
);
always @(posedge clk or posedge Reset)begin
if(Reset)
qout <= 8'b0000_0000;
else
qout <= {qout[6:0],din};
end
endmodule
由上例可直觀發(fā)現(xiàn),Verilog HDL可用較少的語句描述較為復(fù)雜的電路和靈活的可擴(kuò)展性,為數(shù)字集成電路設(shè)計帶來了極大的便捷。
3、Verilog HDL 和 VHDL的區(qū)別
目前,Verilog HDL 和 VHDL(VHSIC Hardware Description Language,VHSIC 為 Very High Speed Integrated Circuit)是最為常用的硬件描述語音。
Verilog HDL:
語法靈活、寬松,多被思維活躍的美國人采用。因Verilog HDL 語法寬松,其不適合對系統(tǒng)要求層次嚴(yán)格的大規(guī)模設(shè)計。
VHDL:
語法結(jié)構(gòu)緊湊、嚴(yán)謹(jǐn),多被思維歐洲人采用。VHDL在大規(guī)模數(shù)字集成電路設(shè)計中具有一定優(yōu)勢。
注:
Verilog基于C語言發(fā)展而來,語法靈活、寬松,且國內(nèi)開發(fā)人員多采用Verilog,對初學(xué)者較為友好。
二、Verilog HDL 基礎(chǔ)知識
1、Verilog HDL 語言要素
1.1、命名規(guī)則
在Verilog HDL 中,標(biāo)識符背用來命名信號、模塊、參數(shù)等,它可以是任意一組字母、數(shù)字、$符號和_(下劃線)符號的組合。
注:標(biāo)識符中字母區(qū)分大小寫,且第一個字必須是字母或下劃線。
1.2、注釋符
單行注釋:單行注釋以“//”開始,Verilog HDL忽略此處到行尾的內(nèi)容。
多行注釋:多行注釋采用“/**/”,從“/”開始,到“/”結(jié)束,Verilog HDL忽略其中注釋的內(nèi)容。
注:多行注釋不允許嵌套,但單行注釋可以嵌套在多行注釋中。
例如:
非法多行注釋:
/*注釋內(nèi)容/*多行注釋嵌套多行注釋*/注釋內(nèi)容*/
合法多行注釋:
/*注釋內(nèi)容//多行注釋嵌套單行注釋*/
1.3、關(guān)鍵字
Verilog HDL 內(nèi)部已經(jīng)使用的詞成為關(guān)鍵字或保留字,是事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu)。
注:Verilog HDL中所有的關(guān)鍵字都是小寫的。
1.4、數(shù)值
Verilog HDL 有四種基本的電平邏輯數(shù)值狀態(tài),用數(shù)字或字符表達(dá)數(shù)字電路中傳送的邏輯狀態(tài)和存儲信息。Verilog HDL邏輯數(shù)值中,“x”和“z”都不區(qū)分大小寫,即0x1z與0X1Z等價。
在數(shù)值中,下劃線符號“_”除不能放于首位外,可隨意用在整數(shù)與實數(shù)中,對數(shù)值的大小無影響,僅為提高可讀性。
例如:
8’b00110010 與8’b0011_0010的數(shù)值大小相等。
1.4.1、整數(shù)及其表示
整數(shù)的表示形式:
+/-
(1)“+/-”:正數(shù)和負(fù)數(shù)的標(biāo)識。
(2)size:換算過后二進(jìn)制的寬度。
(3)“ ’ ”:為基數(shù)格式表示固有字符,該字符不能缺省,否則為非法表示形式。
(4)base_format:基數(shù)符號。
(5)number:可使用的數(shù)字字符集。
例如:
4'b0011
7'd32
8'hfd
1.4.2、實數(shù)及其表示
(1)十進(jìn)制表示法。
(2)科學(xué)計數(shù)發(fā)。例如:758.4e2 的值為75840.0,3e-3的值為0.003。
1.4.3、字符串及其表示
注:字符串必須包含在同一行中,不能分行書寫。
字符串在Verilog HDL中看做8位的ASCII值序列,即一個字符對應(yīng)8位的ASCII值。
2、數(shù)據(jù)類型
按抽象程度 Verilog HDL數(shù)據(jù)類型可分為:物理數(shù)據(jù)類型(主要包括線網(wǎng)型及寄存器型)和抽象數(shù)據(jù)類型(主要包括整數(shù)型、時間型、實數(shù)型及參數(shù)型)。抽象數(shù)據(jù)類型主要用于輔助設(shè)計和驗證。
2.1、線網(wǎng)型(wire)
wire 類型表示硬件單元之間的物理連線,由其連接的器件輸出端連續(xù)驅(qū)動。如果沒有驅(qū)動元件連接到 wire 型變量,缺省值一般為 “Z”。對wire 類型賦值用“assign”。
例如:
wire data_out ;
wire flag ;
assign data_out = data_in ;
assign flag = 1'b1 ;
2.2、寄存器型(reg)
reg 用來表示存儲單元,它的數(shù)據(jù)會保持最后一次賦值,直到被改寫。reg 默認(rèn)初始值為不定值“x”,缺省是數(shù)據(jù)位寬為1位。reg 一般為無符號數(shù),若將一個負(fù)數(shù)賦值給 reg 型變量,則制動轉(zhuǎn)換其二進(jìn)制補碼形式。
例如:
reg data0;
reg data1;
reg [4:0] data2;
2.3、存儲器型(memory)
存儲器型本質(zhì)上還是寄存器型變量陣列,可以描述RAM型、ROM型存儲器以及reg文件。存儲器中的每一個單元通過索引進(jìn)行尋址。
聲明格式:
reg
(1) range1:存儲器中寄存器的位寬,缺省,時為1,格式為[msb:lsb]。
(2)range2:寄存器的個數(shù),缺省時為1,格式為[msb:lsb]。
(3)name_of_register:變量名稱列表,一次可以定義多個名稱,之間用逗號分開。
例如:
reg [7:0] mem1[255:0];//定義了一個有256個8位的存儲器
reg [15:0] mem2[127:0],reg1,reg2;//定義了一個具有128個16位的寄存器mem2
//2個16位的寄存器reg1和reg2
mem1[2] = 0; //給mem1存儲器中的第三個存儲單元賦值為0
2.4、整數(shù)型(integer)
整數(shù)類型用關(guān)鍵字 integer 來聲明。聲明時不用指明位寬,位寬和編譯器有關(guān),一般為32 bit。reg 型變量為無符號數(shù),而 integer 型變量為有符號數(shù)。
例如:
reg [31:0] data1 ;
reg [3:0] byte1 [7:0]; //數(shù)組變量,后續(xù)介紹
integer j ; //整型變量,用來輔助生成數(shù)字電路
always@* begin
for (j=0; j<=3;j=j+1) begin
byte1[j] = data1[(j+1)*8-1 : j*8]; //把data1[7:0]…data1[31:24]依次賦值給byte1[0][7:0]…byte[3][7:0]
end
end
2.5、時間型(time)
Verilog 使用特殊的時間寄存器 time 型變量,對仿真時間進(jìn)行保存。其寬度一般為 64 bit,通過調(diào)用系統(tǒng)函數(shù) $time 獲取當(dāng)前仿真時間。
例如
time current_time ;
initial begin
#100 ;
current_time = $time ; //current_time 的大小為 100
end
2.6、實數(shù)型(real)
實數(shù)用關(guān)鍵字 real 來聲明,可用十進(jìn)制或科學(xué)計數(shù)法來表示。實數(shù)聲明不能帶有范圍,默認(rèn)值為 0。如果將一個實數(shù)賦值給一個整數(shù),則只有實數(shù)的整數(shù)部分會賦值給整數(shù)。
例如:
real data1 ;
integer temp ;
initial begin
data1 = 2e3 ;
data1 = 3.75 ;
end
initial begin
temp = data1 ; //temp 值的大小為3
end
2.7、參數(shù)型
參數(shù)用來表示常量,用關(guān)鍵字parameter聲明,只能賦值一次,但可通過實例化的方式更改參數(shù)在模塊中的值。局部參數(shù)用localparam聲明,其作用和用法與parameter相同,區(qū)別在于它的值不能改變。所以當(dāng)參數(shù)在本模塊中調(diào)用時,可以用localparam來說明。
3、運算符
3.1、算術(shù)運算符
Verilog HDL中常用的算術(shù)運算符主要有五種,分別是加法(+)、減法(-)、乘法(*)、除法(/)和取模(%)。
注:
算術(shù)表達(dá)式結(jié)果的長度由最長的操作數(shù)決定。在賦值語句下,算術(shù)結(jié)果的長度由等號操作符左端的目標(biāo)長度決定。
3.2、關(guān)系運算符
關(guān)系運算符也是雙目運算符,是對兩個操作數(shù)的大小進(jìn)行比較。關(guān)系運算符有大于(>)、小于(<)、大于等于(>=)和小于等于(<=)幾種。
3.3、相等關(guān)系運算符
相等關(guān)系運算符是對兩個操作數(shù)進(jìn)行比較,比較結(jié)果有三種,即真(1)、假(0)和不定值(x)。Verilog HDL 中有四種相等關(guān)系運算符:等于(==)、不等于(!=)、全等(===)、非全等(!==)。
3.4、邏輯運算符
邏輯運算符有三種,分別為邏輯與(&&)、邏輯或(||)、邏輯非(?。F渲羞壿嬇c、邏輯或是雙目運算符,邏輯非為單目運算符。
3.5、按位運算符
Verilog HDL 提供了五種類型位運算符:按位取反(~)、按位與(&)、按位或(|)、按位異或(^ )、按位同或(^~),按位運算符對其自變量的每一位進(jìn)行操作。
3.6、歸約運算符
歸約操作符包括:歸約與(&),歸約與非(~&),歸約或(|),歸約或非(~|),歸約異或(^),歸約同或(~^)。歸約操作符只有一個操作數(shù),它對這個向量操作數(shù)逐位進(jìn)行操作,最終產(chǎn)生一個 1bit 結(jié)果。邏輯操作符、按位操作符和歸約操作符都使用相同的符號表示,因此有時候容易混淆。區(qū)分這些操作符的關(guān)鍵是分清操作數(shù)的數(shù)目,和計算結(jié)果的規(guī)則。
例如:
A = 4'b1010 ;
&A ; //結(jié)果為 1 & 0 & 1 & 0 = 1'b0,可用來判斷變量A是否全1
~|A ; //結(jié)果為 ~(1 | 0 | 1 | 0) = 1'b0, 可用來判斷變量A是否為全0
^A ; //結(jié)果為 1 ^ 0 ^ 1 ^ 0 = 1'b0
3.7、移位運算符
移位操作符包括左移(<<),右移(>>),算術(shù)左移(<<<),算術(shù)右移(>>>)。移位操作符是雙目操作符,兩個操作數(shù)分別表示要進(jìn)行移位的向量信號(操作符左側(cè))與移動的位數(shù)(操作符右側(cè))。算術(shù)左移和邏輯左移時,右邊低位會補 0。邏輯右移時,左邊高位會補 0;而算術(shù)右移時,左邊高位會補充符號位,以保證數(shù)據(jù)縮小后值的正確性。
A = 4'b1100 ;
B = 4'b0010 ;
A = A >> 2 ; //結(jié)果為 4'b0011
A = A << 1; ? ? ? ? //結(jié)果為 4'b1000
A = A <<< 1 ; ? ? ? //結(jié)果為 4'b1000
C = B + (A>>>2); //結(jié)果為 2 + (-4/4) = 1, 4'b0001
3.8、連接運算符
拼接操作符用大括號 {,} 來表示,用于將多個操作數(shù)(向量)拼接成新的操作數(shù)(向量),信號間用逗號隔開。拼接符操作數(shù)必須指定位寬,常數(shù)的話也需要指定位寬。
例如:
A = 4'b1010 ;
B = 1'b1 ;
Y1 = {B, A[3:2], A[0], 4'h3 }; //結(jié)果為Y1='b1100_0011
Y2 = {4{B}, 3'd4}; //結(jié)果為 Y2=7'b111_1100
Y3 = {32{1'b0}}; //結(jié)果為 Y3=32h0,常用作寄存器初始化時匹配位寬的賦初值
-
FPGA
+關(guān)注
關(guān)注
1637文章
21848瀏覽量
608769 -
寄存器
+關(guān)注
關(guān)注
31文章
5393瀏覽量
121988 -
Verilog
+關(guān)注
關(guān)注
28文章
1356瀏覽量
110911 -
晶體管
+關(guān)注
關(guān)注
77文章
9848瀏覽量
139577 -
HDL
+關(guān)注
關(guān)注
8文章
329瀏覽量
47573
原文標(biāo)題:Verilog HDL 入門教程
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Verilog HDL詳細(xì)資料合集!
Verilog-HDL實踐與應(yīng)用系統(tǒng)設(shè)計

Verilog HDL華為入門教程
什么是Verilog HDL?

Verilog HDL程序基本結(jié)構(gòu)與程序入門
Verilog HDL語言簡介
Verilog_HDL的基本語法詳解(夏宇聞版)

詳解Verilog HDL數(shù)字設(shè)計與綜合 夏宇聞譯(第二版)
Verilog HDL入門教程
Verilog HDL入門教程之Verilog HDL數(shù)字系統(tǒng)設(shè)計教程

Verilog HDL入門教程

Verilog HDL的基礎(chǔ)知識詳細(xì)說明

評論