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的作用也是語法的重要區別。以后有時間可以去區別。