色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

阻塞賦值和非阻塞賦值的用法一篇文章就夠了

汽車玩家 ? 來源:FPGA技術聯盟 ? 作者:Jarvis ? 2020-01-30 17:41 ? 次閱讀

對于VerilogHDL語言中,經常在always模塊中,面臨兩種賦值方式:阻塞賦值和非阻塞賦值。對于初學者,往往非常迷惑這兩種賦值方式的用法,本章節主要介紹這兩種文章的用法。其實,有時候概念稍微不清楚,Bug就會找到我們,下面一文掃清阻塞賦值和非阻塞賦值所有的障礙。

基本概念

阻塞賦值(Blocking Assignment)

阻塞賦值的基本描述格式為:

[變量] = [邏輯表達式];

阻塞賦值在執行的時候,右端表達式執行并賦值到左邊變量,不會受任何情況打斷。所以在本次賦值結束之前他“阻塞”了當前其他的賦值任務,阻塞賦值的操作和C語言中的變量賦值非常相似。

非阻塞賦值(Nonblocking assignment)

非阻塞賦值的基本描述格式為:

[變量] 《= [邏輯表達式];

非阻塞賦值行為有些細微之處比較難以理解。我們最好從硬件角度來理解,always模塊可以被認為是純硬件模塊,當always模塊被激活時,非阻塞賦值的右側表達式就開始執行;當always模塊所有表達式執行結束之后,所有執行結果才賦值到左側變量當中。之所以稱為“非阻塞”就是在本條賦值語句執行的過程中,其他賦值語句也可以執行。

金規

1. 在組合邏輯電路描述中采用阻塞賦值

阻塞賦值和非阻塞賦值雖然都可以用來描述同一電路,以1位比較器舉例來解釋這種差別。

阻塞賦值實現1bit比較器

module eq1_block

input wire i0, i1,

output reg eq

);

reg p0, p1;

always @(i0,i1) // i0 和i1 在敏感量列表當中

// 語句描述的順序非常關鍵

begin

p0 = ~i0 & ~i1;

p1 = i0 & i1;

eq = p0 | p1;

end

endmodule

分析:程序中,敏感量列表中包含i0和i1,只要這兩個變量有一個發生改變,都會激活always語句,那么p0、p1和eq就會順序賦值,最終eq賦值就會被更新,所以這三條語句的描述順序非常關鍵,假如將最后一條語句提前:

always @(i0,i1)

begin

eq = p0 | p1;

p0 = ~i0 & ~i1;

p1 = i0 & i1;

end

在第一條描述中,由于p0和p1還沒有被賦予新值,所以p0和p1依然保持原來的賦值,這樣得到的最終結果顯然是錯誤的。

非阻塞賦值實現1bit比較器

module eq1_non_block

input wire i0, i1,

output reg eq

);

reg p0, p1;

always @(i0,i1,p0,p1) // p0, p1依然在敏感量列表中

// 描述順序無關緊要

begin

p0 《= ~i0 & ~i1;

p1 《= i0 & i1;

eq 《= p0 | p1;

end

endmodule

分析:p0和p1包含在敏感量列表當中,當i0 或者 i1有所變化,always模塊被激活,p0和p1在第一個時鐘節拍結束時賦值,由于eq值為基于p0和p1原來保持值的賦值,所以eq不變,當前賦值結束時,always模塊重新被激活,由于p0和p1被改變(這就是p0和p1放在敏感量列表中的原因),eq變量在第二個時鐘節拍賦予了新值。從以上分析,即使將以上語句的順序發生改變,也不會影響最終結果,因為eq的賦值以及always模塊的激活與這些語句的順序并沒關系。

總結:雖然兩種描述方法都可以描述同一電路,但是兩個電路的結果是有區別的,采用非阻塞賦值法描述仿真的時候花的時間更長一些,電路輸出結果在時序上也有微弱差別,鑒于此,我們有這么一條原則“在組合邏輯電路描述中采用阻塞賦值”。

