1. 程式人生 > >總結五個面試中經常會遇到的FPGA基本概念

總結五個面試中經常會遇到的FPGA基本概念

1、什麼是Setup 和Holdup時間?

答:Setup/hold time 是測試晶片對輸入訊號和時鐘訊號之間的時間要求。

建立時間是指觸發器的時鐘訊號上升沿到來以前,資料穩定不變的時間。輸入訊號應提前時鐘上升沿(如上升沿有效)T時間到達晶片,這個T就是建立時間-Setup time。如不滿足setup time,這個資料就不能被這一時鐘打入觸發器,只有在下一個時鐘上升沿,資料才能被打入觸發器。

保持時間是指觸發器的時鐘訊號上升沿到來以後,資料穩定不變的時間。如果holdtime不夠,資料同樣不能被打入觸發器。

2、什麼是競爭與冒險現象?解決辦法?

答:在組合邏輯中,由於門的輸入訊號通路中經過了不同的延時,導致到達該門的時間不一致叫競爭。產生毛刺叫冒險。如果布林式中有相反的訊號則可能產生競爭和冒險現象。
解決方法:一是添加布爾式的消去項,二是在晶片外部加電容。三加選通訊號。 用D觸發器,格雷碼計數器,同步電路等優秀的設計方案可以消除。

3、如何解決亞穩態? Metastability

答:亞穩態是指觸發器無法在某個規定時間段內達到一個可確認的狀態。當一個觸發器進入亞穩態時,既無法預測該單元的輸出電平,也無法預測何時輸出才能穩定在某個正確的電平上。在這個穩定期間,觸發器輸出一些中間級電平,或者可能處於振盪狀態,並且這種無用的輸出電平可以沿訊號通道上的各個觸發器級聯式傳播下去。
解決方法:
1 、降低系統時鐘頻率
2 、用反應更快的Flip-Flop
3 、引入同步機制,防止亞穩態傳播
4 、改善時鐘質量,用邊沿變化快速的時鐘訊號

關鍵是器件使用比較好的工藝和時鐘週期的裕量要大。

4、說說靜態、動態時序模擬的優缺點

靜態時序分析是採用窮盡分析方法來提取出整個電路存在的所有時序路徑,計算訊號在這些路徑上的傳播延時,檢查訊號的建立和保持時間是否滿足時序要求,通過對最大路徑延時和最小路徑延時的分析,找出違背時序約束的錯誤.它不需要輸入向量就能窮盡所有的路徑,且執行速度很快、佔用記憶體較少,不僅可以對晶片設計進行全面的時序功能檢查,而且還可利用時序分析的結果來優化設計,因此靜態時序分析已經越來越多地被用到數字積體電路設計的驗證中。

動態時序模擬就是通常的模擬,因為不可能產生完備的測試向量,覆蓋門級網表中的每一條路徑.因此在動態時序分析中,無法暴露一些路徑上可能存在的時序問題;

靜態時序分析缺點:
1、無法識別偽路徑
2、不適合非同步電路
3、不能驗證功能

5、用VERILOG寫一段程式碼,實現消除一個glitch。

濾掉小於1個週期glitch的原理圖如下:
在這裡插入圖片描述

verilog程式碼實現如下:

module digital_filter_(clk_in,rst,host_rst,host_rst_filter);
input  clk_in;
input  rst;
input  host_rst;
output host_rst_filter;
reg host_rst_d1;
reg host_rst_d2;

[email protected](posedge clk_in or negedge rst)
  begin
    if(~rst)
    begin
        host_rst_d1 <= 1'b1;
        host_rst_d2 <= 1'b1;
       end
    else
      begin
        host_rst_d1 <= host_rst;
        host_rst_d2 <= host_rst_d1;
      end
  end
  
assign host_rst_filter = host_rst_d1 | host_rst_d2;
endmodule

濾掉大於1個週期且小於2個週期glitch的原理圖如下:
verilog程式碼實現如下:

module digital_filter_(clk_in,rst,host_rst,host_rst_filter);
input  clk_in;
input  rst;
input  host_rst;
output host_rst_filter;
reg host_rst_d1;
reg host_rst_d2;
reg host_rst_d3;

[email protected](posedge clk_in or negedge rst)
  begin
    if(~rst)
    begin
        host_rst_d1 <= 1'b1;
        host_rst_d2 <= 1'b1;
        host_rst_d3 <= 1'b1;
      end
    else
  begin
        host_rst_d1 <= host_rst;
        host_rst_d2 <= host_rst_d1;
        host_rst_d3 <= host_rst_d2;
       end
  end
  
assign host_rst_filter = host_rst_d1 | host_rst_d2 | host_rst_d3;
endmodule

PS:這是我自己採用的方式,上述方法消除毛刺是需要一定條件的,並不能保證一定可以消除。