【正文】
,CLB陣列的輸出信號(hào)OUT也可以有兩條傳輸途徑:一條是直接經(jīng)MUX送至輸出緩沖器,另一條是先存入輸出通路D觸發(fā)器,再送至輸出緩沖器。IR主要由許多金屬線段構(gòu)成,這些金屬線段帶有可編程開關(guān),通過自動(dòng)布線實(shí)現(xiàn)各種電路的連接。目前這種高層次的設(shè)計(jì)方法已被廣泛采用。CPLD/FPGA系統(tǒng)設(shè)計(jì)的工作流程如圖22所示。,這是設(shè)計(jì)中最為普遍的輸入方式。這一步驟適用于大型設(shè)計(jì),因?yàn)閷?duì)于大型設(shè)計(jì)來說,在綜合前對(duì)源代碼仿真,就可以大大減少設(shè)計(jì)重復(fù)的次數(shù)和時(shí)間。,生成門級(jí)描述的網(wǎng)絡(luò)表文件,這是將高層次描述轉(zhuǎn)化為硬件電路的關(guān)鍵步驟。,仿真過程不涉及具體器件的硬件特性,是較為粗略的。,包括底層器件配置、邏輯分割、邏輯優(yōu)化和布局布線。根據(jù)適配后的仿真模型,可以進(jìn)行適配后時(shí)序仿真,因?yàn)橐呀?jīng)得到器件的實(shí)際硬件特性(如時(shí)延特性),所以仿真結(jié)果能比較精確的預(yù)期未來芯片的實(shí)際性能。最后將適配器產(chǎn)生的器件編程文件通過編程器或下載電纜載入到目標(biāo)芯片CPLD/FPGA中。CPLD/FPGA軟件設(shè)計(jì)可分為兩大塊:編程語言和編程工具。具體的設(shè)計(jì)輸入方式有以下幾種:。用這種方式描述的項(xiàng)目最后所能達(dá)到的性能與設(shè)計(jì)人員的水平、經(jīng)驗(yàn)以及綜合軟件有很大的關(guān)系。可以分為電路原理圖描述,狀態(tài)機(jī)描述和波形描述3種形式。MAX+plusII 圖形輸入方式只支持電路原理圖描述和波形描述兩種。一般大都使用成熟的IP核和中小規(guī)模集成電路所搭成的現(xiàn)成電路,整體放到一片可編程邏輯器件的內(nèi)部去,所以硬件工作速度和芯片利用率很高,但是但項(xiàng)目很大的時(shí)候,該方法就顯得有些繁瑣;狀態(tài)機(jī)描述主要用來設(shè)計(jì)基于狀態(tài)機(jī)思想的時(shí)序電路。由于狀態(tài)機(jī)到HDL語言有一種標(biāo)準(zhǔn)的對(duì)應(yīng)描述方式,所以這種輸入方式最后所能達(dá)到的工作速度和芯片利用率主要取決于綜合軟件;波形描述方式是基于真值表的一種圖形輸入方式,直接描述輸入與輸出的波形關(guān)系。 3 數(shù)字鐘總體設(shè)計(jì)方案 數(shù)字鐘的構(gòu)成數(shù)字鐘實(shí)際上是一個(gè)對(duì)標(biāo)準(zhǔn)頻率(1HZ)進(jìn)行計(jì)數(shù)的計(jì)數(shù)電路。通常使用石英晶體振蕩器電路構(gòu)成數(shù)字鐘。圖31 總體框架 數(shù)字鐘的工作原理振蕩器產(chǎn)生穩(wěn)定的高頻脈沖信號(hào),作為數(shù)字鐘的時(shí)間基準(zhǔn),然后經(jīng)過分頻器輸出標(biāo)準(zhǔn)秒脈沖。計(jì)滿后各計(jì)數(shù)器清零,重新計(jì)數(shù)。計(jì)時(shí)出現(xiàn)誤差時(shí),可以用校時(shí)電路校時(shí)、校分。時(shí)基電路可以由石英晶體振蕩電路構(gòu)成,如果晶振頻率1MHz,經(jīng)過6次十分頻就可以得到秒脈沖信號(hào)。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)定。因此,這種振蕩電路輸出的是準(zhǔn)確度極高的信號(hào)。分頻電路石英晶體振蕩電路秒信號(hào)圖41 秒信號(hào)產(chǎn)生電路框圖本系統(tǒng)使用的晶體振蕩器電路給數(shù)字鐘提供一個(gè)頻率穩(wěn)定準(zhǔn)確的20MHz的方波信號(hào),其輸出至分頻電路。圖42 分頻電路模塊經(jīng)分頻后輸出1HZ的標(biāo)準(zhǔn)秒信號(hào)oclk1s、500HZ的按鍵去抖信號(hào)。圖43 分頻模塊仿真圖 校時(shí)控制模塊電路設(shè)計(jì)與實(shí)現(xiàn)本模塊用于當(dāng)有按鍵按下時(shí),采用軟件消抖的辦法去除按鍵抖動(dòng)。該模塊有一個(gè)時(shí)鐘輸入端口,輸入時(shí)鐘信號(hào)是分頻出來的500HZ的時(shí)鐘;有一個(gè)輸入端口與行線相連,用于輸入行線狀態(tài);一個(gè)輸出端口,用于輸出有按鍵按下的信號(hào)。圖46 去抖邏輯框圖該電路的VHDL程序如下:LIBRARY ieee。ENTITY colv IS PORT ( clk : IN STD_LOGIC。 okey : OUT STD_LOGIC )。ARCHITECTURE colv_architecture OF colv IS BEGINk1:process(clk,inkey)variable count:integer range 0 to 30:=0。139。 okey=39。elsif rising_edge(clk) then if count=30 then okey=39。 count:=30。 okey=39。 end if。end process k1。程序說明:這段程序是實(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。而按鍵產(chǎn)生抖動(dòng)的時(shí)間大約2ms到10ms,所以一旦計(jì)數(shù)完成,抖動(dòng)已經(jīng)過去,不會(huì)發(fā)生重鍵現(xiàn)象了,這樣就去除了抖動(dòng)。 (a) (b)圖47 按鍵控制模塊這里圖(a)是控制分的高位,低位以及小時(shí)的高位的模塊,圖(b)是控制小時(shí)的低位的模塊。oaddr[3..0]作為輸出信號(hào),用于控制時(shí)間的調(diào)整。(1)分低位按鍵控制程序如下:LIBRARY ieee。USE 。 oaddr : OUT STD_LOGIC_VECTOR(3 downto 0) )。ARCHITECTURE addram_architecture OF addram ISsignal count:std_logic_vector(3 downto 0)。k1:process(inkey)beginif rising_edge(inkey) then count=count+1。 end if。end process k1。說明:每按鍵一次,即每當(dāng)inkey的上升沿到來時(shí),count加一,當(dāng)count等于9的時(shí)候,作為分的低位,將0賦值于count,在此過程中,隨時(shí)將十進(jìn)制數(shù)的count的值的8421碼作為oaddr的信號(hào)。(2) 小時(shí)低位按鍵控制程序如下:LIBRARY ieee。USE 。 flag : IN STD_LOGIC。END addram3。BEGINoaddr=count。139。 else count=count+1。 else count=count+1。 end if。end if。END addram3_architecture。(1)秒計(jì)數(shù)模塊該模塊框圖如圖48所示。圖48 秒模塊邏輯框圖程序如下:LIBRARY ieee。ENTITY second IS PORT ( clk_1s : IN STD_LOGIC。END second。beginif rising_edge(clk_1s) then if count=59 then os=39。 count:=0。039。 end if。end process k1。主要完成分低位向高位的進(jìn)位,產(chǎn)生脈沖信號(hào)。USE 。USE 。 iset : IN STD_LOGIC。 addr_1s : OUT STD_LOGIC_vector(3 downto 0)。END ml。beginif iset=39。 then count:=CONV_INTEGER(iset_addr)。elsif rising_edge(clk_1s) then if count=9 then os=39。 count:=0。 else os=39。 count:=count+1。 end if。end process k1。 說明:對(duì)于分高位計(jì)數(shù)模塊的程序,只需將上面程序中的count=9改成count=6即可。主要完成小時(shí)低位向高位的進(jìn)位,產(chǎn)生脈沖信號(hào),同時(shí)根據(jù)flag信號(hào)的不同判斷出小時(shí)高位時(shí)1還是2。USE 。USE 。 iset : IN STD_LOGIC。 iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 os : OUT STD_LOGIC )。ARCHITECTURE hl_architecture OF hl IS BEGINk1:process(clk_1s,iset)variable count:integer range 0 to 10:=0。039。 addr_1s=iset_addr。139。139。 addr_1s=CONV_STD_LOGIC_VECTOR(count,4)。039。 addr_1s=CONV_STD_LOGIC_VECTOR(count,4)。 else if count=9 then os=39。 count:=0。 else os=39。 count:=count+1。 end if。end if。END hl_architecture。主要完成小時(shí)高位1和2之間的變換,同時(shí)當(dāng)小時(shí)高位為2是,將是flag為高電平,當(dāng)為1是,flag為低電平。USE 。USE 。 iset : IN STD_LOGIC。 addr_1s : OUT STD_LOGIC_vector(3 downto 0)。END hh。beginif iset=39。 then count:=CONV_INTEGER(iset_addr)。 if count=2 then flag=39。 else flag=39。 end if。039。 addr_1s=CONV_STD_LOGIC_VECTOR(count,4)。139。 addr_1s=CONV_STD_LOGIC_VECTOR(count,4)。039。 addr_1s=CONV_STD_LOGIC_VECTOR(count,4)。end if。END hh_architecture。模塊元件如412所示:圖412譯碼顯示模塊元件程序如下:LIBRARY IEEE。 ENTITY drive IS PORT ( clk:in std_logic。 led : OUT STD_LOGIC_vector(7 downto 0) )。 ARCHITECTURE behave OF drive IS SIGNAL sel : STD_LOGIC_vector(3 downto 0)。 case sel is when 0000=led=11000000。 when 0010=led=10100100。 when 0100=led=10011001。 when 0110=led=10000010。 when 1000=led=10000000。 when others=led=10111111。 end process。5. 譯碼顯示強(qiáng)制轉(zhuǎn)換模塊 由于系統(tǒng)只能顯示時(shí)、分,故在此將時(shí)低位的數(shù)碼管的“小數(shù)點(diǎn)”作為秒顯示,以1HZ的頻率閃爍。USE 。 odata : OUT STD_LOGIC_VECTOR(6 downto 0) )。ARCHITECTURE conv_architecture OF conv IS BEGINodata=idata(6 downto 0)。6