2. 時序邏輯描述,采用非阻塞賦值方式賦值

就單獨一個寄存器來說,阻塞賦值和非阻塞賦值都可以描述存儲單元,如DFF可以描述為

always@(posedge clk)

q 《= d;

也可以描述為

always@(posedge clk)

q = d;

但是當設計中存在多個寄存器描述單元的時候,就會有細微的查別,假設有兩個寄存器在每個時鐘的上升沿進行數據交換,采用阻塞賦值描述如下:

always@(posedge clk)

a = b;

always@(posedge clk)

b = a;

在時鐘的上升沿,兩個always語句同時被激活并且并行執行,一個時鐘節拍后兩條語句執行結束,按照verilog語法標準,兩個always語句執行結果時間順序上誰都有可能在前面,這樣一來,如果第一個always語句執行在前面,由于阻塞賦值,所以變量a立即得到b的賦值,那么當第二個always塊執行之后,變量b得到a的賦值,由于剛才第一個always執行的時候b值賦予了a,所以現在b的值會維持不變,還是原來的值。

同樣的道理,如果第二個always模塊先執行了,那么a就會保持自身值不變,從Verilog語法角度來看,兩種結果都是有效的。但是從數字電路的角度來說,明顯引起了競爭。

下面我們將阻塞賦值修改為非阻塞賦值,以上代碼修改為:

always@(posedge clk)

a 《= b;

always@(posedge clk)

b 《= a;

采用非阻塞賦值,由于原始信號在賦值語句中使用,所以a和b都會得到正確的值,而與順序沒有關系。所以在時序邏輯描述中,阻塞賦值往往會引起條件競爭,所以要采用非阻塞賦值方式賦值。

總結一下

① 在組合邏輯電路描述中采用阻塞賦值

② 時序邏輯描述,采用非阻塞賦值方式賦值

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

    關注

    0

    文章

    9

    瀏覽量

    9188
  • VerilogHDL
    +關注

    關注

    2

    文章

    39

    瀏覽量

    19185
