版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 緒 論</b></p><p> 1.1.1 FPGA的概述及特點(diǎn)</p><p> FPGA是英文Field Programmable Gate Array的縮寫,即現(xiàn)場(chǎng)可編程門陣列,它是在PAL、GAL、EPLD等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路
2、的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)。FPGA采用了邏輯單元陣列LCA(Logic Cell Array)這樣一個(gè)新概念,內(nèi)部包括可配置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內(nèi)部連線(Interconnect)三個(gè)部分。</p><p> 特點(diǎn)有采用FPGA設(shè)計(jì)ASIC電路,用戶不需要投片生產(chǎn),就能得到合用的芯
3、片; FPGA可做其它全定制或半定制ASIC電路的中試樣片;FPGA內(nèi)部有豐富的觸發(fā)器和I/O引腳;FPGA是ASIC電路中設(shè)計(jì)周期最短、開發(fā)費(fèi)用最低、風(fēng)險(xiǎn)最小的器件之一;FPGA采用高速CHMOS工藝,功耗低,可以與CMOS、TTL電平兼容??梢哉f,F(xiàn)PGA芯片是小批量系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之一。</p><p> FPGA是由存放在片內(nèi)RAM中的程序來(lái)設(shè)置其工作狀態(tài)的,因此,工作時(shí)需要對(duì)片內(nèi)的
4、RAM進(jìn)行編程。用戶可以根據(jù)不同的配置模式,采用不同的編程方式。FPGA有多種配置模式:并行主模式為一片F(xiàn)PGA加一片EPROM的方式;主從模式可以支持一片PROM編程多片F(xiàn)PGA;串行模式可以采用串行PROM編程FPGA;外設(shè)模式可以將FPGA作為微處理器的外設(shè),由微處理器對(duì)其編程。</p><p> ?。?1.2 VHDL的概述及特點(diǎn)</p><p> VHDL(Very High
5、Speed Integrated Circuit Hardware Description Language)即超高速集成電路硬件描述語(yǔ)言,在基于CPLD/FPGA和ASIC的數(shù)字系統(tǒng)設(shè)計(jì)中有著廣泛的應(yīng)用。VHDL語(yǔ)言誕生于1983年,1987年被美國(guó)國(guó)防部和IEEE確定為標(biāo)準(zhǔn)的硬件描述語(yǔ)言。自從IEEE發(fā)布了VHDL的第一個(gè)標(biāo)準(zhǔn)版本IEEE 1076-1987后,各大EDA公司都先后推出了自己的支持VHDL的EDA工具。VHDL在電子
6、設(shè)計(jì)行業(yè)得到了廣泛的認(rèn)同。此后IEEE又先后發(fā)布了IEEE 1076-1993和IEEE 1076-2000版本。 </p><p> VHDL是硬件設(shè)計(jì)人員的一種描述工具,硬件設(shè)計(jì)本身還是要人來(lái)完成的。VHDL被設(shè)計(jì)出來(lái)的目的是為了硬件設(shè)計(jì),具有硬件的性質(zhì)。它用于描述電路系統(tǒng)的結(jié)構(gòu),接口,行為和功能,除了它具有的硬件特征的語(yǔ)句外,它的語(yǔ)言形式和描述風(fēng)格,以及句法與一般的計(jì)算機(jī)高級(jí)語(yǔ)言相當(dāng)類似,然而它又與軟件語(yǔ)
7、言具有完全不同的性質(zhì)。結(jié)構(gòu)簡(jiǎn)單明了,各部分負(fù)責(zé)的硬件描述明確,能避開硬件具體的器件結(jié)構(gòu),用強(qiáng)大的行為描述能力對(duì)電路從邏輯上進(jìn)行描述和設(shè)計(jì);可以看出,VHDL對(duì)設(shè)計(jì)的描述具有相對(duì)獨(dú)立性,設(shè)計(jì)者可以不懂硬件的結(jié)構(gòu),也不必關(guān)心最終設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)器件是什么;設(shè)計(jì)者的責(zé)任是把硬件的結(jié)構(gòu)和功能完整詳細(xì)地描述出來(lái);此外,用VHDL設(shè)計(jì)的系統(tǒng)的功能可行性能夠在早期就檢驗(yàn)出來(lái),這主要是因?yàn)殡S時(shí)可以對(duì)設(shè)計(jì)進(jìn)行仿真;以上特點(diǎn)決定了VHDL擁有的另一個(gè)很重要的
8、優(yōu)勢(shì):代碼的再利用功能。這一點(diǎn)很適合目前急速發(fā)展的市場(chǎng)需求。</p><p> 1.2 MAX+plus II開發(fā)環(huán)境應(yīng)用簡(jiǎn)介</p><p> 1 、原理圖輸入(Graphic Editor)</p><p> MAX+PLUSII軟件具有圖形輸入能力,用戶可以方便的使用圖形編輯器輸入電路圖,圖中的元器件可以調(diào)用元件庫(kù)中元器件,除調(diào)用庫(kù)中的元件以外,還可以
9、調(diào)用該軟件中的符號(hào)功能形成的功能塊.圖形編輯器窗口見圖(13)。</p><p> 2、硬件描述語(yǔ)言輸入(Text Editor)</p><p> MAX+PLUSII軟件中有一個(gè)集成的文本編輯器,該編輯器支持VHDL,AHDL和Verilog硬件描述語(yǔ)言的輸入,同時(shí)還有一個(gè)語(yǔ)言模板使輸入程序語(yǔ)言更加方便,該軟件可以對(duì)這些程序語(yǔ)言進(jìn)行編譯并形成可以下載配置數(shù)據(jù),文本編輯器窗口見圖(1
10、4)。</p><p> ?。场⒉ㄐ尉庉嬈?Waveform Editor)</p><p> 在進(jìn)行邏輯電路的行為仿真時(shí),需要在所設(shè)計(jì)電路的輸入端加入一定的波形,波形編輯器可以生成和編輯仿真用的波形(*.SCF文件),使用該編輯器的工具條可以容易方便的生成波形和編輯波形。波形編輯器窗口如圖(15)所示。使用時(shí)只要將欲輸入波形的時(shí)間段用鼠標(biāo)涂黑,然后選擇工具條中的按鈕,例如,如果要某一時(shí)
11、間段為高電平,只需選擇按鈕 ”1”。</p><p> 還可以使用輸入的波形(*.WDF文件)經(jīng)過編譯生成邏輯功能塊,相當(dāng)于已知一個(gè)芯片的輸入輸出波形,但不知是何種芯片,使用該軟件功能可以解決這個(gè)問題,設(shè)計(jì)出一個(gè)輸入和輸出波形相同CPLD電路。</p><p> ?。?、管腳(底層)編輯窗口(Floorplan Editor)</p><p> 該窗口用于將已設(shè)計(jì)
12、好邏輯電路的輸入輸出節(jié)點(diǎn)賦予實(shí)際芯片的引腳,通過鼠標(biāo)的拖拉,方便的定義管腳的功能。管腳(底層)編輯窗口見圖(16)。</p><p><b> 5、設(shè)計(jì)規(guī)則檢查</b></p><p> 選取Compile\Processing\Design Doctor菜單,將調(diào)出規(guī)則檢查醫(yī)生,該醫(yī)生可以按照三種規(guī)則中的一個(gè)規(guī)則檢查各個(gè)設(shè)計(jì)文件,以保證設(shè)計(jì)的可靠性。一旦選擇該菜
13、單,在編譯窗口將顯示出醫(yī)生,用鼠標(biāo)點(diǎn)擊醫(yī)生,該醫(yī)生可以告訴你程序文件的健康情況。見圖(17)。 </p><p><b> 6、編程文件的產(chǎn)生</b></p><p> 編譯器中的裝配程序(Assembler)將編譯好的程序創(chuàng)建一個(gè)或多個(gè)編程目標(biāo)文件:</p><p> EPROM配置文件(*.POF)例如,MAX7000S系列<
14、/p><p> SRAM文件(*.SCF)例如,FLEX8000系列的配置芯片EPROM</p><p> JEDEC文件(*.JED)</p><p> 十六進(jìn)制文件(*.HEX)</p><p> 文本文件(*.TTF)</p><p> 串行BIT流文件(*.SBF)</p><p>
15、;<b> 7、仿真</b></p><p> 當(dāng)設(shè)計(jì)文件被編譯好,并在波形編輯器中將輸入波形編輯完畢后,就可以進(jìn)行行為仿真了,通過仿真可以檢驗(yàn)設(shè)計(jì)的邏輯關(guān)系是否準(zhǔn)確.</p><p> 8、分析時(shí)間(Analyze Timing)</p><p> 該功能可以分析各個(gè)信號(hào)到輸出端的時(shí)間延遲,可以給出延遲矩陣和最高工作頻率.見圖(18)
16、和圖(19)。</p><p><b> 2 電子鐘的概述</b></p><p><b> 2.1 設(shè)計(jì)原理</b></p><p> 數(shù)字鐘電路的基本結(jié)構(gòu)由兩個(gè)60進(jìn)制計(jì)數(shù)器和一個(gè)24進(jìn)制計(jì)數(shù)器組成,分別對(duì)秒、分、小時(shí)進(jìn)行計(jì)時(shí),當(dāng)計(jì)時(shí)到23時(shí)59分59秒時(shí),再來(lái)一個(gè)計(jì)數(shù)脈沖,則計(jì)數(shù)器清零,重新開始計(jì)時(shí)。秒計(jì)數(shù)器
17、的計(jì)數(shù)時(shí)鐘CLK為1Hz的標(biāo)準(zhǔn)信號(hào),可以由晶振產(chǎn)生的24 MHz信號(hào)通過分頻得到。當(dāng)數(shù)字鐘處于計(jì)時(shí)狀態(tài)時(shí),秒計(jì)數(shù)器的進(jìn)位輸出信號(hào)作為分鐘計(jì)數(shù)器的計(jì)數(shù)信號(hào),分鐘計(jì)數(shù)器的進(jìn)位輸出信號(hào)又作為小時(shí)計(jì)數(shù)器的計(jì)數(shù)信號(hào)時(shí)、分、秒的計(jì)時(shí)結(jié)果通過6個(gè)數(shù)碼管來(lái)動(dòng)態(tài)顯示。數(shù)字鐘除了能夠正常計(jì)時(shí)外,還應(yīng)能夠?qū)r(shí)間進(jìn)行調(diào)整。因此,通過模式選擇信號(hào)MOD1、MOD2控制數(shù)字鐘的工作狀態(tài),即控制數(shù)字鐘,使其分別工作于正常計(jì)時(shí),調(diào)整分、時(shí)和設(shè)定分、時(shí)5個(gè)狀態(tài)。當(dāng)數(shù)字鐘
18、處于計(jì)時(shí)狀態(tài)時(shí),3個(gè)計(jì)數(shù)器允許計(jì)數(shù),且秒、分、時(shí)計(jì)數(shù)器的計(jì)數(shù)時(shí)鐘信號(hào)分別為CLK,秒的進(jìn)位, 分的進(jìn)位;當(dāng)數(shù)字鐘處于調(diào)整時(shí)間狀態(tài)時(shí),被調(diào)的分或時(shí)會(huì)一秒一秒地增加;當(dāng)數(shù)字鐘處于定時(shí)狀態(tài)時(shí),可以設(shè)定小時(shí)和分;當(dāng)計(jì)時(shí)到所設(shè)定的時(shí)刻時(shí),speak將會(huì)被賦予1KHz的脈沖信號(hào)用于驅(qū)動(dòng)揚(yáng)聲器.</p><p> 電子鐘的外形圖如下:</p><p> 圖1 電子鐘的外形圖</p>
19、<p> 2.1 整體設(shè)計(jì)框圖如下</p><p> 2.2 數(shù)字鐘在FPGA芯片中的頂層原理圖如下</p><p> 圖3 數(shù)字鐘在FPGA芯片中的頂層原理圖</p><p><b> 3各模塊設(shè)計(jì)</b></p><p><b> 3.1 外部按鍵</b></p&g
20、t;<p> Reset鍵: 該鍵為系統(tǒng)復(fù)位按鍵,按此鍵可以進(jìn)行時(shí)間的復(fù)位。如:時(shí)間顯示為23:09:18,則按此鍵后時(shí)間顯示了00:00:00;</p><p> alarm鍵:該鍵為鬧鐘設(shè)定按鍵,按此鍵可以進(jìn)行鬧鐘的任意時(shí)間設(shè)置;</p><p> stop鍵:該鍵為時(shí)間定時(shí)設(shè)定按鍵,用此鍵可以完成時(shí)間的定時(shí)功能;</p><p> ok鍵
21、:該鍵作為任何設(shè)定動(dòng)作的確認(rèn)鍵,如當(dāng)需要調(diào)整時(shí)間時(shí),調(diào)整好需要的時(shí)間后,按ok鍵即可確認(rèn)所調(diào)的時(shí)間;</p><p> 調(diào)秒鍵、調(diào)分鍵、調(diào)時(shí)鍵,六個(gè)七段數(shù)碼管。</p><p> 3.2 晶振電路模塊</p><p> 振蕩器是數(shù)字鐘的核心。振蕩器的穩(wěn)定度及頻率的精確度決定了數(shù)字鐘計(jì)時(shí)的準(zhǔn)確程度,通常選用石英晶體構(gòu)成振蕩器電路。一般來(lái)說,振蕩器的頻率越高,計(jì)時(shí)
22、精度越高。電子手表集成電路中的晶體振蕩器電路,取晶振的頻率為32768Hz,</p><p> 圖4 晶 振 電 路</p><p><b> 3.3 分頻器模塊</b></p><p> 為了得到秒脈沖信號(hào),需要經(jīng)過一個(gè)分頻電路,主要有2個(gè)部分,一個(gè)是產(chǎn)生1HZ的計(jì)數(shù)頻率,一個(gè)是產(chǎn)生128HZ的顯示掃描頻率,其引腳說明如下</p&
23、gt;<p> 圖6 分頻器模塊引腳說明圖</p><p><b> 其程序如下:</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all; </p><p> use ieee.std_logic_unsigned.all
24、;</p><p> use ieee.std_logic_arith.all;</p><p> entity d32768 is</p><p> port( clk: in std_logic; --from system clock(32hz)</p><p> f128hz: out std_logic;</p>
25、<p> f1hz: out std_logic); -- lhz output signal </p><p><b> end ; </b></p><p> architecture arch of d32768 is --input: clk , output: flhz</p><p> signal cou
26、nt1 : integer range 0 to 255; </p><p> signal count2 : integer range 0 to 127; </p><p> signal f128: std_logic;</p><p> begin -- process for dividing by 1M</p><p&g
27、t; process(clk) </p><p><b> begin</b></p><p> if rising_edge(clk) then count1 <= count1 + 1;</p><p> if count1=255 then f128<='0'; count1 <= 0;<
28、/p><p> elsif count1=122 then f128<='1'; </p><p><b> end if;</b></p><p><b> end if; </b></p><p> end process; </p><p>
29、; f128hz <= f128;</p><p> process(f128 ) </p><p><b> begin</b></p><p> if rising_edge(f128) then count2 <= count2 + 1;</p><p> if count2=127 then
30、 f1hz<='0'; count2 <= 0;</p><p> elsif count2=63 then f1hz <='1'; </p><p><b> end if;</b></p><p><b> end if; </b></p>&
31、lt;p> end process; </p><p><b> end ;</b></p><p> clk:為頻率輸入端</p><p> f128hz: out std_logic:為譯碼掃描輸入128 HZ的頻率</p><p> f1hz: out std_logic) 為計(jì)數(shù)器模塊輸入1HZ
32、的頻率</p><p> 3.4 正常計(jì)數(shù)器模塊</p><p> 電子鐘計(jì)時(shí)模塊主要是用來(lái)實(shí)現(xiàn)內(nèi)部定時(shí)計(jì)數(shù)功能。計(jì)時(shí)模塊的輸入信號(hào)包括內(nèi)部計(jì)時(shí)時(shí)鐘信號(hào)clk0,輸出信號(hào)就是計(jì)時(shí)信息,包括小時(shí)十位信號(hào)hr10、小時(shí)個(gè)位信號(hào)hr、分十位信號(hào)min10、分個(gè)位信號(hào)min、秒十位信號(hào)sec10、秒個(gè)位信號(hào)sec。實(shí)現(xiàn)計(jì)數(shù)器模塊的原理圖如下:</p><p> 圖7
33、計(jì)數(shù)器模塊的原理圖</p><p> 1. 秒計(jì)數(shù):秒計(jì)數(shù),在頻率為1HZ的時(shí)鐘下以60次為循環(huán)計(jì)數(shù),并產(chǎn)生進(jìn)位信號(hào)影響分計(jì)數(shù);</p><p> 2. 分計(jì)數(shù):分計(jì)數(shù),在秒進(jìn)位信號(hào)為高電平時(shí),計(jì)數(shù)一次,同樣以60次為一個(gè)循環(huán)計(jì)數(shù),同時(shí)產(chǎn)生分進(jìn)位信號(hào)影響時(shí)計(jì)數(shù);</p><p> 3 .時(shí)計(jì)數(shù):時(shí)計(jì)數(shù),在分進(jìn)位信號(hào)為高電平時(shí),計(jì)數(shù)一次,以24次為一個(gè)循環(huán)
34、計(jì)數(shù)count60(秒計(jì)數(shù)和分計(jì)數(shù))源程序如下</p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> use ieee.std_logic_arith.all;&l
35、t;/p><p> entity count60 is</p><p> port( carry: in std_logic;--from 1hz input clock or the</p><p> --full index of second/minute</p><p> rst: in std_logic;--initializ
36、ation</p><p> times: out integer range 0 to 59;</p><p> full: out std_logic); -- carry_out signal</p><p> end count60;</p><p> architecture arch of count60 is --i
37、nput:rst,carry</p><p> --output:times,full</p><p> signal time : integer range 0 to 59;</p><p><b> begin</b></p><p> -- process for 60 seconds counting&
38、lt;/p><p> process (rst,carry)</p><p><b> begin</b></p><p> if rst='1' then time <= 0; full<='0';</p><p> elsif rising_edge(carry)
39、then</p><p> if time=59 then time<=0; --over 60</p><p> full<='1'; --carry_out signal</p><p> else time<= time + 1; --keep counting</p><p> ful
40、l<='0';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p> times<=time; end arch;</p><
41、p> port輸入時(shí)鐘信號(hào)和進(jìn)位信號(hào);</p><p> times: 時(shí)間輸出從0到59</p><p> full:計(jì)數(shù)產(chǎn)生進(jìn)位</p><p> Count24(時(shí)計(jì)數(shù)) 源程序如下:</p><p> library ieee; </p><p> use ieee.std_logic_116
42、4.all; </p><p> use ieee.std_logic_unsigned.all; </p><p> use ieee.std_logic_arith.all; </p><p> entity count24 is</p><p> port( carry: in std_logic; --from 1hz in
43、put clock or </p><p> --the full_index of second/minute</p><p> rst: in std_logic; --initialization</p><p> times: out integer range 0 to 23;</p><p> full: out std
44、_logic); -- carry_out signal </p><p> end count24; </p><p> architecture arch of count24 is --input:rst,carry</p><p> --output:times,full</p><p> signal time :
45、integer range 0 to 23;</p><p> begin --process for 60 seconds counting</p><p> process (rst,carry)</p><p><b> begin</b></p><p> if rst='1' the
46、n time <= 0; full<='0';</p><p> elsif rising_edge(carry) then</p><p> if time=23 then time<=0; --over 24</p><p> full<='1'; --carry_out signal<
47、/p><p> else time<= time + 1; --keep counting</p><p> full<='0';</p><p> end if; end if;</p><p> end process;</p><p> times <= tim
48、e; end arch;</p><p> port輸入時(shí)鐘信號(hào)和進(jìn)位信號(hào);</p><p> times: 時(shí)間輸出從0到23</p><p> full:計(jì)數(shù)產(chǎn)生進(jìn)位</p><p><b> 3.5 定時(shí)器模塊</b></p><p> 在此模塊中,先利用stop_watc
49、h組件設(shè)定定時(shí)器的計(jì)時(shí)時(shí)間,并執(zhí)行計(jì)時(shí)動(dòng)作,取得計(jì)時(shí)終止指針,然后由計(jì)時(shí)終止指針標(biāo)示出計(jì)時(shí)終止?fàn)顟B(tài)led_stop =’1’。其模塊如下圖所示。</p><p> 圖 8 定時(shí)器模塊圖</p><p> 定時(shí)器模塊的源程序如下:</p><p> library ieee; </p><p> use ieee.std_logic_1
50、164.all; </p><p> use ieee.std_logic_arith.all; </p><p> use ieee.std_logic_unsigned.all;</p><p> ---input and output pins declaraction </p><p> entity stop_watch i
51、s</p><p> port(rst,hz1: in std_logic;--system clock 1hz</p><p> stop: in std_logic; --keep pushing to declare stop setting</p><p> --stop:時(shí)器設(shè)定動(dòng)作按鍵 </p><p&
52、gt; -- ok: 任何設(shè)定動(dòng)作的確認(rèn)? </p><p> ok: in std_logic;--keep pushing to declare stop setting</p><p> sec_tune: in std_logic;--pushing button to tune seconds</p><p> min_tune
53、: in std_logic;--pushing button to tune minutes</p><p> hour_tune: in std_logic;--pushing button to tune hours</p><p> stop_sec,stop_min: out integer range 0 to 59;</p><p> stop_
54、hour: out integer range 0 to 23;</p><p> index: out std_logic;</p><p> disp: out std_logic); </p><p> end stop_watch; </p><p> architecture arch of stop_watch is<
55、;/p><p> signal a_sec,a_min: integer range 0 to 59;</p><p> signal a_hour: integer range 0 to 23;</p><p><b> begin</b></p><p> process(stop,ok,hz1) </p&
56、gt;<p><b> begin </b></p><p> if rst='1' then index<='0'; disp<='0';</p><p> elsif rising_edge(hz1) then</p><p> if stop='1&
57、#39; and ok='0' then -- setting</p><p> if sec_tune='1' then</p><p> if a_sec=59 then a_sec<=0;</p><p> else a_sec<=a_sec + 1;</p><p><b&
58、gt; end if;</b></p><p><b> end if;</b></p><p> if min_tune='1' then</p><p> if a_min=59 then a_min<=0;</p><p> else a_min<=a_min +
59、 1;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> if hour_tune='1' then</p><p> if a_hour=23 then a_hour<=0;</p>
60、<p> else a_hour<=a_hour + 1;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> disp <= '1';</p><p> elsif stop =
61、39;1' and ok = '1' then --down counting</p><p> if a_sec = 0 then</p><p> if a_min = 0 then</p><p> if a_hour=0 then index<='1' ;</p><p> di
62、sp<='0';</p><p> else a_hour<=a_hour - 1;</p><p> a_min<=59;</p><p> a_sec<=59;</p><p><b> end if;</b></p><p> else a_
63、min<=a_min - 1;</p><p> a_sec<=59;</p><p><b> end if;</b></p><p> else a_sec <= a_sec - 1;</p><p> index <= '0';</p><p>
64、; disp <= '1' ;</p><p><b> end if;</b></p><p> else disp<='0';</p><p><b> end if;</b></p><p><b> end if;</b&
65、gt;</p><p> end process;</p><p> stop_sec <= a_sec;</p><p> stop_min <= a_min;</p><p> stop_hour <= a_hour; </p><p><b> end arch;</b
66、></p><p> stop:時(shí)器設(shè)定動(dòng)作按鍵 </p><p> ok: 任何設(shè)定動(dòng)作的確認(rèn)</p><p> stop_sec,stop_min:秒、分計(jì)時(shí)終了的指針;</p><p> stop_hour: 小時(shí)計(jì)時(shí)終了的指針;</p><p> index:定時(shí)器計(jì)時(shí)終
67、了指針;</p><p> disp:輸出標(biāo)準(zhǔn)邏輯。</p><p> 3.6 鬧鐘設(shè)定模塊</p><p> 為了設(shè)定鬧鐘,我們?cè)O(shè)計(jì)了一個(gè)目標(biāo)時(shí)間調(diào)整程序。以1Hz的顯示速率來(lái)調(diào)整時(shí)分秒的顯示,可以適應(yīng)視覺要求。將alarm的指撥開關(guān)轉(zhuǎn)成on時(shí),6個(gè)數(shù)字即顯示00:00:00,以等待輸入。當(dāng)持續(xù)按住調(diào)秒鍵sec_tune時(shí),秒針將從0持續(xù)增加至59后,再返
68、回O,任何時(shí)刻松開按鍵即顯示當(dāng)時(shí)的值。調(diào)分鍵與調(diào)時(shí)鍵的動(dòng)作原理相同,此時(shí)ok指撥開關(guān)仍在off狀態(tài)。</p><p> 圖9 鬧鐘設(shè)定與時(shí)間對(duì)比功能模塊引腳說明圖</p><p> 鬧鐘設(shè)定模塊的源程序如下:</p><p> library ieee;</p><p> use ieee.std_logic_1164.all;&l
69、t;/p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity alarm_set is --設(shè)定鬧鐘表時(shí)間隔 </p><p> port( rst,hz1: in std_logic;--sys
70、tem clock 1hz</p><p> alarm, ok: in std_logic; --keep pushing to declare alarm set</p><p> -- alarm: 鬧鐘設(shè)定按鍵信號(hào);ok: 任何設(shè)定動(dòng)作的確認(rèn)鍵; </p><p> sec_tune: in std_logic; -
71、- keep pushing to declare second tuning</p><p> min_tune: in std_logic; -- keep pushing to declare minute tuning</p><p> hour_tune: in std_logic; --keep pushing to declare hour tuning</p&g
72、t;<p> sec,min: out integer range 0 to 59;</p><p> hour: out integer range 0 to 23); </p><p><b> end;</b></p><p> --define the signal_structure and _flow of t
73、he device </p><p> architecture arch of alarm_set is</p><p> signal sec_tmp,min_tmp: integer range 0 to 59;</p><p> signal hour_tmp: integer range 0 to 23; </p><p>&
74、lt;b> begin</b></p><p> tuning:process(rst,hz1,alarm, ok)</p><p><b> begin</b></p><p> if rst='1' then sec_tmp<=0; min_tmp<=0; hour_tmp<=0
75、;</p><p> elsif rising_edge(hz1) then</p><p> if alarm='1' and ok='0' then</p><p> if sec_tune='1' then</p><p> if sec_tmp=59 then sec_tmp
76、<=0;</p><p> else sec_tmp<=sec_tmp + 1;</p><p><b> end if; </b></p><p><b> end if;</b></p><p> if min_tune='1' then</p>
77、;<p> if min_tmp=59 then min_tmp<=0;</p><p> else min_tmp<=min_tmp + 1;</p><p><b> end if;</b></p><p><b> end if;</b></p><p>
78、if hour_tune='1' then</p><p> if hour_tmp=23 then hour_tmp<=0;</p><p> else hour_tmp<=hour_tmp +1;</p><p><b> end if;</b></p><p><b>
79、 end if;</b></p><p><b> else</b></p><p><b> null;</b></p><p><b> end if;</b></p><p><b> end if;</b></p>
80、<p> end process tuning;</p><p> sec<=sec_tmp;</p><p> min<=min_tmp;</p><p> hour<=hour_tmp; </p><p><b> end arch;</b></p><p&
81、gt; reset:系統(tǒng)內(nèi)部重置信號(hào);</p><p> reset為復(fù)位信號(hào)</p><p> clock:由外接信號(hào)發(fā)生器提供1Hz的系統(tǒng)時(shí)鐘信號(hào);</p><p> alarm: 鬧鐘設(shè)定按鍵信號(hào);</p><p> stop: 定時(shí)器設(shè)定動(dòng)作按鍵:</p><p> ok: 任何設(shè)定動(dòng)作的確認(rèn)鍵;
82、</p><p> sec_tune: 秒數(shù)調(diào)整的按鍵信號(hào);</p><p> min_tune: 分?jǐn)?shù)調(diào)整的按鍵信號(hào);</p><p> hour__tune: 時(shí)數(shù)調(diào)整的按鍵信號(hào)。</p><p> 3.7 數(shù)據(jù)選擇模塊</p><p> 通常6個(gè)時(shí)分秒數(shù)字所顯示的是正常的計(jì)數(shù)時(shí)鐘,但
83、在鬧鐘與定時(shí)器時(shí)間設(shè)定過程中,必須顯示正在設(shè)定的鬧鈴時(shí)間或定時(shí)器計(jì)時(shí)時(shí)間。另外,在定時(shí)器計(jì)時(shí)過程中,為了觀察進(jìn)行時(shí)間,必須顯示正在計(jì)時(shí)的剩余時(shí)間。最后利用組件將輸出時(shí)間由整數(shù)形式轉(zhuǎn)換成BCD形式。其模塊引腳說明如圖10所示:</p><p> 圖10 數(shù)據(jù)選擇模塊引腳說明圖</p><p> 數(shù)據(jù)選擇模塊程序如下</p><p> library ieee;
84、</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity coji is</p><p> po
85、rt( n_sec,n_min: in integer range 0 to 59;</p><p> n_hour: in integer range 0 to 23;</p><p> s_sec, s_min: integer range 0 to 59;</p><p> s_hour: in intege
86、r range 0 to 23;</p><p> stop_index, stop_disp : in std_logic;</p><p> second, minute : out integer range 0 to 59;</p><p> a_sec,a_min: in integer range 0 to 59;</p>&l
87、t;p> a_hour: in integer range 0 to 23;</p><p> rst: in std_logic;--power reset to initialize</p><p> clk: in std_logic;--system clock 1024hz</p><p> alarm: in std_log
88、ic;--dip switch for alarm setting</p><p> ok: in std_logic; --push button to confirrn any setting operation</p><p> hourr : out integer range 0 to 23;</p><p> led_alarm: out s
89、td_logic; </p><p> led_stop: out std_logic);</p><p><b> end;</b></p><p> architecture arch of coji is</p><p> signal alarm_index : std_logic;</p>
90、<p> signal alarm_disp : std_logic;</p><p><b> begin</b></p><p> p1:process(rst,stop_index)</p><p><b> begin</b></p><p> if rst='
91、1' then led_stop<='0';</p><p> elsif rising_edge(stop_index) then</p><p> led_stop<='1';</p><p><b> end if;</b></p><p> end
92、process p1;</p><p> p2:process(alarm,ok)</p><p><b> begin</b></p><p> if rst='1' then alarm_index <= '0';</p><p> elsif alarm='1&
93、#39; and ok='1' then</p><p> if (a_sec = n_sec and a_min = n_min and a_hour=n_hour)</p><p> then alarm_index <= '1';</p><p> else alarm_index <= '0'
94、;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> alarm_disp <= (alarm and not ok) and not alarm_index;</p><p> end process p2;<
95、/p><p> p3: process(rst,alarm_index)</p><p><b> begin</b></p><p> if rst='1' then led_alarm <= '0';</p><p> elsif rising_edge(alarm_inde
96、x) then</p><p> led_alarm <= '1';</p><p><b> end if;</b></p><p> end process p3; </p><p> p4: process(clk, stop_disp,alarm_disp)</p>
97、<p><b> begin</b></p><p> if rising_edge(clk) then</p><p> if stop_disp='1' then second <= s_sec; minute <= s_min; hourr <= s_hour;</p><p> els
98、if alarm_disp='1' then second <= a_sec; minute <= a_min; hourr <= a_hour;</p><p> else second <= n_sec; minute <= n_min; hourr <= n_hour;</p><p> end if; </p&g
99、t;<p><b> end if; </b></p><p> end process p4;</p><p><b> end;</b></p><p> out std_logic_vector(6 downto 0);--分與秒4個(gè)數(shù)字多路掃描輸出,可顯示在七段顯示器中</p>
100、<p> p1,p2,p3,p4:out std_logic;--分與秒4個(gè)數(shù)字多路掃描電源激活輸出 seg2:out std_logic_vector(6 downto 0);--時(shí)的2個(gè)數(shù)字多路掃描輸出,可顯示在七段顯示器中</p><p> 3.8 譯碼掃描輸出模塊</p><p> 譯碼由時(shí),分,秒的譯碼所組成,掃描輸出由分秒掃描輸出電路和時(shí)掃描輸
101、出電路組成。為了節(jié)省IC的輸出引腳及耗電量,可以將4組數(shù)字輸出或2組數(shù)字輸出作為多路輸出,故所需引腳數(shù)由28降至7個(gè),14降至7個(gè);另外使用四合一型七段顯示器與視覺暫留效應(yīng)可降低顯示耗電量3/4。首先將6個(gè)數(shù)字通過 bin21ed組件由BCD碼轉(zhuǎn)換成七段顯示器碼,然后分別將分秒的4個(gè)數(shù)字通過scan4組件掃描輸出,而將小時(shí)數(shù)的2個(gè)數(shù)字通過scan2組件掃描輸出,最后完成整個(gè)電子鐘的功能。其電路原理圖如下圖所示:</p>&
102、lt;p> 圖11 譯碼掃描輸出模塊原理圖</p><p> 3.8.1分秒譯碼顯示的引腳說明圖及程序</p><p> 分秒譯碼顯示源程序如下:</p><p> library ieee; </p><p> use ieee.std_logic_1164.all; </p><p> use i
103、eee.std_logic_arith.all; </p><p> use ieee.std_logic_unsigned.all;</p><p> entity i60bcd is</p><p> port (interg : in integer range 0 to 59;--interger number</p><p>
104、 ten : out std_logic_vector (3 downto 0); --decimal bit</p><p> one : out std_logic_vector (3 downto 0)); --ndividual bit </p><p> end i60bcd; </p><p> architecture arch of
105、i60bcd is</p><p><b> begin</b></p><p> process (interg)</p><p><b> begin</b></p><p> case interg is</p><p> when 0|10|20|30|40
106、|50 => one<="0000";</p><p> when 1|11|21|31|41|51 => one<="0001";</p><p> when 2|12|22|32|42|52 => one<="0010";</p><p> when 3|13|
107、23|33|43|53 => one<="0011";</p><p> when 4|14|24|34|44|54 => one<="0100";</p><p> when 5|15|25|35|45|55 => one<="0101";</p><p> wh
108、en 6|16|26|36|46|56 => one<="0110";</p><p> when 7|17|27|37|47|57 => one<="0111";</p><p> when 8|18|28|38|48|58 => one<="1000";</p><p
109、> when 9|19|29|39|49|59 => one<="1001";</p><p> when others => one<="1110";</p><p><b> end case;</b></p><p> case interg is</p&
110、gt;<p> when 0|1|2|3|4|5|6|7|8|9 => ten<="0000";</p><p> when 10|11|12|13|14|15|16|17|18|19 => ten<="0001";</p><p> when 20|21|22|23|24|25|26|27|28|29 =
111、> ten<="0010";</p><p> when 30|31|32|33|34|35|36|37|38|39 => ten<="0011";</p><p> when 40|41|42|43|44|45|46|47|48|49 => ten<="0100";</p>
112、<p> when 50|51|52|53|54|55|56|57|58|59 => ten<="0101";</p><p> when others => ten<="1110";</p><p><b> end case;</b></p><p> end
113、 process; </p><p><b> end arch;</b></p><p> interg:規(guī)定集成輸出范圍信號(hào)。</p><p><b> 輸出端口說明:</b></p><p> ten、one:十位、個(gè)位輸出。</p><p> 3.8.2 時(shí)
114、鐘譯碼顯示的引腳說明圖及程序</p><p> 時(shí)鐘譯碼顯示源程序如下</p><p> library ieee;</p><p> use ieee.std_logic_1164.all; </p><p> use ieee.std_logic_arith.all; </p><p> use ieee
115、.std_logic_unsigned.all; </p><p> entity i24bcd is</p><p> port (interg : in integer range 0 to 23;--interger number</p><p> ten : out std_logic_vector(3 downto 0) ;--decimal bi
116、t</p><p> one : out std_logic_vector(3 downto 0) );--individual bit </p><p> end i24bcd;</p><p> architecture arch of i24bcd is</p><p><b> begin</b><
117、/p><p> process(interg)</p><p><b> begin</b></p><p> case interg is</p><p> when 0|10|20 => one <="0000";</p><p> when 1|11|2
118、1 => one<="0001";</p><p> when 2|12|22 => one<="0010";</p><p> when 3|13|23 => one <="0011";</p><p> when 4|14 => one<="
119、;0100";</p><p> when 5|15 => one<="0101";</p><p> when 6|16 => one<="0110";</p><p> when 7|17 => one<="0111";</p><
120、p> when 8|18 => one<="1000";</p><p> when 9|19 => one<="1001";</p><p> when others => one <= "1110";</p><p><b> end cas
121、e;</b></p><p> case interg is</p><p> when 0|1|2|3|4|5|6|7|8|9 => ten<="0000";</p><p> when 10|11|12|13|14|15|16|17|18|19 => ten<="0001";<
122、;/p><p> when 20|21|22|23 => ten<="0010";</p><p> when others => ten <= "1110" ;</p><p><b> end case;</b></p><p> end pro
123、cess;</p><p><b> end arch;</b></p><p> interg:規(guī)定集成輸出范圍信號(hào)。</p><p><b> 輸出端口說明:</b></p><p> ten、one:十位、個(gè)位輸出</p><p> 3.8.3 譯碼顯示的的
124、引腳說明圖及程序</p><p> 譯碼顯示的源程序如下:</p><p> library ieee; </p><p> use ieee.std_logic_1164.all; </p><p> use ieee.std_logic_unsigned.all; </p><p> use ieee.s
125、td_logic_arith.all; </p><p> entity bin21ed is </p><p> port (bin : in std_logic_vector(3 downto 0); --internal binary number</p><p> led : out std_logic_vector(6 downto 0) );-
126、-7_segments led display</p><p> end bin21ed; </p><p> architecture arch of bin21ed is </p><p> begin -- segment encoding</p><p> with bin select</p><p&
127、gt; led <= "1111001" when "0001",--1</p><p> "0100100" when "0010" , --2</p><p> "0110000" when "0011" ,--3</p><
128、;p> "0011001" when "0100" ,--4</p><p> "0010010" when "0101",--5</p><p> "0000010" when "0110", -- 6</p><p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字鐘畢業(yè)設(shè)計(jì)---可調(diào)數(shù)字鐘設(shè)計(jì)
- 數(shù)字鐘畢業(yè)設(shè)計(jì)
- 數(shù)字鐘設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 基于fpga的數(shù)字鐘設(shè)計(jì)
- 基于fpga的數(shù)字鐘設(shè)計(jì)
- 可調(diào)數(shù)字鐘的畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--數(shù)字鐘電路pcb設(shè)計(jì)
- 多功能數(shù)字鐘畢業(yè)設(shè)計(jì)
- 單片機(jī)數(shù)字鐘畢業(yè)設(shè)計(jì)---單片機(jī)設(shè)計(jì)數(shù)字鐘
- 畢業(yè)設(shè)計(jì)報(bào)告數(shù)字鐘設(shè)計(jì)與制作
- 基于fpga多功能數(shù)字鐘設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---多功能遙控?cái)?shù)字鐘的設(shè)計(jì)
- 基于fpga的數(shù)字鐘課程設(shè)計(jì)
- 課程設(shè)計(jì)--基于fpga的數(shù)字鐘設(shè)計(jì)
- 大學(xué)畢業(yè)論文-基于fpga的數(shù)字鐘設(shè)計(jì)
- 基于fpga的數(shù)字鐘設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì) 多功能數(shù)字鐘電路設(shè)計(jì)
- 數(shù)字電路多功能數(shù)字鐘畢業(yè)設(shè)計(jì)
- eda課程設(shè)計(jì)---基于fpga的數(shù)字鐘設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----數(shù)字鐘兼鐘控定時(shí)器的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論