伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog HDL語法學習筆記

FPGA技術江湖 ? 來源:FPGA技術江湖 ? 2026-03-04 15:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大俠好,歡迎來到FPGA技術江湖,江湖偌大,相見即是緣分。大俠可以關注FPGA技術江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。

今天給大俠帶來Verilog HDL 語法學習筆記,話不多說,上貨。

關于詳細的VHDL語法以及Verilog HDL語法可參見往期文章。

一周掌握 FPGA VHDL Day 7 暨匯總篇

一周掌握FPGA Verilog HDL語法 匯總篇

Verilog HDL 語法學習筆記

一、Verilog HDL 簡介

1.1 Verilog HDL 的歷史

Verilog HDL 語 言 最 初 是 作為 Gateway Design Automation 公 司 ( Gateway DesignAutomation 公司后來被著名的 Cadence Design Systems 公司收購)模擬器產品開發的硬件建模語言。

開始 Verilog HDL 只是一種專用語言,隨著 Gateway Design Automation 公司模擬、仿真器產品的廣泛使用,Verilog HDL 便于使用、實用的語言逐漸為眾多設計者所接受。1995年 Verilog HDL 正式成為 IEEE 標準,稱為 IEEE Std 1364-1995。

1.2 Verilog HDL 的特點

Verilog HDL 語言不僅定義了語法,而且對每個語法結構都定義了清晰的模擬、仿真語義。使用這種語言編寫的模型可以方便地使用 Verilog 仿真器進行驗證。Verilog HDL 從 C 語言中繼承了多種操作符和結構。Verilog HDL 提供了擴展的建模能力和擴展模塊。Verilog HDL 語言的核心子集非常易于學習和使用,這對大多數建模應用來說已經足夠。

Verilog HDL 之所以成為和 VHDL 并駕齊驅的硬件描述語言,是因為它具有如下特點:

? 基本邏輯門和開關級基本結構模型都內置在語言中;

? 可采用多種方式對設計建模,這些方式包括行為描述方式、數據流方式、結構化方式;

? Verilog HDL 中有線網(Wire)數據類型和寄存器(Reg)數據類型兩類數據類型,線網類型表示構件間的物理連線,而寄存器類型表示抽象的數據存儲元件;

? 能夠描述層次設計,可使用模塊實例結構描述任何層次;

? 設計的規模可以是任意的,語言不對設計的規模大小施加任何限制;

? Verilog HDL 不再是某些公司的專有語言而是 IEEE 標準;

? Verilog HDL 語言的描述能力能夠通過使用編程語言接口(Programme LanguageInterface,簡稱 PLI)機制進一步擴展,PLI 允許外部函數訪問 Verilog 模塊內信息、允許設計者與模擬器交互的例程集合;

? 設計能夠在多個層次上加以描述,從開關級、門級、寄存器傳送級(RT L)到算法級,包括進程和隊列級;

? Verilog HDL 能夠監控模擬驗證的執行,即模擬驗證執行過程中設計的值能夠被監控和顯示,這些值也能夠用于與期望值比較,在不匹配的情況下打印報告消息。

二、Verilog HDL 程序基本結構

模塊是 Verilog 的基本描述單位,描述某個設計的功能或結構及其與其他模塊通信的外部端口。一個模塊的基本語法如下:

modulemodule_name//模塊名稱
 (port_list);//輸入輸出信號列表
//說明
 reg//寄存器
 wire//線網
 parameter//參數
 input//輸入信號
 output//輸出信號
 inout//輸入輸出信號
function//函數
 task//任務
 . . .//語句
Initialstatement
Alwaysstatement
Moduleinstantiation//
Gateinstantiation//
UDPinstantiation//
Continuousassignment//
endmodule

說明部分用于定義不同的項,例如模塊描述中使用的寄存器和參數、語句定義設計的功能和結構。說明部分和語句可以放置在模塊中的任何地方,但是變量、寄存器、線網和參數等的說明部分必須在使用前出現。為了使模塊描述清晰和具有良好的可讀性, 最好將所有的說明部分放在語句前。