收藏 人收藏

    評論

    相關推薦

    “串口阻塞”你真的會用嗎?

    很久才會發出來,下子出來很多數據”。經過幫客戶檢查應用程序源碼,發現應用程序在串口阻塞方面沒有做正確的處理,修改后解決。阻塞打開串口open("/dev/tty
    的頭像 發表于 02-13 11:42 ?315次閱讀
    “串口<b class='flag-5'>阻塞</b>”你真的會用嗎?

    數組名之間可以直接賦值

    數組之間的賦值能不能直接使用等于號?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的頭像 發表于 11-26 11:23 ?286次閱讀

    TPA3004功放,開機保護,聲音阻塞,為什么?

    TPA3004功放,開機保護,聲音阻塞。過段時間,芯片發熱后正常。詢求問題解決方法
    發表于 11-08 08:30

    socket編程中的阻塞阻塞

    在網絡編程中, socket 是個非常重要的概念,它提供了個抽象層,使得開發者可以不必關心底層的網絡通信細節。 socket 編程中的阻塞
    的頭像 發表于 11-01 16:13 ?354次閱讀

    Verilog HDL的基礎知識

    本文繼續介紹Verilog HDL基礎知識,重點介紹賦值語句、阻塞阻塞、循環語句、同步與異步、函數與任務語法知識。
    的頭像 發表于 10-24 15:00 ?698次閱讀
    Verilog HDL的基礎知識

    socket阻塞阻塞的區別是什么

    在計算機編程中,socket 是種通信端點,用于在網絡中進行數據傳輸。Socket 可以是阻塞的或阻塞的,這兩種模式在處理數據傳輸時有不同的行為。
    的頭像 發表于 08-16 11:13 ?914次閱讀

    求助,關于CyU3PUsbHostEpWaitForCompletion函數中的阻塞問題求解

    主線程)調用該函數時,CyU3PUsbHostEpWaitForCompletion 函數經常阻塞,雖然指定了超時值,但從未返回。 我想應該在主程序線程中調用該函數,以避免出現阻塞問題。 如何正確使用該功能而不造成
    發表于 07-23 07:57

    如何在espconn_gethostbyname上創建阻塞線程?

    在 espconn_gethostbyname 上創建阻塞線程
    發表于 07-10 07:45

    是否可以使用Aurix中的CCU6模塊,以阻塞方式在檢測到GPIO下降沿時觸發中斷?

    我想知道,是否可以使用 Aurix 中的 CCU6 模塊,以阻塞方式在檢測到 GPIO 下降沿時觸發中斷? TC397 的示例代碼僅將其用于 PWM 生成和時鐘定時,但我很好奇如何將其用于 GPIO 邊沿檢測。
    發表于 07-04 07:00

    FPGA學習筆記---基本語法

    :task...endtask 11、循環語句:for 12、賦值符號:=和<=(阻塞阻塞賦值) 硬件設計的精髓,力求用最簡單的語
    發表于 06-23 14:58

    請問使用lwip創建socket,該如何做到阻塞的接收發送數據?

    請問使用lwip創建socket,該如何做到阻塞的接收發送數據?
    發表于 06-19 06:02

    如何讓write行為具有阻塞特性?

    spp_vfs_write 與 PC 端 socket 溝通:esp32 write, PC read.若 PC 端不執行 read 行為,esp32 持續 spp_vfs_write ,數據會發送到 PC 端嗎?還是在 esp32 設備端 ?謝謝。另如何讓 write 行為具有阻塞特性?謝謝。
    發表于 06-11 07:23

    關于Verilog的些基本語法

    、always@(邊沿觸發):阻塞賦值語句,對應時序邏輯電路。G、always@(電平觸發):阻塞賦值語句,對應組合邏輯電路。 注意:
    發表于 05-31 18:31

    為什么指針之間不要隨意賦值呢?

    指針之間也不能隨意賦值
    的頭像 發表于 03-28 17:13 ?816次閱讀
    為什么指針之間不要隨意<b class='flag-5'>賦值</b>呢?

    什么是阻塞阻塞

    什么是阻塞阻塞?我們就用管道的讀寫來舉例子。
    的頭像 發表于 03-25 10:04 ?613次閱讀
    主站蜘蛛池模板: 日韩欧美中文字幕在线二视频 | 性满足久久久久久久久 | 91欧洲在线视精品在亚洲 | 内射爽无广熟女亚洲 | 欧美视频毛片在线播放 | yellow免费观看在线 | 柠檬福利精品视频导航 | 久久婷婷色香五月综合激情 | 大地影院在线播放 | 强姧伦久久久久久久久 | 色欲色香天天天综合 | 国产亚洲视频在线播放香蕉 | 顶级欧美不卡一区二区三区 | 一区三区在线专区在线 | 色偷拍自怕亚洲在线 | 亚洲国产综合另类视频 | 中文字幕一区二区三区在线观看 | 正在播放国产精品 | 色婷婷综合久久久中文字幕 | 久久精品国产亚洲AV天美18 | 国产a视频视卡在线 | 日本高清不卡一区久久精品 | 青柠在线观看免费全集 | 久久操热在线视频精品 | 男女午夜性爽快免费视频不卡 | YELLOW视频在线观看最新 | 国产精品线路一线路二 | 久久久无码精品亚洲日韩按摩 | 99青草青草久热精品视频 | 古代荡乳尤物H妓女调教 | 啦啦啦 中国 日本 高清 在线 | 久九九精品免费视频 | 乌克兰少妇大胆大BBW | 国产一卡2卡3卡4卡孕妇网站 | 女人会操出水图 | 国产乱码免费卡1卡二卡3卡四卡 | 国产亚洲精品AV麻豆狂野 | 亚洲 国产 日韩 欧美 在线 | 久久这里只有精品国产精品99 | 交video| 脱女学小内内摸出水网站免费 |