在數字系統中,各模塊應采取盡量采取寄存輸入和寄存輸出,主要有以下優點:
1.模塊化清晰(特別是寄存輸出)
2.提高系統最高工作速率
3.有利於整個系統和單個模塊分別進行靜態時序分析
輸入電路
dina,dinb對應芯片的輸入引腳
always @(negedge rst or posedge clk)
if(!rst)
calc<=0;
else
calc<=dina+dinb;
always @(negedge rst or posedge clk)
if(!rst) begin
in_rega<=0;
in_regb<=0;
end
else begin
in_rega<=dina;
in_regb<=dinb;
end
always @(negedge rst or posedge clk)
if(!rst) begin
in_rega<=0;
in_regb<=0;
end
else begin
calc<=in_rega+regb;
end
如果輸入信號來自異步時鍾域,必須寄存兩拍。第一拍將輸入信號同步化,同步后的輸出可能帶來建立/保持時間的沖突,產生亞穩態,需要再寄存一拍,減少亞穩態帶來的影響。
如果輸入信號來自同一時鍾域且需要用到跳變沿,需要寄存一拍,否則時序報告會clock shew > data delay,造成建立/保持時間的沖突。
對於一般模塊的輸入信號來說,如果信號來自同一時鍾域,各模塊的輸入不需要寄存,只要滿足建立時間、保持時間的約束,就可以保證在時鍾的上升沿到來時,輸入信號已經穩定。
但是,如果模塊需要使用輸入信號的跳邊沿,則需要處理(邊沿檢測等)。對於異步時鍾域,邊沿檢測,格雷碼,異步FIFO,RAM等
總結如下:
1.全局時鍾的跳變沿最可靠。
2.來自異步時鍾域的輸入需要寄存一次以同步化,再寄存一次以減少亞穩態帶來的影響。
3.不需要用到跳變沿的來自同一時鍾域的輸入,沒有必要對信號進行寄存。
4.需要用到跳變沿的來自同一時鍾域的輸入,寄存一次即可。
5.需要用到跳變沿的來自不同時鍾域的輸入,需要用到3個觸發器,前兩個用以同步,第3個觸發器的輸出和第2個的輸出經過邏輯門來判斷跳變沿。
always @ (posedge Clk) //不對輸入信號進行寄存
begin
if (inputs)
begin
...
end
...
end
always @ (posedge Clk) //對輸入信號寄存一拍
begin
inputs_reg <= inputs;
if (inputs_reg == 1'b0 && inputs == 1'b1)
begin
...
end
...
end
always @ (posedge Clk) //對輸入信號寄存三拍
begin
inputs_reg1 <= inputs;
inputs_reg2 <= inputs_reg1;
inputs_reg3 <= inputs_reg2;
if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0)
begin
...
end
...
end
輸出電路
tempa tempb為管腳輸出信號
always @(tempa or tempb)
case(tempa)
0:dout<=tempb+1;
1:dout<=tempb+3;
......
default:dout<=0;
endcase
always @(negedge rst or posedge clk)
if(!rst)
dout<=0;
else
case(tempa)
0:dout<=tempb+1;
1:dout<=tempb+3;
......
default:dout<=0;
endcase