【正文】
延時(shí))送到輸入通路D觸發(fā)器,再送到數(shù)據(jù)選擇器。通過(guò)編程給數(shù)據(jù)選擇器不同的控制信息,確定送至CLB陣列的I1和I2是來(lái)自輸入緩沖器,還是來(lái)自觸發(fā)器。當(dāng)IOB控制的引腳被定義為輸出時(shí),CLB陣列的輸出信號(hào)OUT也可以有兩條傳輸途徑:一條是直接經(jīng)MUX送至輸出緩沖器,另一條是先存入輸出通路D觸發(fā)器,再送至輸出緩沖器。IOB輸出端配有兩只MOS管,它們的柵極均可編程,使MOS管導(dǎo)通或截止,分別經(jīng)上拉電阻接通Vcc、地線或者不接通,用以改善輸出波形和負(fù)載能力。可編程互連資源IR可以將FPGA內(nèi)部的CLB和CLB之間、CLB和IOB之間連接起來(lái),構(gòu)成各種具有復(fù)雜功能的系統(tǒng)。IR主要由許多金屬線段構(gòu)成,這些金屬線段帶有可編程開(kāi)關(guān),通過(guò)自動(dòng)布線實(shí)現(xiàn)各種電路的連接。 FPGA系統(tǒng)設(shè)計(jì)流程一般說(shuō)來(lái),一個(gè)比較大的完整的項(xiàng)目應(yīng)該采用層次化的描述方法:分為幾個(gè)較大的模塊,定義好各功能模塊之間的接口,然后各個(gè)模塊再細(xì)分去具體實(shí)現(xiàn),這就是TOP DOWN(自頂向下)的設(shè)計(jì)方法。目前這種高層次的設(shè)計(jì)方法已被廣泛采用。高層次設(shè)計(jì)只是定義系統(tǒng)的行為特征,可以不涉及實(shí)現(xiàn)工藝,因此還可以在廠家綜合庫(kù)的支持下,利用綜合優(yōu)化工具將高層次描述轉(zhuǎn)換成針對(duì)某種工藝優(yōu)化的網(wǎng)絡(luò)表,使工藝轉(zhuǎn)化變得輕而易舉。CPLD/FPGA系統(tǒng)設(shè)計(jì)的工作流程如圖22所示。系統(tǒng)劃分①編譯器③代碼級(jí)功能仿真④綜合器⑤適配前時(shí)序仿真⑥適配器⑦CPLD/FPGA實(shí)現(xiàn)適配后仿真模型⑧適配后時(shí)序仿真適配報(bào)告⑧ASIC實(shí)現(xiàn)VHDL代碼或圖形方式輸入②仿真綜合庫(kù)器件編程文件⑧圖22 CPLD/FPGA系統(tǒng)設(shè)計(jì)流程流程說(shuō)明:“自頂向下”的設(shè)計(jì)方法進(jìn)行系統(tǒng)劃分。,這是設(shè)計(jì)中最為普遍的輸入方式。此外,還可以采用圖形輸入方式(框圖、狀態(tài)圖等),這種輸入方式具有直觀、容易理解的優(yōu)點(diǎn)。,主要是檢驗(yàn)系統(tǒng)功能設(shè)計(jì)的正確性。這一步驟適用于大型設(shè)計(jì),因?yàn)閷?duì)于大型設(shè)計(jì)來(lái)說(shuō),在綜合前對(duì)源代碼仿真,就可以大大減少設(shè)計(jì)重復(fù)的次數(shù)和時(shí)間。一般情況下,這一仿真步驟可略去。,生成門(mén)級(jí)描述的網(wǎng)絡(luò)表文件,這是將高層次描述轉(zhuǎn)化為硬件電路的關(guān)鍵步驟。綜合優(yōu)化是針對(duì)ASIC芯片供應(yīng)商的某一產(chǎn)品系列進(jìn)行的,所以綜合的過(guò)程要在相應(yīng)的廠家綜合庫(kù)的支持下才能完成。,仿真過(guò)程不涉及具體器件的硬件特性,是較為粗略的。一般的設(shè)計(jì),也可略去這一步驟。,包括底層器件配置、邏輯分割、邏輯優(yōu)化和布局布線。,產(chǎn)生多項(xiàng)設(shè)計(jì)結(jié)果:(a)適配報(bào)告,包括芯片內(nèi)部資源利用情況,設(shè)計(jì)的布爾方程描述情況等;(b)適配后的仿真模型;(c)器件編程文件。根據(jù)適配后的仿真模型,可以進(jìn)行適配后時(shí)序仿真,因?yàn)橐呀?jīng)得到器件的實(shí)際硬件特性(如時(shí)延特性),所以仿真結(jié)果能比較精確的預(yù)期未來(lái)芯片的實(shí)際性能。如果仿真結(jié)果達(dá)不到設(shè)計(jì)要求,就修改VHDL源代碼或選擇不同速度和品質(zhì)的器件,直至滿足設(shè)計(jì)要求。最后將適配器產(chǎn)生的器件編程文件通過(guò)編程器或下載電纜載入到目標(biāo)芯片CPLD/FPGA中。 FPGA開(kāi)發(fā)編程原理硬件設(shè)計(jì)需要根據(jù)各種性能指標(biāo)、成本、開(kāi)發(fā)周期等因素,確定最佳的實(shí)現(xiàn)方案,畫(huà)出系統(tǒng)框圖,選擇芯片,設(shè)計(jì)PCB并最終形成樣機(jī)。CPLD/FPGA軟件設(shè)計(jì)可分為兩大塊:編程語(yǔ)言和編程工具。編程語(yǔ)言主要有VHDL和Verilog兩種硬件描述語(yǔ)言;編程工具主要是兩大廠家Altera和Xilinx的集成綜合EDA軟件(如MAX+plusII、QuartusII、Foundation、ISE)以及第三方工具(如FPGA Express、Modelsim、Synposys SVS等)。具體的設(shè)計(jì)輸入方式有以下幾種:。HDL既可以描述底層設(shè)計(jì),也可以描述頂層的設(shè)計(jì),但它不容易做到較高的工作速度和芯片利用率。用這種方式描述的項(xiàng)目最后所能達(dá)到的性能與設(shè)計(jì)人員的水平、經(jīng)驗(yàn)以及綜合軟件有很大的關(guān)系??梢苑譃殡娐吩韴D描述,狀態(tài)機(jī)描述和波形描述3種形式。有的軟件3種輸入方法都支持,如ActiveHDL。MAX+plusII 圖形輸入方式只支持電路原理圖描述和波形描述兩種。電路原理圖方式描述比較直觀和高效,對(duì)綜合軟件的要求不高。一般大都使用成熟的IP核和中小規(guī)模集成電路所搭成的現(xiàn)成電路,整體放到一片可編程邏輯器件的內(nèi)部去,所以硬件工作速度和芯片利用率很高,但是但項(xiàng)目很大的時(shí)候,該方法就顯得有些繁瑣;狀態(tài)機(jī)描述主要用來(lái)設(shè)計(jì)基于狀態(tài)機(jī)思想的時(shí)序電路。在圖形的方式下定義好各個(gè)工作狀態(tài),然后在各個(gè)狀態(tài)上輸入轉(zhuǎn)換條件以及相應(yīng)的輸入輸出,最后生成HDL語(yǔ)言描述,送去綜合軟件綜合到可編程邏輯器件的內(nèi)部。由于狀態(tài)機(jī)到HDL語(yǔ)言有一種標(biāo)準(zhǔn)的對(duì)應(yīng)描述方式,所以這種輸入方式最后所能達(dá)到的工作速度和芯片利用率主要取決于綜合軟件;波形描述方式是基于真值表的一種圖形輸入方式,直接描述輸入與輸出的波形關(guān)系。這種輸入方式最后所能達(dá)到的工作速度和芯片利用率也是主要取決于綜合軟件。 3 數(shù)字鐘總體設(shè)計(jì)方案 數(shù)字鐘的構(gòu)成數(shù)字鐘實(shí)際上是一個(gè)對(duì)標(biāo)準(zhǔn)頻率(1HZ)進(jìn)行計(jì)數(shù)的計(jì)數(shù)電路。由于計(jì)數(shù)的起始時(shí)間不可能與標(biāo)準(zhǔn)時(shí)間(如北京時(shí)間)一致,故需要在電路上加一個(gè)校時(shí)電路,同時(shí)標(biāo)準(zhǔn)的1HZ時(shí)間信號(hào)必須做到準(zhǔn)確穩(wěn)定。通常使用石英晶體振蕩器電路構(gòu)成數(shù)字鐘。本設(shè)計(jì)總體框架如圖31。圖31 總體框架 數(shù)字鐘的工作原理振蕩器產(chǎn)生穩(wěn)定的高頻脈沖信號(hào),作為數(shù)字鐘的時(shí)間基準(zhǔn),然后經(jīng)過(guò)分頻器輸出標(biāo)準(zhǔn)秒脈沖。秒計(jì)數(shù)器滿60后向分計(jì)數(shù)器進(jìn)位,分計(jì)數(shù)器滿60后向小時(shí)計(jì)數(shù)器進(jìn)位,小時(shí)計(jì)數(shù)器按照“24翻1”規(guī)律計(jì)數(shù)。計(jì)滿后各計(jì)數(shù)器清零,重新計(jì)數(shù)。計(jì)數(shù)器的輸出分別經(jīng)譯碼器送數(shù)碼管顯示。計(jì)時(shí)出現(xiàn)誤差時(shí),可以用校時(shí)電路校時(shí)、校分。控制信號(hào)由15矩形鍵盤(pán)輸入。時(shí)基電路可以由石英晶體振蕩電路構(gòu)成,如果晶振頻率1MHz,經(jīng)過(guò)6次十分頻就可以得到秒脈沖信號(hào)。譯碼顯示電路由七段譯碼器完成,顯示由數(shù)碼管構(gòu)成。4 單元電路設(shè)計(jì) 分頻模塊電路設(shè)計(jì)與實(shí)現(xiàn)晶體振蕩器是構(gòu)成數(shù)字式時(shí)鐘的核心,振蕩器的穩(wěn)定度及頻率的精度決定了數(shù)字鐘計(jì)時(shí)的準(zhǔn)確程度,它保證了時(shí)鐘的走時(shí)準(zhǔn)確及穩(wěn)定。石英晶體的選頻特性非常好,只有某一頻率點(diǎn)的信號(hào)可以通過(guò)它,其它頻率段的信號(hào)均會(huì)被它所衰減,而且,振蕩信號(hào)的頻率與振蕩電路中的R、C元件的數(shù)值無(wú)關(guān)。因此,這種振蕩電路輸出的是準(zhǔn)確度極高的信號(hào)。然后再利用分頻電路,將其輸出信號(hào)轉(zhuǎn)變?yōu)槊胄盘?hào),其組成框圖如圖41。分頻電路石英晶體振蕩電路秒信號(hào)圖41 秒信號(hào)產(chǎn)生電路框圖本系統(tǒng)使用的晶體振蕩器電路給數(shù)字鐘提供一個(gè)頻率穩(wěn)定準(zhǔn)確的20MHz的方波信號(hào),其輸出至分頻電路。分頻電路的邏輯框圖如圖42所示。圖42 分頻電路模塊經(jīng)分頻后輸出1HZ的標(biāo)準(zhǔn)秒信號(hào)oclk1s、500HZ的按鍵去抖信號(hào)。該模塊的時(shí)序仿真圖如圖43所示,滿足設(shè)計(jì)要求。圖43 分頻模塊仿真圖 校時(shí)控制模塊電路設(shè)計(jì)與實(shí)現(xiàn)本模塊用于當(dāng)有按鍵按下時(shí),采用軟件消抖的辦法去除按鍵抖動(dòng)。模塊的實(shí)現(xiàn)方法是先判斷是否有按鍵按下,如有按鍵按下則延時(shí)一段時(shí)間,待抖動(dòng)過(guò)去之后再讀行線狀態(tài),如果仍有低電平行線,則確定有按鍵按下,然后產(chǎn)生一個(gè)有按鍵按下的信號(hào)。該模塊有一個(gè)時(shí)鐘輸入端口,輸入時(shí)鐘信號(hào)是分頻出來(lái)的500HZ的時(shí)鐘;有一個(gè)輸入端口與行線相連,用于輸入行線狀態(tài);一個(gè)輸出端口,用于輸出有按鍵按下的信號(hào)。該模塊的邏輯框圖如圖46所示。圖46 去抖邏輯框圖該電路的VHDL程序如下:LIBRARY ieee。USE 。ENTITY colv IS PORT ( clk : IN STD_LOGIC。 inkey : IN STD_LOGIC。 okey : OUT STD_LOGIC )。END colv。ARCHITECTURE colv_architecture OF colv IS BEGINk1:process(clk,inkey)variable count:integer range 0 to 30:=0。beginif inkey=39。139。 then count:=0。 okey=39。139。elsif rising_edge(clk) then if count=30 then okey=39。039。 count:=30。 else count:=count+1。 okey=39。139。 end if。end if。end process k1。END colv_architecture。程序說(shuō)明:這段程序是實(shí)現(xiàn)按鍵消抖,在這里實(shí)現(xiàn)的比較簡(jiǎn)單,原理是當(dāng)有按鍵按下的時(shí)候,inkey會(huì)變成低電平,如果此時(shí)count不為30時(shí),內(nèi)部計(jì)數(shù)器計(jì)數(shù),從0直到30,當(dāng)計(jì)數(shù)到30時(shí),okey輸出底電平,同時(shí)給計(jì)數(shù)器賦值為30。由于計(jì)數(shù)脈沖為500HZ,故從有按鍵按下到輸入信號(hào)產(chǎn)生大概需要60ms。而按鍵產(chǎn)生抖動(dòng)的時(shí)間大約2ms到10ms,所以一旦計(jì)數(shù)完成,抖動(dòng)已經(jīng)過(guò)去,不會(huì)發(fā)生重鍵現(xiàn)象了,這樣就去除了抖動(dòng)。按鍵控制模塊的框圖如圖47所示。 (a) (b)圖47 按鍵控制模塊這里圖(a)是控制分的高位,低位以及小時(shí)的高位的模塊,圖(b)是控制小時(shí)的低位的模塊。inkey是由去抖模塊輸出的有鍵按下的信號(hào),這個(gè)信號(hào)引發(fā)按鍵控制模塊內(nèi)部信號(hào)的變化。oaddr[3..0]作為輸出信號(hào),用于控制時(shí)間的調(diào)整。圖(b)中的flag是判斷小時(shí)高位是1還是2的信號(hào),若為1,則flag信號(hào)為低電平;若為2,則flag信號(hào)為高電平。(1)分低位按鍵控制程序如下:LIBRARY ieee。USE 。USE 。ENTITY addram IS PORT ( inkey : IN STD_LOGIC。 oaddr : OUT STD_LOGIC_VECTOR(3 downto 0) )。END addram。ARCHITECTURE addram_architecture OF addram ISsignal count:std_logic_vector(3 downto 0)。BEGINoaddr=count。k1:process(inkey)beginif rising_edge(inkey) then count=count+1。 if count=9 then count=0000。 end if。 end if。end process k1。END addram_architecture。說(shuō)明:每按鍵一次,即每當(dāng)inkey的上升沿到來(lái)時(shí),count加一,當(dāng)count等于9的時(shí)候,作為分的低位,將0賦值于count,在此過(guò)程中,隨時(shí)將十進(jìn)制數(shù)的count的值的8421碼作為oaddr的信號(hào)。對(duì)于分的高位,僅將程序中的count=9改成count=5即可;對(duì)于小時(shí)的高位,僅將程序中的count=9改成count=2即可。(2) 小時(shí)低位按鍵控制程序如下:LIBRARY ieee。USE 。USE 。ENTITY addram3 IS PORT ( inkey : IN STD_LOGIC。 flag : IN STD_LOG