1. 程式人生 > 實用技巧 >verilog設計知識集合(2)

verilog設計知識集合(2)

verilog設計知識集合(2)

1、阻塞與非阻塞

阻塞賦值是存在先後關係的,非阻塞是不存在先後關係的。一般而言,阻塞用於組合邏輯,非阻塞用於時序邏輯(不一定)。阻塞的執行時逐步賦值,非阻塞是同步賦值。

阻塞和C中的賦值語句功能是一致的。為何會存在非阻塞賦值呢?這裡主要考慮的是暫存器的狀態包含現狀態和下一狀態,這使得硬體電路存在一個變數賦值給另外一個變數時還可以將其他變數賦值給它的操作,這和儲存器的工作方式不大一樣。顯然,這種賦值方法更加高效且匹配暫存器。所以,非阻塞賦值也就有了應用場景了。

model fbosc1(y1, y2, clk, rst);
output y1, y2;
input
clk, rst; reg y1, y2; always @ (posedge clk or posedge rst) if (rst) y1 = 0; else y1 = y2; always @ (posedge clk or posedge rst) if (rst) y2 = 1; else y2 = y1; endmodule

摘錄一個反饋振盪器的工作來說明其工作的方式。這裡使用的是阻塞賦值,在rst到達always塊時,訊號阻塞賦值,哪個先到先執行哪一個。換言之,這個時候存在因延時導致輸出不同的亞穩態。

2、隱藏的鎖存器

如果使用電平觸發,而電平敏感源不能包括所有變化訊號,則可能形成鎖存器(也可能是冗餘邏輯)。在前面的數位電路之MOS設計中粗略的介紹了鎖存器的作用。一般而言,不使用鎖存器加入設計,除非掌握了相應的設計方法。

3、賦值語句的特點

always塊並行處理,所以不能在不同的always塊中對同一變數賦值,構成時序衝突。

(小技巧:可以通過對某一變數賦值'bx,這時就會解釋為無關變數,得到最簡潔的電路)

4、基本程式設計要點

1️⃣時序電路採用非阻塞賦值2️⃣鎖存器使用非阻塞3️⃣always建模組合邏輯時採用阻塞邏輯(這一點和習慣不同,注意區分,雖然單條語句沒有區別,但是多條語句是存在區別的)。

4️⃣不要混用5️⃣$strobe顯示阻塞賦值語句的值,$display顯示非阻塞語句的值

5、同步設計的幾個

1️⃣所有資料通過組合邏輯和觸發器2️⃣延時由同步延時單元控制3️⃣組合邏輯不能形成自反饋4️⃣時鐘不能門控5️⃣資料訊號必須通向組合或者延時單元

總之,不能違背數位電路的基本要求。

6、競爭條件

由於延時導致輸出競爭的現象,一般出現在延時單元。比如clk和rst接在一起,兩者都是邊沿觸發(非同步復位),這是就存在訊號由於always內部延時產生不同的結果的現象。

7、閘電路延時

使用閘電路產生脈衝,這是數位電路中常用的方法。採用一個雙反相器做成的延時加上一個邏輯閘即可。不過現在一般採用PLL生成不同的頻率時鐘。這種脈衝使用較少。

8、違背建立時間和保持時間

違背建立時間,時鐘頻率需要放緩;違背保持時間,訊號需要加入buff緩衝。

9、脈衝毛刺

這個在數位電路中比較常見了,毛刺一般來自於邏輯閘的延時,消除方法就是使用暫存器同步一下。

10、門控時鐘的危害

門控時鐘的主要缺點是將邏輯閘延時帶入時鐘訊號,會打亂其他暫存器與門控時鐘驅動的暫存器的相對延時,造成某些資料的丟失。

11、非同步訊號的亞穩定

一般來說,非同步訊號的採集由於不能喝同步訊號保持確認的關係,容易產生亞穩態(即採集的訊號失敗)和建立保持時間失效的現象。

12、可以使用的非同步訊號

非同步復位訊號rst。