FPGA中如何對管腳輸入輸出信號進行處理?


在數字系統中,各模塊應采取盡量采取寄存輸入和寄存輸出,主要有以下優點:

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


免責聲明!

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



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