圖 1 所示的是一個半加器。

c3c9fa12-15cb-11f1-90a1-92fbcf53809c.png

圖 1 半加器

這個半加器用 Verilog HDL 實現,代碼如下:

moduleHalfAdder(A,B,Sum,Carry);


 inputA,B;
  output Sum, Carry;


  assign#2 Sum = A ^ B;
  assign#5 Carry = A & B;


endmodule

模塊的名字是 HalfAdder。模塊有 4 個端口:兩個輸入端口 A 和 B,兩個輸出端口 Sum 和Carry。由于沒有定義端口的位數,所有端口大小都為 1 位;同時由于沒有各端口的數據類型說明,這 4 個端口都是線網數據類型。模塊包含兩條描述半加器數據流行為的連續賦值語句。從這種意義上講,這些語句在模塊中出現的順序無關緊要,因為這些語句是并發的。每條語句的執行順序依賴于發生在變量 A 和 B 上的事件。

三、Verilog HDL 語言的數據類型和運算符

本篇介紹 Verilog HDL 語言的基本要素,包括標識符、注釋、數值、編譯程序指令、系統任務和系統函數、兩種主要的數據類型。

3.1 標識符

Verilog HDL 中的標識符可以是任意一組字母、數字、$符號和_(下劃線)符號的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。以下是標識符的幾個例子:

Piero
PIERO / /與 Piero 不同。
_a1_b2
c00_68
ABC$

3.2 數據類型

Verilog HDL 有兩大類數據類型:

? 線網類型,表示 Verilog HDL 結構化元件間的物理連線,它的值由驅動元件的值決定,例如連續賦值或門的輸出,線網的缺省值為 z(高阻態);

? 寄存器類型,表示一個抽象的數據存儲單元,它只能在 always 語句和 initial 語句中被賦值,并且它的值被保存下來,缺省值為 x(未知狀態)。

1)線網類型

線網數據類型包含下述不同種類的線網子類型:wire、tri、wor、trior、wand、triand、trireg、tri1、tri0、supply0、supply1。簡單的線網類型說明語法為:

net_kind[msb:lsb]net1, net2, . . . , netN;

net_kind 是上述線網類型的一種。msb 和 lsb 是用于定義線網范圍的常量表達式,范圍定義是可選的;如果沒有定義范圍,缺省的線網類型為 1 位。下面是一個線網類型說明實例。

wireRdy,Start;//2 個 1 位的連線。
wand [2:0]Addr;//Addr 是 3 位線與。

2)寄存器類型

有 5 種不同的寄存器類型:reg、integer、time、real 和 realtime。寄存器數據類型 reg是最常見的數據類型。reg 類型使用保留字 reg 加以說明,形式如下:

reg[msb: lsb]reg1, reg2, . . . regN;

msb 和 lsb 定義了范圍,并且均為常數值表達式。范圍定義是可選的,如果沒有定義范圍,缺省值為 1 位寄存器。例如:

reg[3:0] Sat; //Sat 為4位寄存器。
regCnt; //1位寄存器。
reg[1:32] Kisp, Pisp, Lisp;

3.3 模塊端口

模塊端口是指模塊與外界交流信息的接口,包括 3 種:

? in:模塊通過這個接口從外界環境讀取數據,是不可寫的;

? out:模塊通過這個接口向外界環境輸出數據,是不可讀的;

? inout:模塊可以通過這個接口從外界環境讀取并輸出數據,數據可以雙向流通。

3.4 值集合

Verilog HDL 有下列 4 種基本的值:

? 0:邏輯 0 或“假”;

? 1:邏輯 1 或“真”;

? x:未知;

? z:高阻。

