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