8、FPGA時(shí)鐘系統(tǒng)
1. FPGA的全局時(shí)鐘是什么?
FPGA的全局時(shí)鐘應(yīng)該是從晶振分出來(lái)的,最原始的頻率。其他需要的各種頻率都是在這個(gè)基礎(chǔ)上利用PLL或者其他分頻手段得到的。
2. 全局時(shí)鐘和BUFG:
BUFG,輸入為固定管腳,輸出為H型全銅全局高速網(wǎng)絡(luò),這樣抖動(dòng)和到任意觸發(fā)器的延時(shí)差最小,這個(gè)也就是FPGA做同步設(shè)計(jì)可以不需要做后仿真的原因。
全局時(shí)鐘:今天我們從另一個(gè)角度來(lái)看一下時(shí)鐘的概念:時(shí)鐘是D觸發(fā)器的重要組成部分,一個(gè)有效邊沿使得D觸發(fā)器進(jìn)行一次工作。而更多的時(shí)候,D觸發(fā)器保持住上次的值。對(duì)于D觸發(fā)器來(lái)說(shuō),可以將輸入信號(hào)和時(shí)鐘作比較。也許你會(huì)問(wèn),這么比較有什么意義。首先看我們比較得出什么東西:
翻轉(zhuǎn)率:R=Dr/Crx100%
就是D觸發(fā)器改變一次值與時(shí)鐘有效沿個(gè)數(shù)的比值。
舉例:你寫(xiě)了一個(gè)來(lái)一個(gè)時(shí)鐘有效沿就取一次反的電路,那么他的翻轉(zhuǎn)率就是100%,翻轉(zhuǎn)率和你的FPGA的功率有很大關(guān)系,翻轉(zhuǎn)率越高,F(xiàn)PGA功率越高。
3. 全局時(shí)鐘不夠用是什么意思?
因?yàn)槿謺r(shí)鐘需要驅(qū)動(dòng)很多模塊,所以全局時(shí)鐘引腳需要有很大的驅(qū)動(dòng)能力,F(xiàn)PGA一般都有一些專(zhuān)門(mén)的引腳用于作為全局時(shí)鐘用,他們的驅(qū)動(dòng)能力比較強(qiáng)。但是如果這些引腳用完了,就只能用一般的引腳了,而他們的驅(qū)動(dòng)能力不強(qiáng),有可能不能滿(mǎn)足你的時(shí)序要求。(驅(qū)動(dòng)能力小的,產(chǎn)生的延遲會(huì)大一些)
理論上,F(xiàn)PGA的任意一個(gè)管腳都可以作為時(shí)鐘輸入端口,但是FPGA專(zhuān)門(mén)設(shè)計(jì)了全局時(shí)鐘,全局時(shí)鐘總線是一條專(zhuān)用總線,到達(dá)片內(nèi)各部分觸發(fā)器的時(shí)間最短,所以用全局時(shí)鐘芯片工作最可靠,但是如果你設(shè)計(jì)的時(shí)候時(shí)鐘太多,F(xiàn)PGA上的全局時(shí)鐘管腳用完了就出現(xiàn)不夠用的情況。
4. 什么是第二全局時(shí)鐘?
比如我有一個(gè)同步使能信號(hào),連接到FPGA內(nèi)部80%的資源(但不是時(shí)鐘),這個(gè)時(shí)候,你的信號(hào)走線到達(dá)各個(gè)D觸發(fā)器的延遲差很大,或者翻轉(zhuǎn)率比較大的時(shí)候(>40%),這個(gè)時(shí)候你就需要使用第二全局時(shí)鐘資源。
第二全局時(shí)鐘資源的驅(qū)動(dòng)能力和時(shí)鐘抖動(dòng)延遲等指標(biāo)僅次于全局時(shí)鐘信號(hào)。第二全局時(shí)鐘資源其實(shí)是通過(guò)片內(nèi)的高速行列總線來(lái)實(shí)現(xiàn)的,而不像全局時(shí)鐘總線是一條專(zhuān)用總線。第二全局時(shí)鐘總線是通過(guò)軟件布線得到的,所以硬指標(biāo)肯定是拼不過(guò)全局時(shí)鐘總線。特別是當(dāng)你在已經(jīng)有80%以上的布線率的情況下,可能會(huì)出現(xiàn)約束第二全局時(shí)鐘資源失敗的情況。
5.CCLK:
CCLK:FPGA同步配置時(shí)鐘。如果配置模式為主模式,則該時(shí)鐘由FPGA器件生成,并輸出;如果配置模式為從模式,則該時(shí)鐘由外部提供;
當(dāng)所配置的數(shù)據(jù)存放在PROM中,即通過(guò)PROM來(lái)配置器件時(shí),必須選擇CCLK時(shí)鐘;
USER CLOCK:用戶(hù)定義的配置時(shí)鐘信號(hào),該配置時(shí)鐘目前很少采用;
JTAG CLOCK:JTAG模式的配置時(shí)鐘,該時(shí)鐘提供給內(nèi)部的JTAG控制邏輯。
默認(rèn)值為:CCLK
6. CCLK是怎么產(chǎn)生的:
CCLK的產(chǎn)生根據(jù)配置模式不同而不同,如果設(shè)置為Master模式,則由內(nèi)部的震蕩電路產(chǎn)生,作為外部ROM的工作時(shí)鐘,默認(rèn)為6MHZ,可通過(guò)配置選項(xiàng)設(shè)置;如果設(shè)置為Slave模式,則由計(jì)算機(jī)(或其他下載設(shè)備)提供,作為芯片內(nèi)部下載電路的工作時(shí)鐘;在JTAG模式情況下,CCLK不輸出,此時(shí)芯片內(nèi)部下載電路時(shí)鐘由內(nèi)部震蕩電路提供,TCK僅用作邊界掃描相關(guān)電路時(shí)鐘。
補(bǔ)充:FPGA的主配置模式中,CCLK信號(hào)是如何產(chǎn)生的?
CCLK是由FPGA內(nèi)部一個(gè)晶振電路產(chǎn)生的,同時(shí)ISE的軟件在生成BIT流文件時(shí),有個(gè)CCLK CONFIG選項(xiàng),這個(gè)選項(xiàng)只有在時(shí)鐘為CCLK時(shí)才可以起作用,可以在4-60MHz選擇,可以控制CCLK的頻率。
在主從模式配置,配置數(shù)據(jù)的前60個(gè)字節(jié)導(dǎo)入FPGA之前,CCLK一直是2.5MHz,接下來(lái)由于前60個(gè)配置字節(jié)的作用,CCLK改為CONFIG設(shè)定的頻率,直到結(jié)束,一般CONFIG默認(rèn)的頻率是4MHz.
7. FPGA中全局時(shí)鐘怎么用???是把時(shí)鐘接到FPGA的全局時(shí)鐘輸入引腳后,就起到全局時(shí)鐘的作用了,還是在編譯時(shí)需要制定某個(gè)時(shí)鐘為全局時(shí)鐘阿?
其實(shí)全局時(shí)鐘的使用關(guān)鍵在你的代碼… 如果你的代碼中只用了一個(gè)時(shí)鐘作為所有的或者大部分觸發(fā)器的時(shí)鐘,編譯器自然會(huì)把它編譯為全局時(shí)鐘。當(dāng)然硬件連接上還是用全局時(shí)鐘引腳較好,尤其是帶PLL的,不是所有的全局時(shí)鐘腳都能用PLL。
無(wú)淪是用離散邏輯、可編程邏輯,還是用全定制硅器件實(shí)現(xiàn)的任何數(shù)字設(shè)計(jì),為了成功地操作,可靠的時(shí)鐘是非常關(guān)鍵的。設(shè)計(jì)不良的時(shí)鐘在極限的溫度、電壓或制造工藝的偏差情況下將導(dǎo)致錯(cuò)誤的行為,并且調(diào)試?yán)щy、花銷(xiāo)很大。 在設(shè)計(jì)PLD/FPGA時(shí)通常采用幾種時(shí)鐘類(lèi)型。時(shí)鐘可分為如下四種類(lèi)型:全局時(shí)鐘、門(mén)控時(shí)鐘、多級(jí)邏輯時(shí)鐘和波動(dòng)式時(shí)鐘。多時(shí)鐘系統(tǒng)能夠包括上述四種時(shí)鐘類(lèi)型的任意組合。
1.全局時(shí)鐘
對(duì)于一個(gè)設(shè)計(jì)項(xiàng)目來(lái)說(shuō),全局時(shí)鐘(或同步時(shí)鐘)是最簡(jiǎn)單和最可預(yù)測(cè)的時(shí)鐘。在PLD/FPGA設(shè)計(jì)中最好的時(shí)鐘方案是:由專(zhuān)用的全局時(shí)鐘輸入引腳驅(qū)動(dòng)的單個(gè)主時(shí)鐘去鐘控設(shè)計(jì)項(xiàng)目中的每一個(gè)觸發(fā)器。只要可能就應(yīng)盡量在設(shè)計(jì)項(xiàng)目中采用全局時(shí)鐘。PLD/FPGA都具有專(zhuān)門(mén)的全局時(shí)鐘引腳,它直接連到器件中的每一個(gè)寄存器。這種全局時(shí)鐘提供器件中最短的時(shí)鐘到輸出的延時(shí)。
圖1 示出全局時(shí)鐘的實(shí)例。圖1 定時(shí)波形示出觸發(fā)器的數(shù)據(jù)輸入D[1..3]應(yīng)遵守建立時(shí)間和保持時(shí)間的約束條件。建立和保持時(shí)間的數(shù)值在PLD數(shù)據(jù)手冊(cè)中給出,也可用軟件的定時(shí)分析器計(jì)算出來(lái)。如果在應(yīng)用中不能滿(mǎn)足建立和保持時(shí)間的要求,則必須用時(shí)鐘同步輸入信號(hào)(參看下一章“異步輸入”)。
圖1 全局時(shí)鐘
?。ㄗ詈玫姆椒ㄊ怯萌謺r(shí)鐘引腳去鐘控PLD內(nèi)的每一個(gè)寄存器,于是數(shù)據(jù)只要遵守相對(duì)時(shí)鐘的建立時(shí)間tsu和保持時(shí)間th)
2.門(mén)控時(shí)鐘
在許多應(yīng)用中,整個(gè)設(shè)計(jì)項(xiàng)目都采用外部的全局時(shí)鐘是不可能或不實(shí)際的。PLD具有乘積項(xiàng)邏輯陣列時(shí)鐘(即時(shí)鐘是由邏輯產(chǎn)生的),允許任意函數(shù)單獨(dú)地鐘控各個(gè)觸發(fā)器。然而,當(dāng)你用陣列時(shí)鐘時(shí),應(yīng)仔細(xì)地分析時(shí)鐘函數(shù),以避免毛刺。
通常用陣列時(shí)鐘構(gòu)成門(mén)控時(shí)鐘。門(mén)控時(shí)鐘常常同微處理器接口有關(guān),用地址線去控制寫(xiě)脈沖。然而,每當(dāng)用組合函數(shù)鐘控觸發(fā)器時(shí),通常都存在著門(mén)控時(shí)鐘。如果符合下述條件,門(mén)控時(shí)鐘可以象全局時(shí)鐘一樣可靠地工作:
1.驅(qū)動(dòng)時(shí)鐘的邏輯必須只包含一個(gè)“與”門(mén)或一個(gè)“或”門(mén)。如果采用任何附加邏在某些工作狀態(tài)下,會(huì)出現(xiàn)競(jìng)爭(zhēng)產(chǎn)生的毛刺。
2.邏輯門(mén)的一個(gè)輸入作為實(shí)際的時(shí)鐘,而該邏輯門(mén)的所有其它輸入必須當(dāng)成地址或控制線,它們遵守相對(duì)于時(shí)鐘的建立和保持時(shí)間的約束。
圖2和圖3 是可靠的門(mén)控時(shí)鐘的實(shí)例。在 圖2 中,用一個(gè)“與”門(mén)產(chǎn)生門(mén)控時(shí)鐘,在 圖3 中,用一個(gè)“或”門(mén)產(chǎn)生門(mén)控時(shí)鐘。在這兩個(gè)實(shí)例中,引腳nWR和nWE考慮為時(shí)鐘引腳,引腳ADD[o..3]是地址引腳,兩個(gè)觸發(fā)器的數(shù)據(jù)是信號(hào)D[1..n]經(jīng)隨機(jī)邏輯產(chǎn)生的。
圖2 “與”門(mén)門(mén)控時(shí)鐘
圖3 “或”門(mén)門(mén)控時(shí)鐘
圖2和圖3 的波形圖顯示出有關(guān)的建立時(shí)間和保持時(shí)間的要求。這兩個(gè)設(shè)計(jì)項(xiàng)目的地址線必須在時(shí)鐘保持有效的整個(gè)期間內(nèi)保持穩(wěn)定(nWR和nWE是低電平有效)。如果地址線在規(guī)定的時(shí)間內(nèi)未保持穩(wěn)定,則在時(shí)鐘上會(huì)出現(xiàn)毛刺,造成觸發(fā)器發(fā)生錯(cuò)誤的狀態(tài)變化。另一方面,數(shù)據(jù)引腳D[1..n]只要求在nWR和nWE的有效邊沿處滿(mǎn)足標(biāo)準(zhǔn)的建立和保持時(shí)間的規(guī)定。
我們往往可以將門(mén)控時(shí)鐘轉(zhuǎn)換成全局時(shí)鐘以改善設(shè)計(jì)項(xiàng)目的可靠性。圖4 示出如何用全局時(shí)鐘重新設(shè)計(jì) 圖2 的電路。地址線在控制D觸發(fā)器的使能輸入,許多PLD設(shè)計(jì)軟件,如MAX+PLUSII軟件都提供這種帶使能端的D觸發(fā)器。當(dāng)ENA為高電平時(shí),D輸入端的值被鐘控到觸發(fā)器中:當(dāng)ENA為低電平時(shí),維持現(xiàn)在的狀態(tài)。
圖4 “與”門(mén)門(mén)控時(shí)鐘轉(zhuǎn)化成全局時(shí)鐘
圖4 中重新設(shè)計(jì)的電路的定時(shí)波形表明地址線不需要在nWR有效的整個(gè)期間內(nèi)保持穩(wěn)定;而只要求它們和數(shù)據(jù)引腳一樣符合同樣的建立和保持時(shí)間,這樣對(duì)地址線的要求就少很多。
圖 給出一個(gè)不可靠的門(mén)控時(shí)鐘的例子。3位同步加法計(jì)數(shù)器的RCO輸出用來(lái)鐘控觸發(fā)器。然而,計(jì)數(shù)器給出的多個(gè)輸入起到時(shí)鐘的作用,這違反了可靠門(mén)控時(shí)鐘所需的條件之一。在產(chǎn)生RCO信號(hào)的觸發(fā)器中,沒(méi)有一個(gè)能考慮為實(shí)際的時(shí)鐘線,這是因?yàn)樗杏|發(fā)器在幾乎相同的時(shí)刻發(fā)生翻轉(zhuǎn)。而我們并不能保證在PLD/FPGA內(nèi)部QA,QB,QC到D觸發(fā)器的布線長(zhǎng)短一致,因此,如 圖5 的時(shí)間波形所示,在器從3計(jì)到4時(shí),RCO線上會(huì)出現(xiàn)毛刺(假設(shè)QC到D觸發(fā)器的路徑較短,即QC的輸出先翻轉(zhuǎn))。
圖5 不可靠的門(mén)控時(shí)鐘
(定時(shí)波形示出在計(jì)數(shù)器從3到4改變時(shí),RCO信號(hào)如何出現(xiàn)毛刺的)
圖6 給出一種可靠的全局鐘控的電路,它是圖5不可靠計(jì)數(shù)器電路的改進(jìn),RCO控制D觸發(fā)器的使能輸入。這個(gè)改進(jìn)不需要增加PLD的邏輯單元。
圖6 不可靠的門(mén)控時(shí)鐘轉(zhuǎn)換為全局時(shí)鐘
(這個(gè)電路等效于圖5電路,但卻可靠的多)
3.多級(jí)邏輯時(shí)鐘
當(dāng)產(chǎn)生門(mén)控時(shí)鐘的組合邏輯超過(guò)一級(jí)(即超過(guò)單個(gè)的“與”門(mén)或“或”門(mén))時(shí),證設(shè)計(jì)項(xiàng)目的可靠性變得很困難。即使樣機(jī)或仿真結(jié)果沒(méi)有顯示出靜態(tài)險(xiǎn)象,但實(shí)際上仍然可能存在著危險(xiǎn)。通常,我們不應(yīng)該用多級(jí)組合邏輯去鐘控PLD設(shè)計(jì)中的觸發(fā)器。
圖7給出一個(gè)含有險(xiǎn)象的多級(jí)時(shí)鐘的例子。時(shí)鐘是由SEL引腳控制的多路選擇器輸出的。多路選擇器的輸入是時(shí)鐘(CLK)和該時(shí)鐘的2分頻(DIV2)。由圖7 的定時(shí)波形圖看出,在兩個(gè)時(shí)鐘均為邏輯1的情況下,當(dāng)SEL線的狀態(tài)改變時(shí),存在靜態(tài)險(xiǎn)象。險(xiǎn)象的程度取決于工作的條件。 多級(jí)邏輯的險(xiǎn)象是可以去除的。例如,你可以插入“冗余邏輯”到設(shè)計(jì)項(xiàng)目中。然而,PLD/FPGA編譯器在邏輯綜合時(shí)會(huì)去掉這些冗余邏輯,使得驗(yàn)證險(xiǎn)象是否真正被去除變得困難了。為此,必須應(yīng)尋求其它方法來(lái)實(shí)現(xiàn)電路的功能。
圖8給出圖7電路的一種單級(jí)時(shí)鐘的替代方案。圖中SEL引腳和DIV2信號(hào)用于使能D觸發(fā)器的使能輸入端,而不是用于該觸發(fā)器的時(shí)鐘引腳。采用這個(gè)電路并不需要附加PLD的邏輯單元,工作卻可靠多了。 不同的系統(tǒng)需要采用不同的方法去除多級(jí)時(shí)鐘,并沒(méi)有固定的模式。
圖7 無(wú)靜態(tài)險(xiǎn)象的多級(jí)時(shí)鐘
?。ㄟ@個(gè)電路邏輯上等效于圖7,但卻可靠的多)
4.行波時(shí)鐘
另一種流行的時(shí)鐘電路是采用行波時(shí)鐘,即一個(gè)觸發(fā)器的輸出用作另一個(gè)觸發(fā)器的時(shí)鐘輸入。如果仔細(xì)地設(shè)計(jì),行波時(shí)鐘可以象全局時(shí)鐘一樣地可靠工作。然而,行波時(shí)鐘使得與電路有關(guān)的定時(shí)計(jì)算變得很復(fù)雜。行波時(shí)鐘在行波鏈上各觸發(fā)器的時(shí)鐘之間產(chǎn)生較大的時(shí)間偏移,并且會(huì)超出最壞情況下的建立時(shí)間、保持時(shí)間和電路中時(shí)鐘到輸出的延時(shí),使系統(tǒng)的實(shí)際速度下降。
用計(jì)數(shù)翻轉(zhuǎn)型觸發(fā)器構(gòu)成異步計(jì)數(shù)器時(shí)常采用行波時(shí)鐘,一個(gè)觸發(fā)器的輸出鐘控下一個(gè)觸發(fā)器的輸入,參看圖9 同步計(jì)數(shù)器通常是代替異步計(jì)數(shù)器的更好方案,這是因?yàn)閮烧咝枰瑯佣嗟暮陠卧接?jì)數(shù)器有較快的時(shí)鐘到輸出的時(shí)間。圖10 給出具有全局時(shí)鐘的同步計(jì)數(shù)器,它和 圖9 功能相同,用了同樣多的邏輯單元實(shí)現(xiàn),卻有較快的時(shí)鐘到輸出的時(shí)間。幾乎所有PLD開(kāi)發(fā)軟件都提供多種多樣的同步計(jì)數(shù)器。
圖9 行波時(shí)鐘
圖10 行波時(shí)鐘轉(zhuǎn)換成全局時(shí)鐘
(這個(gè)3位計(jì)數(shù)器是圖9異步計(jì)數(shù)器的替代電路,它用了同樣的3個(gè)宏單元,但有更短的時(shí)鐘到輸出的延時(shí))
5. 多時(shí)鐘系統(tǒng)
許多系統(tǒng)要求在同一個(gè)PLD內(nèi)采用多時(shí)鐘。最常見(jiàn)的例子是兩個(gè)異步微處理器器之間的接口,或微處理器和異步通信通道的接口。由于兩個(gè)時(shí)鐘信號(hào)之間要求一定的建立和保持時(shí)間,所以,上述應(yīng)用引進(jìn)了附加的定時(shí)約束條件。它們也會(huì)要求將某些異步信號(hào)同步化。
圖11 給出一個(gè)多時(shí)鐘系統(tǒng)的實(shí)例。CLK_A用以鐘控REG_A,CLK_B用于鐘控REG_B,由于REG_A驅(qū)動(dòng)著進(jìn)入REG_B的組合邏輯,故CLK_A的上升沿相對(duì)于CLK_B的上升沿有建立時(shí)間和保持時(shí)間的要求。由于REG_B不驅(qū)動(dòng)饋到REG_A的邏輯,CLK_B的上升沿相對(duì)于CLK_A沒(méi)有建立時(shí)間的要求。此外,由于時(shí)鐘的下降沿不影響觸發(fā)器的狀態(tài),所以CLK_A和CLK_B的下降沿之間沒(méi)有時(shí)間上的要求。, 如圖4,2.II所示,電路中有兩個(gè)獨(dú)立的時(shí)鐘,可是,在它們之間的建立時(shí)間和保持時(shí)間的要求是不能保證的。在這種情況下,必須將電路同步化。圖12 給出REG_A的值(如何在使用前)同CLK_B同步化。新的觸發(fā)器REG_C由GLK_B觸控,保證REG_G的輸出符合REG_B的建立時(shí)間。然而,這個(gè)方法使輸出延時(shí)了一個(gè)時(shí)鐘周期。
圖ll 多時(shí)鐘系統(tǒng)
(定時(shí)波形示出CLK_A的上升沿相對(duì)于CLK_B的上升沿有建立時(shí)間和保持時(shí)間的約束條件)
圖12 具有同步寄存器輸出的多時(shí)鐘系統(tǒng)
(如果CLK_A和CLK_B是相互獨(dú)立的,則REG—A的輸出必須在它饋送到1REG_B之前,用REG_C同步化)
在許多應(yīng)用中只將異步信號(hào)同步化還是不夠的,當(dāng)系統(tǒng)中有兩個(gè)或兩個(gè)以上非同源時(shí)鐘的時(shí)候,數(shù)據(jù)的建立和保持時(shí)間很難得到保證,我們將面臨復(fù)雜的時(shí)間問(wèn)題。最好的方法是將所有非同源時(shí)鐘同步化。使用PLD內(nèi)部的鎖項(xiàng)環(huán)(PLL或DLL)是一個(gè)效果很好的方法,但不是所有PLD都帶有PLL、DLL,而且?guī)в蠵LL功能的芯片大多價(jià)格昂貴,所以除非有特殊要求,一般場(chǎng)合可以不使用帶PLL的PLD。 這時(shí)我們需要使用帶使能端的D觸發(fā)器,并引入一個(gè)高頻時(shí)鐘。
圖13 不同源時(shí)鐘
如圖13所示,系統(tǒng)有兩個(gè)不同源時(shí)鐘,一個(gè)為3MHz,一個(gè)為5MHz,不同的觸發(fā)器使用不同的時(shí)鐘。為了系統(tǒng)穩(wěn)定,我們引入一個(gè)20MHz時(shí)鐘,將3M和5M時(shí)鐘同步化,如圖15所示。 20M的高頻時(shí)鐘將作為系統(tǒng)時(shí)鐘,輸入到所有觸發(fā)器的的時(shí)鐘端。3M_EN 和5M_EN將控制所有觸發(fā)器的使能端。即原來(lái)接3M時(shí)鐘的觸發(fā)器,接20M時(shí)鐘,同時(shí)3M_EN 將控制該觸發(fā)器使能 ,原接5M時(shí)鐘的觸發(fā)器,也接20M時(shí)鐘,同時(shí)5M_EN 將控制該觸發(fā)器使能。 這樣我們就可以將任何非同源時(shí)鐘同步化。
圖13 同步化任意非同源時(shí)鐘
?。ㄒ粋€(gè)DFF和后面非門(mén),與門(mén)構(gòu)成時(shí)鐘上升沿檢測(cè)電路)
另外,異步信號(hào)輸入總是無(wú)法滿(mǎn)足數(shù)據(jù)的建立保持時(shí)間,容易使系統(tǒng)進(jìn)入亞穩(wěn)態(tài),所以也建議設(shè)計(jì)者把所有異步輸入都先經(jīng)過(guò)雙觸發(fā)器進(jìn)行同步化。
異步時(shí)鐘同步化
通過(guò)雙觸發(fā)器接口,異步信號(hào)輸入總是無(wú)法滿(mǎn)足數(shù)據(jù)的建立保持時(shí)間,所以建議大家把所有異步輸入都先經(jīng)過(guò)雙觸發(fā)器進(jìn)行同步化。如圖所示,時(shí)鐘域clk_s傳給時(shí)鐘域clk_d的數(shù)據(jù)經(jīng)過(guò)了雙觸發(fā)器的同步處理,相同的,時(shí)鐘域clk_d經(jīng)雙觸發(fā)器傳給時(shí)鐘域clk_s的數(shù)據(jù)
通過(guò)高頻時(shí)鐘同步化,當(dāng)在單個(gè)系統(tǒng)中有兩個(gè)或兩個(gè)以上非同源時(shí)鐘的時(shí)候,數(shù)據(jù)的建立和保持時(shí)間很難得到保證,我們將面臨復(fù)雜的時(shí)間問(wèn)題,最好的方法是將所有非同源時(shí)鐘同步化:選用一個(gè)頻率是它們的時(shí)鐘頻率公倍數(shù)的高頻主時(shí)鐘將他們進(jìn)行同步。
假設(shè)系統(tǒng)有兩個(gè)不同源時(shí)鐘,一個(gè)為3MHz,一個(gè)為5MHz,不同的觸發(fā)器使用不同的時(shí)鐘。為了系統(tǒng)穩(wěn)定,假設(shè)我們引入一個(gè)20MHz時(shí)鐘。
用modelsim仿真后得到的時(shí)序圖如圖所示
9、如何確定時(shí)序約束數(shù)值
FPGA工程的功能框圖如圖所示。上電初始,F(xiàn)PGA需要通過(guò)IIC接口協(xié)議對(duì)攝像頭模塊進(jìn)行寄存器初始化配置。這個(gè)初始化的基本參數(shù),如初始化地址和數(shù)據(jù)存儲(chǔ)在一個(gè)預(yù)先配置好的FPGA內(nèi)嵌ROM中。在初始化配置完成后,攝像頭就能夠持續(xù)輸出RGB標(biāo)準(zhǔn)的視頻數(shù)據(jù)流,F(xiàn)PGA通過(guò)對(duì)其相應(yīng)的時(shí)鐘、行頻和場(chǎng)頻進(jìn)行檢測(cè),從而一幀一幀的實(shí)時(shí)采集圖像數(shù)據(jù)。
采集到的視頻數(shù)據(jù)先通過(guò)一個(gè)FIFO,將原本25MHz頻率下同步的數(shù)據(jù)流轉(zhuǎn)換到100MHz頻率下。接著講這個(gè)數(shù)據(jù)再送入寫(xiě)SDRAM緩存的FIFO中,最終這個(gè)FIFO每滿(mǎn)160個(gè)數(shù)據(jù)就會(huì)將其寫(xiě)入SDRAM的相應(yīng)地址中。在另一側(cè),使用另一個(gè)異步FIFO將SDRAM緩存的圖像數(shù)據(jù)送個(gè)LCD驅(qū)動(dòng)模塊。LCD驅(qū)動(dòng)模塊不斷的讀出新的現(xiàn)實(shí)圖像,并且驅(qū)動(dòng)3.5寸液晶屏工作。
由于這個(gè)工程是移植過(guò)來(lái)的,SDRAM的時(shí)序約束已經(jīng)添加好并且很好的收斂了。但是,新增加的CMOS sensor的接口也需要做相應(yīng)的時(shí)序約束。下面我們就來(lái)探討下它的時(shí)序該如何做約束。
先看看CMOS Sensor的datasheet中提供的時(shí)序波形和相應(yīng)的建立、保持時(shí)間要求。波形如圖所示。
波形中出現(xiàn)的時(shí)間參數(shù)定義如下表所示。
我們可以簡(jiǎn)單分析下這個(gè)datasheet中提供的時(shí)序波形和參數(shù)提供了一些什么樣的有用信息。我們重點(diǎn)關(guān)注PCLK和D[7:0]的關(guān)系,HREF其實(shí)也可以歸類(lèi)到D[7:0]中一起分析,他們的時(shí)序關(guān)系基本是一致的(如果存在偏差,也可以忽略不計(jì))。這個(gè)波形實(shí)際上表達(dá)的是從Sensor的芯片封裝管腳上輸出的PCLK和D[7:0]的關(guān)系。而在理想狀況下,經(jīng)過(guò)PCB走線將這組信號(hào)連接到其他的芯片上(如CPU或FPGA),若盡可能保持走線長(zhǎng)度,在其他芯片的管腳上,PCLK和D[7:0]的關(guān)系基本還是不變的。那么,對(duì)于采集端來(lái)說(shuō),用PCLK的上升沿去鎖存D[7:0]就變得理所當(dāng)然了。而對(duì)于FPGA而言,從它的管腳到寄存器傳輸路徑上總歸是有延時(shí)存在的,那么PCLK和D[7:0]之間肯定不會(huì)是理想的對(duì)齊關(guān)系。而我們現(xiàn)在關(guān)心的是,相對(duì)于理想的對(duì)齊關(guān)系,PCLK和D[7:0]之間可以存在多大的相位偏差(最終可能會(huì)以一個(gè)延時(shí)時(shí)間范圍來(lái)表示)。在時(shí)序圖中,Tsu和Th雖然是PCLK和D[7:0]在Sensor內(nèi)部必須保證的建立時(shí)間和保持時(shí)間關(guān)系,但它同樣是Sensor的輸出管腳上,必須得到保證的基本時(shí)序關(guān)系。因此,我們可以認(rèn)為:理想相位關(guān)系情況下,PCLK上升沿之前的Tsu時(shí)間(即15ns)到上升沿后的Th時(shí)間(即8ns)內(nèi),D[7:0]是穩(wěn)定不變的。同樣的,理想情況下,PCLK的上升沿處于D[7:0]兩次數(shù)據(jù)變化的中央。換句話說(shuō),在D[7:0]保持當(dāng)前狀態(tài)的情況下,PCLK上升沿實(shí)際上在理想位置的Tsu時(shí)間和Th時(shí)間內(nèi)都是允許的。請(qǐng)大家記住這一點(diǎn),下面我們需要利用這個(gè)信息對(duì)在FPGA內(nèi)部的PCLK和D[7:0]信號(hào)進(jìn)行時(shí)序約束。
OK,明確了PCLK和D[7:0]之間應(yīng)該保持的關(guān)系后,我們?cè)賮?lái)看看他們從CMOS Sensor的管腳輸出后,到最終在FPGA內(nèi)部的寄存器進(jìn)行采樣鎖存,這整個(gè)路徑上的各種“艱難險(xiǎn)阻”(延時(shí))。
在這個(gè)路徑分析中,我們不去考慮CMOS Sensor內(nèi)部的時(shí)序關(guān)系,我們只關(guān)心它的輸出管腳上的信號(hào)。先看時(shí)鐘PCLK的路徑延時(shí),在PCB上的走線延時(shí)為T(mén)cpcb,在FPGA內(nèi)部,從進(jìn)入FPGA的管腳到寄存器的時(shí)鐘輸入端口的延時(shí)為T(mén)cl。再看數(shù)據(jù)D[7:0]的延時(shí),在PCB上的走線延時(shí)為T(mén)dpcb,在FPGA內(nèi)部的管腳到寄存器輸入端口延時(shí)為T(mén)p2r。而FPGA的寄存器同樣有建立時(shí)間Tsu和保持時(shí)間Th要求,也必須在整個(gè)路徑的傳輸時(shí)序中予以考慮。
另外,從前面的分析,我們得到了PCLK和D[7:0]之間應(yīng)該滿(mǎn)足的關(guān)系。那么,為了保證PCLK和D[7:0]穩(wěn)定考慮的得到傳輸,我們可以得到這樣一個(gè)基本的關(guān)系必須滿(mǎn)足:
對(duì)于建立時(shí)間,有:
Launch edge + Tdpcb + Tp2r + Tsu < latch edge + Tcpcb + Tcl
對(duì)于保持時(shí)間,有:
Launch edge + Tdpcb + Tr2p < latch edge + Tcpcb + Tcl – Th
關(guān)于launch edge和latch edge,對(duì)于我們當(dāng)前的設(shè)計(jì),如下圖所示。
在對(duì)這個(gè)FPGA的input接口的時(shí)序進(jìn)行分析和約束之前,我們先來(lái)看看Altera官方是如何分析此類(lèi)管腳的時(shí)序。
具體問(wèn)題具體分析,我們當(dāng)前的工程,狀況和理想模型略有區(qū)別。實(shí)際上在上面這個(gè)模型的源寄存器端的很多信息都不用詳細(xì)分析,因?yàn)槲覀儷@得的波形是來(lái)自于Sensor芯片的管腳。同理,我們可以得到input delay的計(jì)算公式如下。
Input max delay = (0 – Tcpcb_min) + Tco_max + Tdpcb_max
Input min delay = (0 – Tcpcb_max) + Tco_min + Tdpcb_min
在這兩個(gè)公式中,參數(shù)Tco是前面我們還未曾提到的,下面我們就要分析下如何得到這個(gè)參數(shù)。Tco指的是理想情況下數(shù)據(jù)在源寄存器被源時(shí)鐘鎖存后,經(jīng)過(guò)多長(zhǎng)時(shí)間輸入到管腳上。前面我們已經(jīng)得到了PCLK和D[7:0]之間的關(guān)系,其實(shí)從已知的關(guān)系中,我們不難推斷出Tco_max和Tco_min,如圖所示。若PCLK的時(shí)鐘周期為T(mén)pclk,則:
Tco_max = Tpclk – Tsu
Tco_min = Th
在我們采樣的CMOS Sensor圖像中,PCLK頻率為12.5MHz,即80ns。因此,我們可以計(jì)算到:
Tco_max = 80ns – 15ns = 65ns
Tco_min = 8ns
我們?cè)倏纯碢CB的走線情況,算算余下和PCB走線有關(guān)的延時(shí)。
如圖所示,這是PCLK和D[7:0]在SF-CY3核心板上的走線。
如圖所示,這是PCLK和D[7:0]在SF-SENSOR子板上的走線,在這個(gè)板子上的走線由匹配電阻分兩個(gè)部分。
根據(jù)前面的走線長(zhǎng)度,我們可以換算一下相應(yīng)的走線延時(shí),如下表所示。因此,我們可以得到,Tcpcb_max = 0.35ns,Tcpcb_min = 0.35ns,Tdpcb_max = 0.36ns,Tdpcb_min = 0.31ns。
將上面得到的具體數(shù)值都代入公式,得到:
Input max delay = (0 – 0.35ns) + 65ns + 0.36ns = 65.01ns
Input min delay = (0 – 0.35ns) + 8ns + 0.31ns = 7.96ns
加上一些余量,我們可以去input max delay = 66ns,input min delay = 7ns。
下面我們來(lái)添加時(shí)序約束,打開(kāi)TimeQuest,點(diǎn)擊菜單欄的ContraintsàCreat Clock,做如下設(shè)置。
點(diǎn)擊ContraintsàSet Maximum Delay,對(duì)vdb[0] vdb[1] vdb[2] vdb[3] vdb[4] vdb[5] vdb[6] vdb[7] vhref的set_max_delay做如下設(shè)置。
點(diǎn)擊ContraintsàSet Minimum Delay,對(duì)vdb[0] vdb[1] vdb[2] vdb[3] vdb[4] vdb[5] vdb[6] vdb[7] vhref的set_min_delay做如下設(shè)置。
約束完成后,參照前面章節(jié)Update Timing Netlist并且Write SDC File…,接著就可以重新編譯整個(gè)工程,再來(lái)看看這個(gè)時(shí)序分析的報(bào)告。在報(bào)告中,數(shù)據(jù)的建立時(shí)間有9-13ns的余量,而保持時(shí)間也都有7-11ns的余量,可謂余量充足。
另外,我們也可以專(zhuān)門(mén)找一條路徑出來(lái),看看它的具體時(shí)序路徑的分析。vd[0]這條數(shù)據(jù)線的建立時(shí)間報(bào)告中,66ns的input max delay出現(xiàn)在了Data Arrival Path中。
而在vd[0]的保持時(shí)間報(bào)告中,7ns的input min delay則出現(xiàn)在了Data Arrival Path中。