這 4 種值的解釋都內置于語言中。如一個為 z 的值總是意味著高阻抗,一個為 0 的值通常是指邏輯 0。在門的輸入或一個表達式中的為“z”的值通常解釋成“x”。此外,x 值和 z 值都是不分大小寫的。也就是說,值 0x1z 與值 0X1Z 相同。Verilog HDL 中的常量是由以上這四類基本值組成的。

Verilog HDL 中有 3 類常量:整型、實數型和字符串型。下劃線符號(_)可以隨意用在整數或實數中,它們就數量本身沒有意義。它們能用來提高易讀性;惟一的限制是下劃線符號不能用作為首字符。

1)整型數

整型數可以按如下兩種方式書寫:簡單的十進制數格式和基數格式。

簡單的十進制形式的整數定義為帶有一個可選的“+”(一元)或“-”(一元)操作符的數字序列。下面是這種簡易十進制形式整數的例子:

32;// 十進制數 32
-15;// 十進制數-15

基數格式的格式為:

[size]'base value

size 定義以位計的常量的位長,base 為 o 或 O(表示八進制)、b 或 B(表示二進制)、d或 D(表示十進制)、h 或 H(表示十六進制),value 是基于 base 的值的數字序列。值 x 和 z以及十六進制中的 a 到 f 不區分大小寫。下面是一些具體實例:

5'O37;// 5 位八進制數
4'D2;//4 位十進制數
4'B1x_01;// 4 位二進制數
7'Hx;//7 位 x(擴展的 x),即 xxxxxxx
4'hZ;// 4 位 z(擴展的 z) , 即 zzzz
4'd-4;//非法,數值不能為負
8'h 2A;//在位長和字符之間,以及基數和數值之間允許出現空格
3' b001;//非法: `和基數 b 之間不允許出現空格
(2+3)'b10;// 非法:位長不能夠為表達式

2)實數

實數可以用下列兩種形式定義:

? 十進制計數法,例如 2.0、5.678、1、1572.12;

? 科學計數法,例如 23_5.1e2(其值為 23510.0,忽略下劃線)、3.6E2(360.0)。

3)字符串

字符串是雙引號內的字符序列。字符串不能分成多行書寫,例如:

"INTERNAL ERROR"
" REACHED->HERE "

用 8 位 ASCII 值表示的字符可看作是無符號整數。因此字符串是 8 位 ASCII 值的序列。為存儲字符串“INTERNAL ERROR”,變量需要 8 * 1 4 位。

reg [1 : 8*14] Message;
. . .
Message ="INTERNAL ERROR"

反斜線()用于對確定的特殊字符轉義。

換行符
	制表符
\字符本身
"字符"
206八進制數206對應的字符

3.5 表達式

表達式是 Verilog HDL 語言中進行邏輯運算和表達最基本的元素。表達式由操作符和操作數按照一定的規則組合而成,下面進行詳細介紹。

1)操作數

操作數的類型包括:常量、參數、線網、寄存器、存儲器單元和函數調用等。

常量的使用規則在3.4 中進行說明,下面是一些實例:

256,7//非定長的十進制數
4'b10_11, 8'h0A// 定長的整型常量
'b1, 'hFBA// 非定長的整數常量
90.00006// 實數型常量
"BOND"http:// 串常量;每個字符作為 8 位 ASCII 值存儲

表達式中的整數值可被解釋為有符號數或無符號數。參數類似于常量,并且使用參數聲明進行說明。下面是參數說明實例:

parameterLOAD=4'd12, STORE = 4'd10;

LOAD 和 STORE 為參數的例子,值分別被聲明為 12 和 10。

線網在表達式中可以分別按照標量和向量兩種方式使用,下面是線網說明實例:

wire [0:3]Prt;//Prt 為 4 位向量線網
wireBdq;//Bbq 是標量線網

線網中的值被解釋為無符號數。例如在連續賦值語句中:

assignPrt = -3;

