Verilog中鎖存器與多路選擇器
-
Verilog是一種硬件描述語言,它代表的是硬件。
-
Verilog代表的就是邏輯門和連接線。
-
對於一個always@(*)控制的塊而言,只要塊中的表達式包含的任意的一個變量發生變化時,這個塊都會被重新讀取。
鎖存器
always塊不完整的敏感信號列表
if-else不完整結構
case忽略某些值
assign語句鎖存器
只對電平敏感(不考慮posedge和negedge邊沿敏感),且always塊中的敏感變量表中沒有包含在塊中出現的所有變量(稱為不完整的敏感變量表),那么這個塊的功能就是某種類型的鎖存器;
擁有完整的敏感變量列表則表明這是一個由組合們或者多路選擇器等組合而成的組合邏輯電路。
但如果控制條件中包含的if或cace忽略掉了某些值的話,那么即使敏感變量是完整的,也有可能出現鎖存的狀態。
代碼段一
always@(a,b,sel)
if(sel == 1'b1)
z = a;
else
z = b;
代碼段二
always@(*)
if(sel == 1'b1)
z = a;
else
z = b;
代碼段三
always@(sel)
if(sel == 1'b1)
z = a;
else
z = b;
代碼段四
always@(a,b)
if(sel == 1'b1)
z = a;
else
z = b;
代碼段一、二代表多路選擇器,因為
[1] 表達式中的所有變量都被包含在了敏感信號表中(完整的敏感變量列表)
[2] if中的每一個選項都被賦給了一個輸出(z)。
代碼段三、四代表兩種不同的鎖存器,當敏感表中的變量不發生變化時實現鎖存。
沒有控制結構的非標准鎖存器
always@(a,v)
z = a | b;
b值的變化對z的鎖存並無影響,這種類型的鎖存器通常是由敏感變量表中的輸入錯誤造成的。
透明鎖存器(可綜合的推薦寫法)
always@(*)
if(sel == 1'b1)
Q = D;
連續賦值的可綜合鎖存器
assign Z = (sel == 1'b1) ? D : Z;
避免鎖存器
采用組合邏輯實現的鎖存器的時序(包括可能出現的毛刺)容易出現問題。為了避免這些問題,應采用時鍾控制結構(即觸發器)二不是由使能控制的結構(即透明鎖存器)來保存數據,避免使用鎖存器。
參考資料
[1] Verilog數字VLSI設計教程 [美] John Williams 著 李林 等譯