加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1. 賦值語句
    • 2. 阻塞賦值和非阻塞賦值
    • 3. 兩種類型RTL處理:
    • 4. 過程塊語句
    • 5. 同步邏輯和異步邏輯
    • 6. 函數(shù)(function)和任務(wù)(task)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Verilog HDL基礎(chǔ)知識(shí)(二)

05/30 10:20
2486
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

引言:本文繼續(xù)介紹Verilog HDL基礎(chǔ)知識(shí),重點(diǎn)介紹賦值語句、阻塞與非阻塞、循環(huán)語句、同步與異步、函數(shù)與任務(wù)語法知識(shí)。

1. 賦值語句

在Verilog中,有兩種進(jìn)行賦值的方法,即連續(xù)賦值語句和過程賦值語句(塊)。

1.1 連續(xù)賦值語句

連續(xù)賦值用于表示組合邏輯。左側(cè)必須是Net數(shù)據(jù)類型即wire和tri類型。

連續(xù)賦值始終處于活動(dòng)狀態(tài),這意味著,對(duì)右側(cè)值的任何更改都會(huì)導(dǎo)致賦值左側(cè)值被更新。

//連續(xù)賦值方法1    wire [15:0] adder_out = mult_out + out;     //連續(xù)賦值方法2    wire [15;0] adder_out;     assign adder_out = mult_out + out;

在仿真測(cè)試中,可以對(duì)連續(xù)賦值語句分配延遲,但在綜合時(shí),該延遲被忽略。

assign?#5?adder_out?=?mult_out?+?out;?//延遲5ns

1.2? 過程賦值語句(塊)

過程賦值語句包括initial和always兩種。intial語句用于初始化仿真使用,always使用行為功能描述電路功能。

每個(gè)always和initial塊都是并行運(yùn)行的,但每個(gè)塊內(nèi)部是順序執(zhí)行的。

圖1:過程賦值語句示例

2. 阻塞賦值和非阻塞賦值

always和initial過程塊有種類型賦值即阻塞賦值(=)和非阻塞賦值(<=)。

過程賦值的左側(cè)必須是變量數(shù)據(jù)類型,可以是reg、integer、real或time或realtime。賦值的右側(cè)可以是任何有效的表達(dá)式或信號(hào)。

阻塞賦值和非阻塞賦值示例如下圖所示。

圖2:阻塞賦值和非阻塞賦值示例

如圖2左側(cè)阻塞賦值,兩條語句同時(shí)執(zhí)行,延遲#5時(shí),a=b=2,再延遲#5時(shí),c=a=2,即賦值語句立即執(zhí)行,執(zhí)行完畢后才執(zhí)行下一條語句,左側(cè)值在賦值語句執(zhí)行完后立即改變。如圖2右側(cè)非阻塞賦值,延遲#5時(shí),a=b=2,而再延遲#5時(shí),c=a=1,即c值并未立即為a的新值。

圖3展示了阻塞賦值和非阻塞賦值綜合后的RTL電路舉例。

圖3:阻塞賦值和非阻塞賦值綜合后的RTL電路舉例?

阻塞賦值和非阻塞賦值使用規(guī)則

組合電路一般使用阻塞賦值,時(shí)序電路使用非阻塞賦值,這可以避免混淆,提高代碼可讀性。

3. 兩種類型RTL處理:

組合邏輯處理和時(shí)序邏輯處理

組合邏輯處理:對(duì)所有輸入列表信號(hào)敏感,用于組合邏輯。

圖4:組合邏輯處理

時(shí)序邏輯處理:對(duì)時(shí)鐘信號(hào)或者控制信號(hào)沿敏感(通過添加posedge或者negedge關(guān)鍵字),用于時(shí)序邏輯。


圖5:時(shí)序邏輯處理

4. 過程塊語句

initial和always過程塊中有三種常用語句:if-esle、case和循環(huán)語句。

4.1 if-else語句
語句以關(guān)鍵字if開頭,后跟一個(gè)條件,然后是條件為true時(shí)要執(zhí)行的語句序列。else子句(如果存在)將在條件為false時(shí)執(zhí)行。

圖6:if-else示例

可以看到if語句合成為兩個(gè)輸入復(fù)用器??梢钥吹剑鄠€(gè)if語句會(huì)導(dǎo)致多個(gè)復(fù)用,從而產(chǎn)生優(yōu)先級(jí)。如果不需要在你的電路中進(jìn)行優(yōu)先級(jí)排序,case語句會(huì)更有效率。

4.2 case語句在case語句中,所有條件都將根據(jù)表達(dá)式進(jìn)行檢查。這導(dǎo)致一個(gè)多路復(fù)用器具有多個(gè)輸入。

圖7:case語句示例

casez語句將表達(dá)式或條件中的所有'z'值視為不關(guān)心。

casex語句將所有“x”和“z”值視為不關(guān)心,而不是邏輯值。?????

圖8:casez和casex語句示例

4.3 循環(huán)語句

(1)forever循環(huán)語句示例

initial?begin? ??      clk = 0;    ??forever?#25?clk=?~clk;   end

以上示例為周期為#50的clk時(shí)鐘,注意該語句不可綜合,只能用于仿真。