Prt 被賦于位向量 1101,實際上為十進制的 13,例如在下面的連續賦值中:

assignPrt =4'HA;

Prt 被賦于位向量 1010,即為十進制的 10。

寄存器也是可以按照標量和向量兩種方式使用。寄存器變量使用寄存器聲明進行說明,例如:

integer TemA, TemB;
reg[1:5]State;
timeQue[ 1:5 ];

整型寄存器中的值被解釋為有符號的二進制補碼數,而 reg 寄存器或時間寄存器中的值被解釋為無符號數,實數和實數時間類型寄存器中的值被解釋為有符號浮點數。例如下面的寄存器代碼:

TemA= -10; //TemA 值為位向量10110,是10的二進制補碼
TemA= 'b1011; //TemA 值為十進制數11
State= -10; //State 值為位向量10110,即十進制數22
State= 'b1011; // State 值為位向量01011,是十進制值11

在 Verilog HDL 語言中,對于向量形式的線網和寄存器,都可以采用部分選擇的方式使用向量中需要的部分。在部分選擇中,向量的連續序列被選擇,形式如下:

net_or_reg_vector [msb_const_expr:1sb_const_expr]//部分選擇的語法形式
State[1:4]//寄存器部分選擇
Prt[1:3]// 線網部分選擇

存儲器單元的定義形式如下:

memory [word_address]//定義形式
reg [1:8]Ack,Dram[0:63] ;//例子
. . .
Ack=Dram[60];//存儲器的第 6 0 個單元

不允許對存儲器變量值部分選擇或位選擇。例如:

Dram[60][2]//使用錯誤
Dram[60][2:4]//使用錯誤

在存儲器中讀取一個位或部分選擇一個字的方法如下:將存儲器單元賦值給寄存器變量,然后對該寄存器變量采用部分選擇或位選擇操作。

2)操作符

Verilog HDL語言中的操作符包括:

? 算術操作符 +(加法)、-(減法)、×(乘法)、÷(除法)和%(取模)。

? 關系操作符 >(大于)、<(小于)、≥(大于等于)和≤(小于等于),計算結果為真(1)或者假(0)。

? 相等操作符 ==(邏輯相等)、!=(邏輯不相等)、===(邏輯全等)和!==(非全等)。

? 邏輯操作符 &&(邏輯與)、||(邏輯或)、!(邏輯非)。

? 按位操作符 ~(一元非)、&(二元與)、|(二元或)、^(二元異或)和~^(二元異或非)。

? 移位操作符 <<(左移)、>>(右移)。

? 條件操作符 條件操作符根據條件表達式的值選擇表達式。

四、Verilog HDL 語言的描述語句

Verilog HDL 語言的描述語句有結構化建模方式、數據流建模方式和行為建模方式 3 種。

4.1 結構化建模方式

Verilog HDL 中可以使用內置基本門來進行硬件描述。Verilog HDL 中提供下列內置基本門:

? 多輸入門 and(與門)、nand(與非門)、or(或門)、nor(或非門)、xor(異或門)。

? 多輸出門 buf(緩沖門)、not(取反)。

? 三態門 bufif0、bufif1、notif0、notif1。

? 上拉、下拉電阻 pullup(上拉電阻)、pulldown(下拉電阻)。

? MOS 開關 cmos、nmos、pmos、rcmos、rnmos、rpmos。

? 雙向開關 tran、tranif0、tranif1、rtran、rtranif0、rtranif1。

門級邏輯設計描述中可使用具體的門實例語句。下面是簡單的門實例語句的格式:

gate_type[instance_name](term1, term2, . . . ,termN ) ;

其中 instance_name 是可選的,gate_type 為前面列出的某種門類型。各 term 用于表示與門的輸入/輸出端口相連的線網或寄存器。同一門類型的多個實例能夠在一個結構形式中定義。語法如下:

