· 程序執行順序 ·
和C/C++一類編程語言不同,HDL用于電路描述,代表著門電路和觸發器的組合。任何時刻,只要上電后,FPGA就等價于一堆數字電路,每個電路按照自己的條件執行,不會因為某個模塊放在代碼前面,就會先工作。這就需要設計人員,按照每個模塊并行工作的思路來調整設計。這給軟件開發人員入門帶來了難度,但是同時也是FPGA的價值所在,正因為FPGA能夠并行執行,所以很多算法和設計可以在低頻時鐘下高實時性,快速出結果。這是FPGA的優勢,也是火起來的一個重要原因,所以希望大家好好去理解。
同時大家要明白verilog不是不能實現順序執行,而是實現順序執行并不像語法那么直觀,最簡單的順序執行方法就是用狀態機去控制每一個寄存器的跳變,C/C++編程也可以認為本質上就是大型的一個狀態機,verilog要做到那樣也只是做成狀態機去模擬他的工作。只要是數字電路能夠實現的,FPGA都可以做到。
模塊內部的執行順序比較復雜,優秀的設計中,模塊內部是并行工作的,即使是begin end語句內部,這里很多讀者會問,begin end不是串行語句塊嗎?下面詳細解釋這個問題。
begin end之間存在阻塞賦值和非阻塞賦值2種賦值方法,如果使用不當不僅僅會出現競爭冒險,還會導致你的理解和編譯器理解不一樣,最終生成的電路和自己想的天差地別,導致一些難修正的錯誤。所以必須按照以下兩條執行準則使用賦值語句:
描述組合邏輯的always塊里面用阻塞式賦值
描述時序邏輯的always塊里面用非阻塞賦值
在組合邏輯中,阻塞賦值只和電平有關,往往和觸發邊沿沒有關系,可以看成是并行運行的組合邏輯電路。而時序邏輯中,非阻塞賦值是本身就是并行執行的。因此,優秀的設計,其begin end內部也是并行執行的。大家為了加深理解,可以去看看實例說明里面的例子。
· 實例說明 ·
modulepara_demo(clk,reset,a,b);
inputclk;
inputreset;
input[3:0]a;
output[3:0]b;
reg[3:0]tempa1,tempa2,b;
always@(posedgeclk)
begin
if(!reset)begin
tempa1<=?0;??
tempa2<=?0;??
b<=?0;??
end
elsebegin
tempa1<=?a?+?1;??
tempa2<=?tempa1?+?1;??
b<=?tempa2?+?1;??????
end
end
endmodule
上述代碼的RTL級圖如下,可以看出代碼最終實現是一個3級累加結構,每級累加結構中間有一個觸發器打拍。也就是說這是典型的流水線結構。每一級都在一直工作,運行順序沒有先后,但是數據到達時間有先后,處理順序有先后。
大家再看仿真圖,tempa2 并不是等到a+1的結果給到tempa1后才執行的tempa1+1,而是執行a+1的同時也在執行tempa1+1。三句累加都是同時進行,看下圖就知道都是對前一個數值基礎上加1。所以tempa1和tempa2相等,而不是相差1。
看此文之前請千萬很熟悉verilog語法,能區分可綜合,不可綜合語句。
-
寄存器
+關注
關注
31文章
5396瀏覽量
122511 -
Verilog
+關注
關注
28文章
1363瀏覽量
111296 -
編譯器
+關注
關注
1文章
1649瀏覽量
49682
原文標題:面向硬件的設計思維——程序執行順序
文章出處:【微信號:HaveFunFPGA,微信公眾號:玩兒轉FPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
[公告]誰是真正的朋友?
【LabVIEW我來告訴你】 Webbrowser調用的隱患
【labview我來告訴你】labview編程可以很簡單
【labview我來告訴你】用好控件的小技巧
【labview我來告訴你】如何方便的知道事件運行順序
labview心得體會之我來告訴你匯總(持續更新)
告訴你什么叫高逼格的LED
FPGA的幾點總結,你同意嗎?
十個練習讓你學會Verilog語言
怎樣架構你的單片機程序
基于Verilog的順序狀態邏輯FSM的設計與仿真

評論