verilog基本語法之always和assign


always和assign的作用

一、語法定義

assign,連續賦值。always,敏感賦值。連續賦值,就是無條件全等。敏感賦值,就是有條件相等。assign的對象是wire,always的對象是reg。這就是語法約束。

二、功能差異

assign對應電路下連線操作。always對應插入敏感控制連線。這里容易混淆的就是assign綜合的一定是組合電路,但是always綜合的不一定是時序電路。always的敏感列表使用*號就可以等效綜合為組合電路。如果使用的是電平觸發,也使會綜合成相應的組合電路。只有出現邊沿觸發時,才會綜合成時序電路。而時序電路,基礎就是時鍾和使能兩個關鍵信號。時鍾在always模塊中不再出現(時鍾信號在敏感信號作用下的值一直相等,沒有使用在內部的意義,當然可以轉化后使用)。而對於使能信號,則是會有一個if判斷語句,而且處於第一優先級。這就是異步復位。如果不在敏感列表而處於第一優先級,則是同步復位信號。

從上面的描述可以看到:always可以實現兩種電路,是不是可以不用assign來實現設計?理論上可以,但是會加大設計的難度。首先要明確的是,always只能對reg變量賦值,這導致wire變量賦值困難。如果沒有assign,每個wire變量都要加入一個reg緩沖。可以簡單理解:開始時只有always,可以實現基本的功能,然后將其中的組合邏輯提取出來構成assign。同時引入了wire。也就是assign是always的補充(只是方便理解,沒有根據)。

三、實際應用

使用assign和always構建加法器:

always@(*)begin
    a<=b+c;
end

assign a=b+c;

四。拓展

在上面的學習中可以看到,reg和wire的作用也是語法的重要區別。以后有時間可以去區別。


免責聲明!

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



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