gate_type
[instance_name1] (term11, term12, . . .,term1N ) ,
[instance_name2] (term21, term22, . . .,term2N ) ,
. . .
[instance_nameM] (termM1, termM2, . . .,termMN)

下面是一個用結構化建模方式實現的多路選擇電路的例子,如圖 2 所示。

c606d386-15cb-11f1-90a1-92fbcf53809c.png

圖 2 多路選擇電路

多路選擇電路如果用結構化建模方式實現,代碼如下:

moduleMUX4x1 (Z , D0 , D1 , D2 , D3 , S0 , S1) ;


inputD0 , D1 , D2 , D3 , S0 , S1;


outputZ;


and(T0 , D0 , S01 , S11) ,
(T1, D1 , S01, S1) ,
(T2, D2 , S0 , S11) ,
(T3, D3 , S0 , S1) ,
not(S01, S0) ,
(S11, S1) ;
or(Z , T0 , T1 , T2 , T3) ;


endmodule

4.2 數據流建模方式

Verilog HDL 中的數據流建模方式一般用連續賦值語句來實現。Verilog HDL 中有兩種形式的賦值方式:連續賦值和過程賦值。其中過程賦值用于順序行為建模,而組合邏輯電路的行為最好使用連續賦值語句建模。

連續賦值語句將值賦給線網(連續賦值不能為寄存器賦值),它的格式如下:

assignLHS_target=RHS_expression;//定義格式
//例子
wire [3:0] Z, Preset, Clear;//線網說明
assignZ=Preset & Clear;//連續賦值語句

連續賦值的目標為 Z,表達式右端為“Preset & Clear”,連續賦值語句中的關鍵詞為assign。只要在右端表達式的操作數上有事件(事件為值的變化)發生時,連續賦值語句即被計算,如果結果值有變化,新結果就賦給左邊的線網。在上面的例子中,如果 Preset 或 Clear變化,就計算右邊的整個表達式。如果結果變化,那么結果即賦值到線網 Z。

如圖 3 所示的是主從觸發器。

c6abcf30-15cb-11f1-90a1-92fbcf53809c.png

圖 3 主從觸發器

主從觸發器用連續賦值語句實現的代碼如下:

moduleMSDFF_DF (D, C, Q, Qbar) ;


inputD, C;
outputQ, Qbar;


wireNotC, NotD, NotY, Y, D1, D2, Ybar, Y1, Y2 ;


assignNotD = ~ D;
assignNotC = ~ C;
assignNotY = ~ Y;
assignD1 = ~ (D & C) ;
assignD2 = ~ (C & NotD) ;
assignY = ~ (D1 & Ybar ) ;
assignYbar = ~ (Y & D2) ;
assignY1 = ~ (Y & NotC ) ;
assignY2 = ~ (NotY & NotC) ;
assignQ = ~ (Qbar & Y1) ;
assignQbar = ~ (Y2 & Q) ;


endmodule

4.3 行為建模方式

行為建模方式是用過程賦值語句來實現的。下面對行為建模方式的各個部分進行詳細介紹。

1)過程結構

Verilog HDL 中的主要行為通過兩種語句來控制進行:

? initial 語句;

? always 語句。

initial 語句在模擬開始時執行,即在 0 時刻開始執行。initial 語句只執行一次,它的語法如下:

initial
[timing_control] procedural_statement

這里的時序控制可以是延時控制,即等待一個確定的時間;或事件控制,即等待確定的事件發生或某一特定的條件為真。initial 語句的各個進程語句僅執行一次。initial 語句根據進程語句中出現的時間控制在以后的某個時間完成執行。下面是一個 initial 語句實例:

parameterSIZE=1024;


reg [7:0] RAM [0:SIZE-1] ;
reg RibReg;


initial
begin: SEQ_BLK_A
 integerIndex;
