Verilog HDL 语法整理 (一)
目錄
導(dǎo)讀
一、模塊結(jié)構(gòu)
????????1、模塊的端口定義
????????2、模塊內(nèi)容
二、數(shù)據(jù)類型
1、常量
2、參量
3、變量
?1、寄存器數(shù)據(jù)類型
2、線網(wǎng)型數(shù)據(jù)類型
參考聲明
導(dǎo)讀
????????本篇博文主要介紹Verilog HDL 語法的基本框架和數(shù)據(jù)類型、常量變量等。
????????推薦PC端或者pad端食用~~
一、模塊結(jié)構(gòu)
????????以一個(gè)簡單的組合邏輯的例子進(jìn)行示例說明,給出模塊的模板:
//********************************** 文 件 說 明 **********************************\// 版本:0.0 //設(shè)計(jì)日期:2021 09 15 // 作者:在路上,正出發(fā)//功能說明:作語法示例//相關(guān)參考://*********************************************************************************\//********************************** 代 碼 部 分 **********************************\`timescale 1ns/1psmodule module_example #(//*************---------------------- 參數(shù)列表 --------------------------**********\parameter ADDER_WIDTH = 2'd3, parameter SUM_WIDTH = 3'd4 //各 parameter 之間以逗號(hào)隔開 且 最后一個(gè) parameter 后面無 逗號(hào))(//*************-------------------- 輸入端口列表 -----------------------***********\input [ADDER_WIDTH-1:0] I_ADD1, input [ADDER_WIDTH-1:0] I_ADD2,//*************-------------------- 輸出端口列表 -----------------------***********\output [SUM_WIDTH-1:0] O_SUM_RES //各 output 之間以逗號(hào)隔開 且 最后一個(gè) output 后面無 逗號(hào) );//*************-------------------- 內(nèi)部參數(shù)定義 ----------------------************\//*************-------------------- 內(nèi)部信號(hào)定義 ----------------------************\//*************------------------- 模塊的程序設(shè)計(jì) ---------------------************\assign O_SUM_RES = I_ADD1+I_ADD2;endmodule//*********************************************************************************\????????Verilog HDL 的程序結(jié)構(gòu)位于 module 和 endmodule 之間,每個(gè)Verilog 程序主要包括四個(gè)部分:IO端口定義、聲明、內(nèi)部參數(shù)和信號(hào)定義、功能定義。
????????1、模塊的端口定義
? ? ? ? 建議在進(jìn)行端口聲明時(shí)直接定義其類型(輸入、輸出、雙端口),如上例所示。這樣簡單明了。
? ? ? ? 模塊端口不加特殊聲明 默認(rèn) wire 類型,模塊端口的輸出端可以定義為 reg 類型。如果直接將 always 塊內(nèi)的輸出直接送到輸出端口 那么輸出必須定義為 reg 類型 ,這是語法要求,否則會(huì)報(bào)錯(cuò)。
? ? ? ? 端口的 位寬默認(rèn)是 1位,當(dāng)需要多位時(shí)就需要指定位寬,如:output reg [11 : 0]? O_RES 。一般都是左邊是高位,右邊是低位,當(dāng)然也可以反過來寫成:output reg [0?: 11]? O_RES 為了方便設(shè)計(jì),一般都是選擇前者。
? ? ? ? 頂層模塊調(diào)用底層模塊,對(duì)應(yīng)端口連接時(shí)有兩種方式:
1、引用端口的順序和所聲明端口的順序嚴(yán)格對(duì)應(yīng)。這種方法使用較少。
2、引用端口時(shí)用 英文 "." 來引用原模塊的端口名,這種方法最為常用,尤其在端口數(shù)目多的時(shí)候:
module_example #(.ADDER_WIDTH(ADDER_WIDTH),.SUM_WIDTH(SUM_WIDTH)) inst_module_example (.I_ADD1 (I_ADD1),.I_ADD2 (I_ADD2),.O_SUM_RES (O_SUM_RES));????????2、模塊內(nèi)容
? ? ? ? 此部分也即模塊的實(shí)現(xiàn)部分,主要包括中間變量或模塊內(nèi)部信號(hào)的聲明和邏輯設(shè)計(jì)。
? ? ? ? 1、內(nèi)部信號(hào)或者參數(shù)的聲明:
? ? ? ? ? ? ? ? 內(nèi)部信號(hào)的聲明主要就是 wire 、reg 型的聲明。內(nèi)部參數(shù)(非模塊傳輸參數(shù))可以用 localparam 進(jìn)行聲明。
? ? ? ? 2、邏輯設(shè)計(jì):
? ? ? ? ? ? ? ? 邏輯設(shè)計(jì)包括模塊調(diào)用和程序塊。模塊調(diào)用的方式上面有例子說明。程序塊中主要是 組合邏輯和時(shí)序邏輯。最常用到的語句塊就是 always 語句塊。
always 語句塊的總體結(jié)構(gòu):
always @ (<敏感向量表>)begin<邏輯描述>;end對(duì)于 always 塊實(shí)現(xiàn)純組合邏輯,敏感向量表應(yīng)該是 該邏輯塊所有的輸入信號(hào) ,以英文 逗號(hào) 隔開。
對(duì)于 always 塊實(shí)現(xiàn)純同步時(shí)序邏輯,敏感向量表應(yīng)該是 時(shí)鐘信號(hào)的邊沿。
對(duì)于 always 塊實(shí)現(xiàn)純異步時(shí)序邏輯,敏感向量表應(yīng)該是 時(shí)鐘信號(hào)的邊沿 和 復(fù)位信號(hào)的邊沿。
注意:某些語句只能在 always 語句塊內(nèi) 使用 比如 if-else
? ? ? ? ? ? ? ? 除了always語句塊,還有常用的連續(xù)賦值語句 assign?,該語句只對(duì)線網(wǎng)型變量賦值。線網(wǎng)型變量一般對(duì)應(yīng)到 FPGA 內(nèi)部是一段連線 ,連線的值會(huì)隨著驅(qū)動(dòng)源變化而不斷變化。
二、數(shù)據(jù)類型
1、常量
首先介紹Verilog HDL 語法的四值系統(tǒng):
邏輯1:高電平;
邏輯0:低電平;
不確定邏輯X:未知電平,一般由于賦值沖突造成;
高阻邏輯Z:高阻態(tài),相當(dāng)于電路開路;
二進(jìn)制表示法:< 二進(jìn)制位寬 > ' b < 二進(jìn)制數(shù) > (B 、b 均可) 例:8‘b0011_1001
? ? ? ? 注意:可以賦值 高阻態(tài) Z(z 或 ?) ,但不可以賦值 不定態(tài) X (x)。當(dāng)二進(jìn)制位寬過大時(shí),可以用下劃線分割開,便于查看,下劃線處于數(shù)字之間。
八進(jìn)制表示法:< 二進(jìn)制位寬 > ' o?< 八進(jìn)制數(shù) > (O 、o 均可) 例:6‘o71
? ? ? ? 注意:八進(jìn)制賦值,經(jīng)常出現(xiàn)位寬不匹配的情況,編譯器會(huì)將高位截?cái)唷M瑯又С窒聞澗€表示法。支持高阻態(tài)。
十六進(jìn)制表示法:< 二進(jìn)制位寬 > ' h?< 十六進(jìn)制數(shù) > (H 、h 均可) 例:8‘h39
? ? ? ? 注意:支持下劃線表示法。支持高阻態(tài)。
十進(jìn)制表示法:< 二進(jìn)制位寬 > ' d?< 十進(jìn)制數(shù) > (D 、d 均可) 例:8‘d39
? ? ? ? 注意:十進(jìn)制數(shù)不要超過位寬的表示范圍。支持高阻態(tài),但是只有一個(gè)Z(z),如8'dz。負(fù)數(shù)的 常量表達(dá)式注意:-8'd100? 而不是 8'd-100。
2、參量
? ? ? ? parameter? :Verilog HDL 語法中,常用 parameter 來定義常量。從而提高程序的可讀性和代碼可維護(hù)性。可以聲明在模塊接口部分(如文章開頭的示例代碼);也可以聲明在模塊內(nèi)部。在模塊接口處使用 parameter 可以實(shí)現(xiàn)模塊的復(fù)用,在模塊的例化時(shí)可以重新給定 parameter 的數(shù)值(如? 模塊端口的定義小節(jié)? 的例子),這給模塊的設(shè)計(jì)帶來很大的靈活性。
? ? ? ? 語法:parameter? ?<參量名>? ?=? ?<常量表達(dá)式> ;
? ? ? ? localparam:使用方法與 parameter 基本一致,不同的是,localparam 只能用在模塊內(nèi)部,不能實(shí)現(xiàn)參量復(fù)用。
? ? ? ? 語法:localparam? ?<參量名>? ?=? ?<常量表達(dá)式> ;
? ? ? ? specparam:specify 語法塊中,定義模塊的時(shí)序模型,為了區(qū)別于module內(nèi)的參數(shù),使用關(guān)鍵字:specify。(使用極少,模塊設(shè)計(jì)基本用不到)
? ? ? ? 語法:specparam? ?<參量名>? ?=? ?<常量表達(dá)式> ;
3、變量
?1、寄存器數(shù)據(jù)類型
? ? ? ? Verilog HDL 語法中,凡是在 程序塊?中被賦值的信號(hào)(變量)必須為寄存器類型。但是未必在實(shí)際電路中就是寄存器。如果程序塊中描述的是組合邏輯則,實(shí)際電路中寄存類型變量對(duì)應(yīng)硬件連線;如果描述的是時(shí)序邏輯,實(shí)際電路中寄存器類型的變量對(duì)應(yīng)寄存器;對(duì)于組合時(shí)序邏輯混合的程序塊,實(shí)際電路中寄存器類型的變量可能對(duì)應(yīng)鎖存器。
1、reg
reg型變量是寄存器類型中用的最多的,具體語法:reg? ? <位寬范圍>? ?<變量名>? ?<變量數(shù)目范圍>;
示例:reg? [15:0]? R_COUNTER [512:1]; //512個(gè)16位的reg型數(shù)據(jù)空間
? ? ? ? ? ?reg? [3:0]? ? R_1,R_2,R_3;
? ? ? ? ? ?reg? R_VALID;
2、integer
整數(shù)類型,位寬等于32;實(shí)際設(shè)計(jì)時(shí)除了仿真,一般不用 integer 進(jìn)行設(shè)計(jì)。具體語法:integer? <變量名>;
示例:integer? K;?
3、real
實(shí)數(shù)類型,抽象級(jí)別高,一般都不建議使用該類型。
2、線網(wǎng)型數(shù)據(jù)類型
? ? ? ? 模塊的輸入接口(input)、雙端口(inout)必須為線網(wǎng)類型,連續(xù)賦值的對(duì)象為線網(wǎng)類型。實(shí)際電路中,線網(wǎng)類型對(duì)應(yīng)硬件連線。
1、wire
wire 是線網(wǎng)類型中最最常用的一種類型。語法:wire? ?<位寬范圍>? ?<變量名>? ??<變量數(shù)目范圍>;
示例:wire? [15:0]? W_COUNTER? [1024:1];//1024個(gè)16位寬的 wire 型數(shù)據(jù)
? ? ? ? ? ?wire? [3:0]? ? W_1,W_2,W_3;
? ? ? ? ? ?wire? W_VALID;
2、tri
tri 用法和 wire 在語法上完全一致。三態(tài)門驅(qū)動(dòng)的硬件連線用此定義。
3、supply1/supply0
表示上拉到邏輯1/邏輯0。用的很少,亦可作常數(shù)1/0來用。
4、wand/triand
線與(wand、triand)一般用于集電極開路電路中。但是FPGA內(nèi)部一般無OC門,基本不用此類型。
5、wor/trior
FPGA內(nèi)部一般此結(jié)構(gòu),線或一般不用。
6、tri1/tri0/trireg
分別表示高阻態(tài)時(shí),可以進(jìn)行上拉、下拉、保持之前邏輯。一般不用。
參考聲明
【1】夏宇聞. Verilog 數(shù)字系統(tǒng)設(shè)計(jì)教程 第二版.
【2】狄超. FPGA之道.
【3】IEEE Standard for Verilog Hardware Description Language 1364-2005.
博文聲明:整理時(shí)間有限,如有發(fā)現(xiàn)任何紕漏,及時(shí)私信我更正~
文末推薦
掌握了基本的Verilog語法,不去實(shí)戰(zhàn)練習(xí)的話很難有大的突破。牛客網(wǎng)可以為大家提供一個(gè)免費(fèi)的刷題練習(xí)的平臺(tái)。非常推薦大家使用。
?鏈接如下:牛客網(wǎng)-Verilog專項(xiàng)https://www.nowcoder.com/link/pc_csdncpt_zls_verilog這個(gè)里面有很多代碼題目練習(xí),對(duì)于新手來說可以快速掌握Verilog編程的基本語法,對(duì)于老手來說也可以鞏固自己的編程能力。不用付費(fèi)免費(fèi)試用哦。基本是每個(gè)即將找工作的人必備的刷題網(wǎng)站。快行動(dòng)起來吧!
總結(jié)
以上是生活随笔為你收集整理的Verilog HDL 语法整理 (一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rtmp推流服务器搭建
- 下一篇: 链表倒数第k个结点