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