RibReg=0;
for(Index=0; Index

與 initial 語句相反,always 語句可重復執行。與 initial 語句類似,always 語句語法如下:

always
[timing_control]procedural_statement

下面是一個 always 語句的實例。

  reg [0:5] InstrReg;
  reg [3:0] Accum;


  wire ExecuteCycle;


  always@ (EcecuteCycle)//發生在某個時鐘沿
begin
case(InstrReg[0:1])//多路條件分支
      2'b00:Store(Accum, InstrReg[2:5]) ;//存儲
2'b11: Load (Accum, InstrReg[2:5]) ;//讀取
2'b01: Jump (InstrReg[2:5] ) ;//跳轉
2'b10: ;
    endcase
  end

2)時序控制

Verilog HDL 中進行時序控制分別通過下面兩種方式進行:

? 延時控制;

? 事件控制。

延時控制的語法如下:

#delay procedural_statement

延時控制定義為執行過程中首次遇到該語句與該語句的執行的時間間隔。延時控制表示在語句執行前的“等待時延”。下面是一個延時控制的例子:

initial
begin
#3 Wave = 'b0111;//3 個時間單位后執行
#6 Wave = 'b1100; //6 個時間單位后執行
#7 Wave = 'b0000; //7 個時間單位后執行
end

事件控制有兩種方式:邊沿觸發事件控制和電平敏感事件控制。邊沿觸發事件是指指定信號的邊沿發生跳變時發生指定的行為,下面是邊沿觸發事件控制的語法和實例:

 @ event procedural_statement
//實例
 time RiseEdge, OnDelay;


 initial
 begin
//等待,直到在時鐘上發生正邊沿:
   @ (posedge ClockA) ;
   RiseEdge =$time;
//等待,直到在時鐘上發生負邊沿:
   @ (negedge ClockA) ;
   OnDelay =$time- RiseEdge;
  $display("The on-period of clock is %t.", Delay) ;
 end

在電平敏感事件控制中,進程語句或進程中的過程語句一直延遲到條件變為真后才執行。下面是電平敏感事件控制的語法和實例:

wait(Condition)
procedural_statement
//實例
wait(Sum >22) //直到 Sum 大于22時發生
Sum =0;
wait(DataReady) //直到 DataReady 為高時發生
Data = Bus;
wait(Preset) ;//直到 Preset 為高時才能執行后面的語句

3)語句塊

Verilog HDL 在執行語句時分為順序和并行兩種方式。在順序語句塊中,語句按給定次序順序執行;在并行語句塊中,語句并行執行。

順序語句塊的語法和實例如下:

begin
 [:block_id{declarations} ]
  procedural_statement(s)
end
//實例
//產生波形
begin
#2 Stream = 1;
#5 Stream = 0;
#3 Stream = 1;
#4 Stream = 0;
#2 Stream = 1;
#5 Stream = 0;
end

并行語句塊的語法和實例如下:

 fork
  [:block_id{declarations} ]
  procedural_statement(s) ;
join
//實例
//生成波形,生成的波形和前面使用順序語句塊的例子一樣
 fork
#2 Stream = 1;
#7 Stream = 0;
#10 Stream = 1;
#14 Stream = 0;
#16 Stream = 1;
#21 Stream = 0;
join

4)過程性賦值

過程性賦值是在 initial 語句或 always 語句內的賦值,它只能對寄存器數據類型的變量賦值。過程性賦值如下兩類:

? 阻塞性過程賦值:賦值在其后所有語句執行前執行,即在下一語句執行前該賦值語句完成執行;

? 非阻塞性過程賦值:對目標的賦值是非阻塞的(因為時延),但可預定在將來某個時間發生。

阻塞性過程賦值用操作符“=”完成,例如下面的實例:

 always @ (AorBorCin)
 begin: CARRY_OUT
    reg T1,T2 , T3;
    T1 = A & B;
    T2 = B & Ci n;
    T3 = A & Ci n;
    Cout = T1|T2|T3;
 end

