欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3758|回復: 1
打印 上一主題 下一主題
收起左側

FPGA Verilog語言中阻塞賦值與非阻塞賦值個人看法

[復制鏈接]
跳轉到指定樓層
樓主
ID:128229 發表于 2016-6-27 01:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
                                      FPGA Verilog語言中阻塞賦值與非阻塞賦值區別的個人看法
                       -------(本文與新浪博客同步)
       對于Verilog 初學者來說,阻塞賦值與非阻塞賦值應該要區別一下子,我估計對于這兩種賦值方式的應用解說,什么時候該用阻塞賦值,什么時候該用非阻塞賦值,通常見到的一句話是,時序邏輯里面通常用非阻塞賦值,組合邏輯里面通常使用阻塞賦值。但是這必然是含糊不清的,也并不意味著時序邏輯里面就不可以阻塞賦值了,組合邏輯里面就不可以用非阻塞賦值了。所以我覺得有必要弄清楚一下阻塞賦值和非阻塞賦值的細微區別。
       首先還是回歸下定義,所謂阻塞賦值,例如 a=b; 當這個賦值語句執行的時候是不允許有其它語句執行的,這就是阻塞的原因。而非阻塞賦值,例如a<=b;當這個賦值語句執行的時候是不阻礙其它語句執行的。對于FPGA來講,跟單片機相比(即使是高速單片機),它本身的優點是語句執行的并行性,而單片機語句執行是順序執行的。所以如果說我們要充分利用好FPGA這個優點,那么我們應該盡量使用非阻塞賦值。
       下面我想從一個簡單的例子來淺析一下兩者的區別。

這是一個簡單的分頻程序,目的是將clk時鐘四分頻。Count初始值是0,(個人經驗認為的,因為verilog里面似乎沒法對變量進行初始化),然后第一個時鐘的上升沿到來時,count自加1后變成了1if語句執行為假,然后第二個時鐘上升沿到來時,count又自加1變成了2if語句執行條件為真,則執行if語句內的內容,將data_a數據翻轉,count重新賦值為0,所以該程序就是每兩個時鐘的上升沿,data_a數據翻轉一次,得到四分頻的效果。
下圖為仿真波形,是完全對得住分析的。

上面的程序用的是阻塞賦值,也就是 count執行自加1的時候,其它任何語句都是不能執行的,因此這里就有點想單片機里面的C語言了,一個順序執行的always塊。
如果把上面的程序賦值全改成非阻塞賦值,效果會怎樣呢?

首先我們先不作分析,先對比一下仿真波形。

從仿真波形來看,這個程序確變成了對clk時鐘的六分頻,顯然不是我們之前的思路分析結果。實際上它是這樣子執行的。
    首先可以這樣理解,1、非阻塞賦值是always塊結束才賦值的,個人理解是程序見到always塊的結束標記end后才賦值,但是并不代表當程序最開始看到該語句時沒有任何動作,而是先把后面的值給計算出來放在一個寄存器中暫存,到了塊結束才賦值,比如上述中的先把count+1計算出來后,到了塊結束才把那個結果賦值給count2、非阻塞賦值是并行執行的,因此不管有多少個always塊,不管每個always塊里面有多少條非阻塞賦值,它都是瞬間一塊并行執行的,互不干擾。
所以上面的程序就好分析了
      Count初始值是0,第一個時鐘的上升沿到來時,count<=count+1 這條語句先不賦值(前面說了塊結束才賦值),但是count+1已經計算出來放在寄存器中存儲著,先執行的是if語句,if語句此時條件仍然是(count=0),條件為假,不執行if內部語句,接著遇到always塊結束標記end,這才執行count<=的賦值,count此時為1,然后第二個時鐘上升沿到來,同樣先執行if語句,條件仍然為假,然后再執行count自加1count變為2,第三個時鐘上升沿到來,先執行if語句,條件滿足,至于此時 有三個非阻塞賦值的語句出現
count<=count+1;
data_a<=!data_a;
count<=0;
這三個語句按道理講也是并行執行的,但是,有兩個語句同時對count進行了賦值。。那么咋整呢,這點筆者尚未清楚,懇請達人解析,或者待日后筆者弄清楚在來看看了。。。
7月25日,經過龍哥點撥,上述問題終于有了一個合理的解釋。
參閱許多資料可以得出的結論是:在begin 。。end 中非阻塞賦值實際上是并行中的順序執行。此話的理解是,begin 。。end 語句塊中得非阻塞賦值語句與其它塊中的非阻塞賦值語句是并行的,但是對于單個begin 。。end 塊中的語句卻是順序執行的。所以在verilog語言中是不允許在兩個塊中對同一變量進行賦值的,而在單一塊中,如果有兩個或兩個以上的非阻塞語句對同一個變量進行了賦值,那么該變量的值由最后一個語句所決定。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:127965 發表于 2016-7-3 16:38 | 只看該作者
謝謝 真好 正好解決我最近的疑惑
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表