(2)repeat循環(huán)語句

if(rotate == 1)  ??repeat(8)?begin?//循環(huán)8次  ????temp?=?data[15];  ????data = {data <<1,temp};  ??end   ?

repeat語句可以設(shè)置循環(huán)的次數(shù),該語句可以用于綜合,要具有明確的循環(huán)表達(dá)式和循環(huán)條件。

(3)while循環(huán)語句

initial begin      ? cnt = 0;??while(cnt?<?101)?begin  ????$display("cnt?=?%d",cnt); ????cnt = cnt + 1;?  ??end   end 

cnt循環(huán)計(jì)數(shù)100次,在cnt為101時(shí)退出循環(huán),該語句可以用于綜合,要具有明確的循環(huán)表達(dá)式和循環(huán)條件。

(4)for循環(huán)語句

integer i;    always @(inp,cnt) begin    ??result[7:4] = 0;  ??result[3:0] = inp;  ??if?(cnt?==?1)?begin  ????for?(i=4;i<=7;?i=i+1)?begin  ??????result[i]?=?result[i-4];  ????end ?   ??end     end

以上for循環(huán)語句實(shí)現(xiàn)4bit左移位功能,for語句可以進(jìn)行綜合,實(shí)現(xiàn)硬件電路。

5. 同步邏輯和異步邏輯

圖9:同步邏輯及異步邏輯

always敏度列表表達(dá)方式將導(dǎo)致控制信號(hào)是同步的或異步的。上圖中左側(cè)代碼具有同步預(yù)置和觸發(fā)器清除功能,該代碼僅在時(shí)鐘上升沿敏感,右側(cè)代碼敏感列表包含時(shí)鐘和異步清除信號(hào),如果aclr上升沿觸發(fā),就會(huì)引起q清零,不受時(shí)鐘控制。

6. 函數(shù)(function)和任務(wù)(task)

Verilog HDL有兩種子程序,函數(shù)和任務(wù)。它們都必須在模塊中定義。函數(shù)根據(jù)其輸入返回一個(gè)值。函數(shù)通常產(chǎn)生組合邏輯,并用于assign表達(dá)式中。
任務(wù)和函數(shù)對(duì)于模塊中的重復(fù)代碼非常有用。它們提高了代碼的可讀性。

?圖10:function示例

圖11:task示例

function和task的異同點(diǎn)

相同點(diǎn):

(1)任務(wù)和函數(shù)必須在模塊內(nèi)定義,其作用范圍僅適用于該模塊,可以在模塊內(nèi)多次調(diào)用;(2)任務(wù)和函數(shù)中可以聲明局部變量,如寄存器,時(shí)間,整數(shù),實(shí)數(shù)和事件,但是不能聲明線網(wǎng)類型的變量;(3)任務(wù)和函數(shù)中只能使用行為級(jí)語句,但是不能包含always和initial塊,設(shè)計(jì)者可以在always和initial塊中調(diào)用任務(wù)和函數(shù)。

異點(diǎn):

(1)函數(shù)能調(diào)用另一個(gè)函數(shù),但是不能調(diào)用任務(wù),任務(wù)可以調(diào)用另一個(gè)任務(wù),也可以調(diào)用函數(shù);

(2)函數(shù)總是在仿真時(shí)刻0開始,任務(wù)可以在非零時(shí)刻開始執(zhí)行;

(3)函數(shù)一定不能包含任何延遲,事件或者時(shí)序控制聲明語句,任務(wù)可以包含延遲,事件或者時(shí)序控制聲明語句;

(4)函數(shù)至少要有一個(gè)輸入變量,也可以有多個(gè)輸入變量,任務(wù)可以沒有或者有多個(gè)輸入,輸出,輸入輸出變量;

(5)函數(shù)只能返回一個(gè)值,函數(shù)不能有輸出或者雙向變量,任務(wù)不返回任何值,或者返回多個(gè)輸出或雙向變量值。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
LFE3-150EA-6FN672I 1 Lattice Semiconductor Corporation Field Programmable Gate Array, 375MHz, 149000-Cell, PBGA672, 27 X 27 MM, LEAD FREE, FPBGA-672

ECAD模型

下載ECAD模型
$243.42 查看
EP3C5F256C8N 1 Altera Corporation Field Programmable Gate Array, 5136 CLBs, 472.5MHz, 5136-Cell, CMOS, PBGA256, 17 X 17 MM, 1.55 MM HEIGHT, 1 MM PITCH, LEAD FREE, FBGA-256

ECAD模型

下載ECAD模型
$23.27 查看
EP2C8Q208I8N 1 Altera Corporation Field Programmable Gate Array, 516 CLBs, 402.5MHz, 8256-Cell, CMOS, PQFP208, LEAD FREE, PLASTIC, QFP-208
$39.64 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

專注FPGA技術(shù)開發(fā),涉及Intel FPGA、Xilinx FPGA技術(shù)開發(fā),開發(fā)環(huán)境使用,代碼風(fēng)格、時(shí)序收斂、器件架構(gòu)以及軟硬件項(xiàng)目實(shí)戰(zhàn)開發(fā),個(gè)人公眾號(hào):FPGA技術(shù)實(shí)戰(zhàn)。