T1 賦值首先發生,計算 T1;接著執行第二條語句,T2 被賦值;然后執行第三條語句, T3被賦值,依此類推直到最后。

非阻塞性過程賦值用操作符“<=”完成,例如下面的實例:

initial
begin
 Clr<= #5?1;
? ??Clr?<= #4?0;
? ??Clr?<= #10?0;
??End

第一條語句的執行使 Clr 在第 5 個時間單位被賦于值 1;第二條語句的執行使 Clr 第 4 個時間單位被賦值為 0(從 0 時刻開始的第 4 個時間單位);最終第 3 條語句的執行使 Clr 在第10 個時間單位被賦值為 0(從 0 時刻開始的第 1 0 個時間單位)。這 3 條語句都是在 0 時刻執行的。

5)流程控制語句

流程控制語句包括:

? if 語句;

? case 語句;

? 循環語句。

if 語句的語法如下:

if(condition_1)
procedural_statement_1
{elseif(condition_2)
procedural_statement_2}
{else
procedural_statement_3}

如果對 condition_1 求值的結果為一個非零值,那么 procedural_statement_1 被執行,如果 condition_1 的值為 0、x 或 z,那么 procedural_statement_1 不執行。如果存在一個 else分支,那么這個分支被執行。

下面是一個 if 語句的例子:

 if(Sum

case 語句是一個多路條件分支形式,其語法如下:

case(case_expr)
case_item_expr{ ,case_item_expr} :procedural_statement
. . .
. . .
[default:procedural_statement]
endcase

case 語句首先對條件表達式 case_expr 求值,然后依次對各分支項求值并進行比較,第一個與條件表達式值相匹配的分支中的語句被執行。可以在 1 個分支中定義多個分支項,這些值不需要互斥。缺省分支覆蓋所有沒有被分支表達式覆蓋的其他分支。

下面是 case 語句的一個實例:

always@ (AorBorOpCode)
case(OpCode)
ADD_INSTR: Z = A + B;
SUB_INSTR: Z = A -B;
MULT_INSTR: Z = A * B;
DIV_INSTR: Z = A / B;
endcase


endmodule

Verilog HDL 中提供 4 種循環語句:forever 循環,repeat 循環,while 循環和 for 循環。

forever 循環語句連續執行過程語句。因此為跳出這樣的循環,中止語句可以與過程語句共同使用。同時,在過程語句中必須使用某種形式的時序控制,否則 forever 循環將在 0 延時后永遠循環下去。forever 循環語句語法和實例如下:

 forever
 procedural_statement
 //實例
 initial
begin
   Clock =0;
# 5 forever
#10 Clock = ~Clock;
end

這一實例產生時鐘波形:時鐘首先初始化為 0,并一直保持到第 5 個時間單位;此后每隔10 個時間單位,時鐘反相一次。

repeat 循環語句執行指定循環次數,如果循環計數表達式的值不確定,即為 x 或 z 時,那么循環次數按 0 處理。下面是 repeat 循環語句語法和實例如下:

repeat(loop_count)
procedural_statement
//實例
repeat(Count)
@ (posedgeClk)Sum=Sum+1;//在時鐘上升沿時每次加一

while 循環執行過程賦值語句直到指定的條件為假。如果表達式在開始時為假,那么過程語句便永遠不會執行。如果條件表達式為 x 或 z,它也同樣按 0(假)處理。

下面時 while 循環的語法和實例:

 while(condition)
  procedural_statement
  //實例,一直執行直到 BY 小于等于 0
 while(BY > 0 )
   begin
    Acc = Acc <

for 循環照指定的次數重復執行過程賦值語句。下面是 for 循環的語法和實例:

for(initial_assignment ; condition ; step_assignment)
 procedural_statement
 //實例中,MAX_RANGE 為循環計次的上限,每次循環加一
for(K=0; K < MAX_RANGE ; K = K +1)
begin
if(Abus[K] ==0)
    Abus[K] =1;
elseif(Abus[k] ==1)
    Abus[K] =0;
else
$display("Abus[K] is an x or a z");
end
end

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真器
    +關注

    關注

    14

    文章

    1052

    瀏覽量

    87867
  • Verilog
    +關注

    關注

    30

    文章

    1374

    瀏覽量

    114601
  • HDL
    HDL
    +關注

    關注

    8

    文章

    332

    瀏覽量

    49007
  • C語言
    +關注

    關注

    183

    文章

    7645

    瀏覽量

    145886

原文標題:Verilog HDL 語法學習筆記

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    verilog語法學習心得

    verilog語法學習心得1.數字電路基礎知識: 布爾代數、門級電路的內部晶體管結構、組合邏輯電路分析與設計、觸發器、時序邏輯電路分析與設計2.數字系統的構成: 傳感器AD數字處理器DA執行部件3.
    發表于 01-12 15:15

    Verilog HDL的基本語法

    Verilog HDL的基本語法 .pdf
    發表于 08-15 15:06

    FPGA入門:Verilog/VHDL語法學習的經驗之談

    FPGA入門:Verilog/VHDL語法學習的經驗之談 本文節選自特權同學的圖書《FPGA/CPLD邊練邊學——快速入門Verilog/VHDL》書中代碼請訪問網盤:http
    發表于 01-29 09:20

    FPGA實戰演練邏輯篇35:語法學習的經驗之談

    語法學習的經驗之談本文節選自特權同學的圖書《FPGA設計實戰演練(邏輯篇)》配套例程下載鏈接:http://pan.baidu.com/s/1pJ5bCtt FPGA器件的設計輸入有很多種方式,如
    發表于 06-10 12:39

    Verilog HDL語法

    Verilog HDL語法,要的拿
    發表于 01-24 22:53

    勇敢的芯伴你玩轉Altera FPGA連載29:語法學習的經驗之談

    `勇敢的芯伴你玩轉Altera FPGA連載29:語法學習的經驗之談特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1i5LMUUD FPGA器件
    發表于 12-04 21:11

    Verilog HDL入門教程

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Verilog HDL
    發表于 12-08 14:39

    【特權同學推薦】Verilog HDL語法學習教程及135個設計實例

    本資料主要介紹了Verilog HDL 語言的基本知識、設計指導以及相關案例,目的是使初學者能夠迅速掌握HDL 設計方法,了解并掌握Verilog
    發表于 11-26 11:27

    verilog HDL語法總結

    verilog HDL語法總結
    發表于 03-16 14:26

    Verilog代碼的基本程序框架

    了解一下Verilog代碼的基本程序框架,這樣可以讓我們先對Verilog程序設計有一個整體的概念把握,進而在后續的Verilog語法學習中做到有的放矢。閱讀本節時請著眼于大體,而不要
    發表于 07-27 07:51

    Verilog_HDL的基本語法詳解(夏宇聞版)

    Verilog_HDL的基本語法詳解(夏宇聞版):Verilog HDL是一種用于數字邏輯電路設計的語言。用Verilog
    發表于 10-08 14:48 ?0次下載
    <b class='flag-5'>Verilog_HDL</b>的基本<b class='flag-5'>語法</b>詳解(夏宇聞版)

    Verilog HDL實驗練習與語法手冊

    Verilog HDL實驗練習與語法手冊-高教
    發表于 05-11 11:30 ?0次下載

    _Verilog_HDL的基本語法

    Verilog_HDL語言的學習,為FPGA編程打下堅實的基礎
    發表于 05-19 16:40 ?14次下載

    Verilog HDL基礎語法入門

    簡單介紹Verilog HDL語言和仿真工具。
    發表于 05-06 16:17 ?620次下載

    Verilog HDL入門教程-Verilog HDL的基本語法

    Verilog HDL入門教程-Verilog HDL的基本語法
    發表于 01-07 09:23 ?192次下載