Verilog 初學筆記--順序操作 和 並行操作的一點思考(參考黑金教程:Verilog HDL那些事 建模篇)


Verilog 是一門建模語言,而不是一門編程語言。同眾多的編程語言相比,他最大的特點是並行性。即Verilog 不但能描述串行操作,也能描述並行操作。如果理解了Verilog 的並行設計原則,則設計的系統不但層次分明,且易於理解和維護。

如對於編程入門的流水燈,假設滿足以下功能:三個LED燈,在三個時鍾周期內分別輸出高電平,如下圖波形:在三個時鍾周期內LED0,LED1,LED2輪流輸出高電平。

如果用C語言編程,可能會這樣:

While(1) {

       LED=001;delay(1);

       LED=010;delay(1);

       LED=100;delay(1);

}

可以看出,思考的過程是:

       1:亮第一個燈,延時;

       2:亮第二個燈,延時;

       3:亮第三個燈,延時;

       4:執行第一步

可以看出是典型的順序操作,1執行完才能執行2,依次類推。

如果用並行的思想設計:

       進程1:第一個時鍾周期LED0亮,后兩個時鍾周期LED0滅

       進程2:第二個時鍾周期LED1亮,第一個時鍾周期和第三個時鍾周期LED1滅

       進程3:第三個時鍾周期LED2亮,第一個時鍾周期和第二個時鍾周期LED2滅

其中進程1,2,3並行執行,互不影響。

在Verilog 語言中,既可以用並行的思想設計,也可以用串行的思想設計。

串行設計

  

View Code
 1 module flash(
2 clk,rst_n,out
3 );
4 input clk,rst_n;
5 output [2:0] out;
6
7 //the block of count
8 reg [1:0] cnt;
9 always @(posedge clk,negedge rst_n)
10 if(!rst_n)
11 cnt<=2'b0;
12 else if(cnt==2'b10)
13 cnt<=2'b0;
14 else
15 cnt<=cnt+1'b1;
16
17 //the block of output
18 reg [2:0] rOut;
19 always @(posedge clk,negedge rst_n)
20 if(!rst_n)
21 rOut<=3'b000;
22 else if(cnt<2'b1)
23 rOut<=3'b001;
24 else if(cnt>=2'b1 && cnt<2'b10)
25 rOut<=3'b010;
26 else
27 rOut<=3'b100;
28
29 assign out=rOut;
30 endmodule

其中以下代碼體現了串行的設計思想,在第一個延時內亮第一個燈,然后在第二個延時內亮第二個燈,最后在第三個延時內亮第三個燈。

  

View Code
 1             else if(cnt<2'b1)
2
3 rOut<=3'b001;
4
5 else if(cnt>=2'b1 && cnt<2'b10)
6
7 rOut<=3'b010;
8
9 else
10
11 rOut<=3'b100;

生成的RTL視圖:

雖然生成的RTL視圖看出三個比較器類似並行,但是還是一種串行的設計思想。應為這三個亮燈的過程是有順序關系的,並不是並行互不影響的。從LessThan0可以看出第一個延時的判斷結果影響是第二個延時判斷結果的輸入選擇信號:只有第一個延時完成后,才開始第二個延時。這是典型的順序操作的思想。

並行設計:

  

View Code
 1 module flash(
2 clk,rst_n,out
3 );
4 input clk,rst_n;
5 output [2:0] out;
6
7 //the block of count
8 reg [1:0] cnt;
9 always @(posedge clk,negedge rst_n)
10 if(!rst_n)
11 cnt<=2'd0;
12 else if(cnt==2'd2)
13 cnt<=2'd0;
14 else
15 cnt<=cnt+1'd1;
16 //the block of output led0;
17 reg rOut0;
18 always @(posedge clk,negedge rst_n)
19 if(!rst_n)
20 rOut0<=1'b0;
21 else if(cnt<2'b1)
22 rOut0<=1'b1;
23 else
24 rOut0<=1'b0;
25 //the block of output led1;
26 reg rOut1;
27 always @(posedge clk,negedge rst_n)
28 if(!rst_n)
29 rOut1<=1'b0;
30 else if(cnt>=2'b1 && cnt<2'b10)
31 rOut1<=1'b1;
32 else
33 rOut1<=1'b0;
34 //the block of output led2;
35 reg rOut2;
36 always @(posedge clk,negedge rst_n)
37 if(!rst_n)
38 rOut2<=1'b0;
39 else if(cnt==2'b10)
40 rOut2<=1'b1;
41 else
42 rOut2<=1'b0;
43 assign out={rOut2,rOut1,rOut0};
44 endmodule

上述代碼中的輸出led0,led1,led2的三段always 代碼體現了設計的並行思想。在Verilog語言中,always塊是並行操作的,互不影響。

生成的RTL視圖:

上述RTL視圖可以看出,各個always 塊的延時判斷語句互不影響,直接連到輸出,體現了並行設計的思想。同串行設計相比,判斷輸出端的組合邏輯簡單,RTL視圖清晰,易於理解,且RTL代碼易於維護。

       通過對比可以發現,並行設計在並不大量消耗資源且滿足功能的前提下,能夠更好的描述系統。

      這里要特別注意的一點是:在Verilog 語言中強調代碼的簡潔性是沒有意義的,如何能夠更加形象的對系統的建模才是設計者需要關心的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM