黃 琳,王 新,胡成輝
(南京賽寶工業(yè)技術(shù)研究院,江蘇 南京 210000)
隨著數(shù)字化時(shí)代的發(fā)展,F(xiàn)PGA的應(yīng)用越來越廣泛,在航空航天,雷達(dá)電子,汽車等領(lǐng)域中發(fā)揮了重要作用。國際的FPGA公司XILINX、ALTERA等所出產(chǎn)的FPGA芯片容量也越來越大,各個(gè)行業(yè)的FPGA設(shè)計(jì)師在使用時(shí)會出現(xiàn)各種各樣的問題。跨時(shí)鐘域設(shè)計(jì)是各設(shè)計(jì)師必然會碰到的問題[1]。由于跨時(shí)鐘的異步系統(tǒng)內(nèi)含有多個(gè)時(shí)鐘源,它們存在頻率和相位的差異,當(dāng)他們用作寄存器的輸入時(shí)鐘時(shí)就可能違背建立時(shí)間和保持時(shí)間的要求,出現(xiàn)亞穩(wěn)態(tài)的現(xiàn)象[2]。
針對跨時(shí)鐘域設(shè)計(jì)中出現(xiàn)的問題,設(shè)計(jì)了一種基于底層FPGA硬件架構(gòu)為核心的FPGA跨時(shí)鐘域設(shè)計(jì),能夠讓設(shè)計(jì)師在進(jìn)行FPGA設(shè)計(jì)時(shí)充分理解程序在芯片上運(yùn)行的過程,避免時(shí)序錯(cuò)誤。
在FPGA的設(shè)計(jì)中,任何信號均需滿足“建立時(shí)間”和“保持時(shí)間”兩個(gè)參數(shù)?!敖r(shí)間”是指在時(shí)鐘沿到來之前,觸發(fā)器輸入信號必須保持穩(wěn)定的時(shí)間?!氨3謺r(shí)間”則是指在時(shí)鐘沿之后,信號必須要保持穩(wěn)定的時(shí)間。如果輸入信號不滿足這個(gè)規(guī)則,觸發(fā)器的輸出信號則會進(jìn)入亞穩(wěn)態(tài)。
在跨時(shí)鐘域的設(shè)計(jì)中,時(shí)鐘域A信號的翻轉(zhuǎn)時(shí)間和時(shí)鐘B沒有必然的聯(lián)系,則該信號進(jìn)入時(shí)鐘域B內(nèi)的觸發(fā)器時(shí)就有可能不滿足建立時(shí)間和保持時(shí)間的規(guī)則,由此出現(xiàn)時(shí)序程序運(yùn)行不穩(wěn)定、出現(xiàn)亞穩(wěn)態(tài)等現(xiàn)象。
如圖1所示的verilog程序。
圖1 跨時(shí)鐘域程序
圖1中的verilog代碼中,clk_en信號為來自另一個(gè)時(shí)鐘域的使能信號,cnt_en為本時(shí)鐘域的控制信號,其功能仿真結(jié)果如圖2所示。
圖2 功能仿真圖
在圖1中的例子中,期望的底層實(shí)現(xiàn)為:CE=clk_en&cnt_en;
R=rst|(~clk_en).
如圖3所示,信號通過與門和或門實(shí)現(xiàn)信號的使能和復(fù)位,最后進(jìn)行輸出。而實(shí)際FPGA底層運(yùn)行的硬件架構(gòu)如圖4所示。
圖3 期望的跨時(shí)鐘域底層實(shí)現(xiàn)圖
圖4 實(shí)際跨時(shí)鐘域底層信號實(shí)現(xiàn)圖
CE=~(clk_en&~(cnt_en))=(~clk_en)|cnt_en;
D=clk_en(Q+1):0
由于FPGA底層布局布線和所期望的布局布線不同,造成實(shí)際運(yùn)行時(shí)產(chǎn)生了亞穩(wěn)態(tài)的現(xiàn)象,具體到現(xiàn)象上,便會出現(xiàn)程序偶爾正常,偶爾不正常的現(xiàn)象出現(xiàn)。
當(dāng)異步信號clk_en拉起的時(shí)候,由于clk_en的上升沿到達(dá)時(shí)間是clk上升沿之前較長時(shí)間,由clk_en經(jīng)過組合邏輯產(chǎn)生的寄存器的使能FF_CE和數(shù)據(jù)FF_D的變化都滿足建立時(shí)間和保持時(shí)間,此時(shí),輸出的結(jié)果符合預(yù)期,如圖5所示。
圖5 程序正常時(shí)的時(shí)序圖
若當(dāng)clk_en拉起時(shí),clk_en的上升沿到達(dá)時(shí)間是CLK上升沿之前較短時(shí)間,并且由于寄存器使能FF_CE的延時(shí)較大,晚于CLK上升沿到達(dá)寄存器,再者由于寄存器數(shù)據(jù)FF_D的延時(shí)較小,早于CLK上升沿到達(dá)寄存器。此時(shí)在clk_en的上升沿便會出現(xiàn)一個(gè)不希望的計(jì)數(shù)值。如圖6所示。
圖6 程序異常時(shí)的時(shí)序圖
通過上面的分析,可以看出,出現(xiàn)該問題的原因是同時(shí)滿足了幾個(gè)條件,1)clk_en為跨時(shí)鐘域信號,無法保證其到達(dá)時(shí)間;2)實(shí)際的寄存器CE信號在clk_en為低時(shí)為高電平,不是期望的低電平;3)FF_CE的延時(shí)長,F(xiàn)F_D的延時(shí)短。
由于以上原因,造成在clk_en這個(gè)跨時(shí)鐘域信號來時(shí)無法滿足建立時(shí)間和保持時(shí)間,造成亞穩(wěn)態(tài)的產(chǎn)生。
由上節(jié)中的分析可知,當(dāng)跨時(shí)鐘域信號來時(shí),若不進(jìn)行處理,則無法保證不出現(xiàn)時(shí)序問題。針對該段程序的處理方法為避免對跨時(shí)鐘域信號的直接使用,采用同步復(fù)位的方式,并且恰當(dāng)調(diào)整分支語句的寫法,使FPGA底層布局布線能夠按照期望的進(jìn)行,修改后的程序如下所示。
圖7 修改后程序
FPGA底層實(shí)現(xiàn)框圖如圖8所示。
如圖8所示,修改后的程序不會出現(xiàn)由于clk_en為低的時(shí)候,寄存器CE為高電平,不是期望的低電平,因此不會出現(xiàn)亞穩(wěn)態(tài)的現(xiàn)象。
圖8 FPGA底層實(shí)現(xiàn)框圖
跨時(shí)鐘域問題在復(fù)雜的FPGA設(shè)計(jì)中是必不可少的。對于跨時(shí)鐘域的設(shè)計(jì),一般的設(shè)計(jì)師僅根據(jù)verilog語言的邏輯進(jìn)行程序編寫,這樣容易造成在FPGA進(jìn)行布局布線時(shí)不會按照期望的樣子進(jìn)行布局布線,因此,需要設(shè)計(jì)師理解底層FPGA布局布線的規(guī)則,根據(jù)其規(guī)則進(jìn)行程序編寫,這樣可減少在跨時(shí)鐘域設(shè)計(jì)過程中出現(xiàn)問題的概率,確保復(fù)雜FPGA設(shè)計(jì)的正確性,提高系統(tǒng)的可靠性。