最常用的約束有IO管腳位置約束和電平幅度約束,這個很好理解。另外,就是對時鐘網絡約束。這個是很重要的。比如你的系統中,驅動的電路的時鐘是27M的,那么你需要在約束文件中增加類似如下的約束語句
NET REF_CLK27M TNM_NET = REF_CLK27M_grp;
TIMESPEC TS_REF_CLK27M = PERIOD REF_CLK27M_grp : 37ns HIGH 50 %;
這樣的話,工具在布線的時候,就會知道這個時鐘所驅動的所有網絡必須滿足至少27M速度的要求,占空比為50%。它會任意布線,就有可能出現信號翻轉的很慢,或者延時很長,建立時間保持時間不足,在實際中造成timing錯誤。一般來說,十幾兆以上的時鐘網絡最好都加類似的約束,在時鐘上就可以了,工具會幫你把它所驅動的所有網絡都加上約束的。
另外,常用的約束還有delay,skew等,具體的你可以到Xilinx網站上下載專門有關Constains的文檔學習一下。
我們將問題分解為2部分,來自同步時鐘域信號的處理和來自異步時鐘域信號的處理。前者要簡單許多,所以先討論前者,再討論后者。
1.同步時鐘域信號的處理
一般來說,在全同步設計中,如果信號來自同一時鐘域,各模塊的輸入不需要寄存。只要滿足建立時間,保持時間的約束,可以保證在時鐘上升沿到來時,輸入信號已經穩定,可以采樣得到正確的值。但是如果模塊需要使用輸入信號的跳變沿(比如幀同步信號),千萬不要直接這樣哦。
always @ (posedge inputs)
begin
...
end
因為這個時鐘inputs很有問題。如果begin ... end語句段涉及到多個D觸發器,你無法保證這些觸發器時鐘輸入的跳變沿到達的時刻處于同一時刻(準確的說是相差在一個很小的可接受的范圍)。因此,如果寫出這樣的語句,EDA工具多半會報clock skew 》 data delay,造成建立/保持時間的沖突。本人曾經也寫出過這樣的語句,當時是為了做分頻,受大二學的數字電路的影響,直接拿計數器的輸出做了后面模塊的時鐘。當初用的開發工具是max+plusII,編譯也通過了,燒到板子上跑倒也能跑起來(估計是因為時鐘頻率較低,6M),但后來拿到QuartusII中編譯就報clock skew 》 data delay。大家可能會說分頻電路很常見的啊,分頻輸出該怎么用呢。我一直用的方法是采用邊沿檢測電路,用HDL語言描述大概是這樣:
always @ (posedge Clk)
begin
inputs_reg 《= inputs;
if (inputs_reg == 1‘b0 && inputs == 1’b1)
begin
...
end
...
end
這是上跳沿檢測的電路,下跳沿電路大家依此類推。
2.異步時鐘域信號的處理
這個問題也得分單一信號和總線信號來討論。
2.1單一信號(如控制信號)的處理
如果這個輸入信號來自異步時鐘域(比如FPGA芯片外部的輸入),一般采用同步器進行同步。最基本的結構是兩個緊密相連的觸發器,第一拍將輸入信號同步化,同步化后的輸出可能帶來建立/保持時間的沖突,產生亞穩態。需要再寄存一拍,減少(注意是減少)亞穩態帶來的影響。這種最基本的結構叫做電平同步器。
如果我們需要用跳變沿而不是電平又該怎樣處理呢,還記得1里面講的邊沿檢測電路么?在電平同步器之后再加一級觸發器,用第二級觸發器的輸出和第三級觸發器的輸出來進行操作。這種結構叫做邊沿同步器。
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
以上兩種同步器在慢時鐘域信號同步入快時鐘域時工作的很好,但是反過來的話,可能就工作不正常了。舉一個很簡單的例子,如果被同步的信號脈沖只有一個快時鐘周期寬,且位于慢時鐘的兩個相鄰跳變沿之間,那么是采不到的。這時就需要采用脈沖同步器。這種同步器也是由3個觸發器組成,同時需要對發送信號做一些處理,具體結構大家可以在網上搜。
2.2總線信號的處理
如果簡單的對異步時鐘域過來的一組信號分別用同步器的話,那么對這一組信號整體而言,亞穩態出現的幾率將大大上升。基于這一觀點,對于總線信號的處理可以有兩種方式。
如果這組信號只是順序變化的話(如存儲器的地址),可以將其轉換為格雷碼后再發送,由于格雷碼相鄰碼字只相差一個比特,上面說的同步器可以很好的發揮作用。
但是如果信號的變化是隨機的(如存儲器的數據),這種方法便失效了,這時可以采用握手的方式或者采用FIFO或DPRAM進行緩存。RAM緩存的方式在突發數據傳輸中優勢比較明顯,現在高檔一點的FPGA中都有不少的BlockRAM資源,且支持配置為DPRAM或FIFO,這種處理方法在通信電路中非常常用。
責任編輯:haq
-
FPGA
+關注
關注
1629文章
21748瀏覽量
603856 -
信號
+關注
關注
11文章
2791瀏覽量
76824
原文標題:FPGA中對異步信號的處理
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論