日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Verilog HDL 语法整理 (一)

發布時間:2023/12/20 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 的程序結構位于 moduleendmodule 之間,每個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 在語法上完全一致。三態門驅動的硬件連線用此定義。

3supply1/supply0

表示上拉到邏輯1/邏輯0。用的很少,亦可作常數1/0來用。

4wand/triand

線與(wand、triand)一般用于集電極開路電路中。但是FPGA內部一般無OC門,基本不用此類型。

5wor/trior

FPGA內部一般此結構,線或一般不用。

6tri1/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 语法整理 (一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。