畢業(yè)設(shè)計----fpga的數(shù)字鐘設(shè)計_第1頁
已閱讀1頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  緒 論</b></p><p>  1.1.1 FPGA的概述及特點</p><p>  FPGA是英文Field Programmable Gate Array的縮寫,即現(xiàn)場可編程門陣列,它是在PAL、GAL、EPLD等可編程器件的基礎(chǔ)上進一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路

2、的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。FPGA采用了邏輯單元陣列LCA(Logic Cell Array)這樣一個新概念,內(nèi)部包括可配置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內(nèi)部連線(Interconnect)三個部分。</p><p>  特點有采用FPGA設(shè)計ASIC電路,用戶不需要投片生產(chǎn),就能得到合用的芯

3、片; FPGA可做其它全定制或半定制ASIC電路的中試樣片;FPGA內(nèi)部有豐富的觸發(fā)器和I/O引腳;FPGA是ASIC電路中設(shè)計周期最短、開發(fā)費用最低、風險最小的器件之一;FPGA采用高速CHMOS工藝,功耗低,可以與CMOS、TTL電平兼容。可以說,F(xiàn)PGA芯片是小批量系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之一。</p><p>  FPGA是由存放在片內(nèi)RAM中的程序來設(shè)置其工作狀態(tài)的,因此,工作時需要對片內(nèi)的

4、RAM進行編程。用戶可以根據(jù)不同的配置模式,采用不同的編程方式。FPGA有多種配置模式:并行主模式為一片F(xiàn)PGA加一片EPROM的方式;主從模式可以支持一片PROM編程多片F(xiàn)PGA;串行模式可以采用串行PROM編程FPGA;外設(shè)模式可以將FPGA作為微處理器的外設(shè),由微處理器對其編程。</p><p> ?。?1.2 VHDL的概述及特點</p><p>  VHDL(Very High

5、Speed Integrated Circuit Hardware Description Language)即超高速集成電路硬件描述語言,在基于CPLD/FPGA和ASIC的數(shù)字系統(tǒng)設(shè)計中有著廣泛的應用。VHDL語言誕生于1983年,1987年被美國國防部和IEEE確定為標準的硬件描述語言。自從IEEE發(fā)布了VHDL的第一個標準版本IEEE 1076-1987后,各大EDA公司都先后推出了自己的支持VHDL的EDA工具。VHDL在電子

6、設(shè)計行業(yè)得到了廣泛的認同。此后IEEE又先后發(fā)布了IEEE 1076-1993和IEEE 1076-2000版本。 </p><p>  VHDL是硬件設(shè)計人員的一種描述工具,硬件設(shè)計本身還是要人來完成的。VHDL被設(shè)計出來的目的是為了硬件設(shè)計,具有硬件的性質(zhì)。它用于描述電路系統(tǒng)的結(jié)構(gòu),接口,行為和功能,除了它具有的硬件特征的語句外,它的語言形式和描述風格,以及句法與一般的計算機高級語言相當類似,然而它又與軟件語

7、言具有完全不同的性質(zhì)。結(jié)構(gòu)簡單明了,各部分負責的硬件描述明確,能避開硬件具體的器件結(jié)構(gòu),用強大的行為描述能力對電路從邏輯上進行描述和設(shè)計;可以看出,VHDL對設(shè)計的描述具有相對獨立性,設(shè)計者可以不懂硬件的結(jié)構(gòu),也不必關(guān)心最終設(shè)計實現(xiàn)的目標器件是什么;設(shè)計者的責任是把硬件的結(jié)構(gòu)和功能完整詳細地描述出來;此外,用VHDL設(shè)計的系統(tǒng)的功能可行性能夠在早期就檢驗出來,這主要是因為隨時可以對設(shè)計進行仿真;以上特點決定了VHDL擁有的另一個很重要的

8、優(yōu)勢:代碼的再利用功能。這一點很適合目前急速發(fā)展的市場需求。</p><p>  1.2 MAX+plus II開發(fā)環(huán)境應用簡介</p><p>  1 、原理圖輸入(Graphic Editor)</p><p>  MAX+PLUSII軟件具有圖形輸入能力,用戶可以方便的使用圖形編輯器輸入電路圖,圖中的元器件可以調(diào)用元件庫中元器件,除調(diào)用庫中的元件以外,還可以

9、調(diào)用該軟件中的符號功能形成的功能塊.圖形編輯器窗口見圖(13)。</p><p>  2、硬件描述語言輸入(Text Editor)</p><p>  MAX+PLUSII軟件中有一個集成的文本編輯器,該編輯器支持VHDL,AHDL和Verilog硬件描述語言的輸入,同時還有一個語言模板使輸入程序語言更加方便,該軟件可以對這些程序語言進行編譯并形成可以下載配置數(shù)據(jù),文本編輯器窗口見圖(1

10、4)。</p><p> ?。场⒉ㄐ尉庉嬈?Waveform Editor)</p><p>  在進行邏輯電路的行為仿真時,需要在所設(shè)計電路的輸入端加入一定的波形,波形編輯器可以生成和編輯仿真用的波形(*.SCF文件),使用該編輯器的工具條可以容易方便的生成波形和編輯波形。波形編輯器窗口如圖(15)所示。使用時只要將欲輸入波形的時間段用鼠標涂黑,然后選擇工具條中的按鈕,例如,如果要某一時

11、間段為高電平,只需選擇按鈕 ”1”。</p><p>  還可以使用輸入的波形(*.WDF文件)經(jīng)過編譯生成邏輯功能塊,相當于已知一個芯片的輸入輸出波形,但不知是何種芯片,使用該軟件功能可以解決這個問題,設(shè)計出一個輸入和輸出波形相同CPLD電路。</p><p> ?。?、管腳(底層)編輯窗口(Floorplan Editor)</p><p>  該窗口用于將已設(shè)計

12、好邏輯電路的輸入輸出節(jié)點賦予實際芯片的引腳,通過鼠標的拖拉,方便的定義管腳的功能。管腳(底層)編輯窗口見圖(16)。</p><p><b>  5、設(shè)計規(guī)則檢查</b></p><p>  選取Compile\Processing\Design Doctor菜單,將調(diào)出規(guī)則檢查醫(yī)生,該醫(yī)生可以按照三種規(guī)則中的一個規(guī)則檢查各個設(shè)計文件,以保證設(shè)計的可靠性。一旦選擇該菜

13、單,在編譯窗口將顯示出醫(yī)生,用鼠標點擊醫(yī)生,該醫(yī)生可以告訴你程序文件的健康情況。見圖(17)。 </p><p><b>  6、編程文件的產(chǎn)生</b></p><p>  編譯器中的裝配程序(Assembler)將編譯好的程序創(chuàng)建一個或多個編程目標文件:</p><p>  EPROM配置文件(*.POF)例如,MAX7000S系列<

14、/p><p>  SRAM文件(*.SCF)例如,FLEX8000系列的配置芯片EPROM</p><p>  JEDEC文件(*.JED)</p><p>  十六進制文件(*.HEX)</p><p>  文本文件(*.TTF)</p><p>  串行BIT流文件(*.SBF)</p><p>

15、;<b>  7、仿真</b></p><p>  當設(shè)計文件被編譯好,并在波形編輯器中將輸入波形編輯完畢后,就可以進行行為仿真了,通過仿真可以檢驗設(shè)計的邏輯關(guān)系是否準確.</p><p>  8、分析時間(Analyze Timing)</p><p>  該功能可以分析各個信號到輸出端的時間延遲,可以給出延遲矩陣和最高工作頻率.見圖(18)

16、和圖(19)。</p><p><b>  2 電子鐘的概述</b></p><p><b>  2.1 設(shè)計原理</b></p><p>  數(shù)字鐘電路的基本結(jié)構(gòu)由兩個60進制計數(shù)器和一個24進制計數(shù)器組成,分別對秒、分、小時進行計時,當計時到23時59分59秒時,再來一個計數(shù)脈沖,則計數(shù)器清零,重新開始計時。秒計數(shù)器

17、的計數(shù)時鐘CLK為1Hz的標準信號,可以由晶振產(chǎn)生的24 MHz信號通過分頻得到。當數(shù)字鐘處于計時狀態(tài)時,秒計數(shù)器的進位輸出信號作為分鐘計數(shù)器的計數(shù)信號,分鐘計數(shù)器的進位輸出信號又作為小時計數(shù)器的計數(shù)信號時、分、秒的計時結(jié)果通過6個數(shù)碼管來動態(tài)顯示。數(shù)字鐘除了能夠正常計時外,還應能夠?qū)r間進行調(diào)整。因此,通過模式選擇信號MOD1、MOD2控制數(shù)字鐘的工作狀態(tài),即控制數(shù)字鐘,使其分別工作于正常計時,調(diào)整分、時和設(shè)定分、時5個狀態(tài)。當數(shù)字鐘

18、處于計時狀態(tài)時,3個計數(shù)器允許計數(shù),且秒、分、時計數(shù)器的計數(shù)時鐘信號分別為CLK,秒的進位, 分的進位;當數(shù)字鐘處于調(diào)整時間狀態(tài)時,被調(diào)的分或時會一秒一秒地增加;當數(shù)字鐘處于定時狀態(tài)時,可以設(shè)定小時和分;當計時到所設(shè)定的時刻時,speak將會被賦予1KHz的脈沖信號用于驅(qū)動揚聲器.</p><p>  電子鐘的外形圖如下:</p><p>  圖1 電子鐘的外形圖</p>

19、<p>  2.1 整體設(shè)計框圖如下</p><p>  2.2 數(shù)字鐘在FPGA芯片中的頂層原理圖如下</p><p>  圖3 數(shù)字鐘在FPGA芯片中的頂層原理圖</p><p><b>  3各模塊設(shè)計</b></p><p><b>  3.1 外部按鍵</b></p&g

20、t;<p>  Reset鍵: 該鍵為系統(tǒng)復位按鍵,按此鍵可以進行時間的復位。如:時間顯示為23:09:18,則按此鍵后時間顯示了00:00:00;</p><p>  alarm鍵:該鍵為鬧鐘設(shè)定按鍵,按此鍵可以進行鬧鐘的任意時間設(shè)置;</p><p>  stop鍵:該鍵為時間定時設(shè)定按鍵,用此鍵可以完成時間的定時功能;</p><p>  ok鍵

21、:該鍵作為任何設(shè)定動作的確認鍵,如當需要調(diào)整時間時,調(diào)整好需要的時間后,按ok鍵即可確認所調(diào)的時間;</p><p>  調(diào)秒鍵、調(diào)分鍵、調(diào)時鍵,六個七段數(shù)碼管。</p><p>  3.2 晶振電路模塊</p><p>  振蕩器是數(shù)字鐘的核心。振蕩器的穩(wěn)定度及頻率的精確度決定了數(shù)字鐘計時的準確程度,通常選用石英晶體構(gòu)成振蕩器電路。一般來說,振蕩器的頻率越高,計時

22、精度越高。電子手表集成電路中的晶體振蕩器電路,取晶振的頻率為32768Hz,</p><p>  圖4 晶 振 電 路</p><p><b>  3.3 分頻器模塊</b></p><p>  為了得到秒脈沖信號,需要經(jīng)過一個分頻電路,主要有2個部分,一個是產(chǎn)生1HZ的計數(shù)頻率,一個是產(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) 為計數(shù)器模塊輸入1HZ

32、的頻率</p><p>  3.4 正常計數(shù)器模塊</p><p>  電子鐘計時模塊主要是用來實現(xiàn)內(nèi)部定時計數(shù)功能。計時模塊的輸入信號包括內(nèi)部計時時鐘信號clk0,輸出信號就是計時信息,包括小時十位信號hr10、小時個位信號hr、分十位信號min10、分個位信號min、秒十位信號sec10、秒個位信號sec。實現(xiàn)計數(shù)器模塊的原理圖如下:</p><p>  圖7

33、計數(shù)器模塊的原理圖</p><p>  1. 秒計數(shù):秒計數(shù),在頻率為1HZ的時鐘下以60次為循環(huán)計數(shù),并產(chǎn)生進位信號影響分計數(shù);</p><p>  2. 分計數(shù):分計數(shù),在秒進位信號為高電平時,計數(shù)一次,同樣以60次為一個循環(huán)計數(shù),同時產(chǎn)生分進位信號影響時計數(shù);</p><p>  3 .時計數(shù):時計數(shù),在分進位信號為高電平時,計數(shù)一次,以24次為一個循環(huán)

34、計數(shù)count60(秒計數(shù)和分計數(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輸入時鐘信號和進位信號;</p><p>  times: 時間輸出從0到59</p><p>  full:計數(shù)產(chǎn)生進位</p><p>  Count24(時計數(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輸入時鐘信號和進位信號;</p><p>  times: 時間輸出從0到23</p><p>  full:計數(shù)產(chǎn)生進位</p><p><b>  3.5 定時器模塊</b></p><p>  在此模塊中,先利用stop_watc

49、h組件設(shè)定定時器的計時時間,并執(zhí)行計時動作,取得計時終止指針,然后由計時終止指針標示出計時終止狀態(tài)led_stop =’1’。其模塊如下圖所示。</p><p>  圖 8 定時器模塊圖</p><p>  定時器模塊的源程序如下:</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è)定動作按鍵 </p><p&

52、gt;  -- ok: 任何設(shè)定動作的確認? </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è)定動作按鍵 </p><p>  ok: 任何設(shè)定動作的確認</p><p>  stop_sec,stop_min:秒、分計時終了的指針;</p><p>  stop_hour: 小時計時終了的指針;</p><p>  index:定時器計時終

67、了指針;</p><p>  disp:輸出標準邏輯。</p><p>  3.6 鬧鐘設(shè)定模塊</p><p>  為了設(shè)定鬧鐘,我們設(shè)計了一個目標時間調(diào)整程序。以1Hz的顯示速率來調(diào)整時分秒的顯示,可以適應視覺要求。將alarm的指撥開關(guān)轉(zhuǎn)成on時,6個數(shù)字即顯示00:00:00,以等待輸入。當持續(xù)按住調(diào)秒鍵sec_tune時,秒針將從0持續(xù)增加至59后,再返

68、回O,任何時刻松開按鍵即顯示當時的值。調(diào)分鍵與調(diào)時鍵的動作原理相同,此時ok指撥開關(guān)仍在off狀態(tài)。</p><p>  圖9 鬧鐘設(shè)定與時間對比功能模塊引腳說明圖</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è)定鬧鐘表時間隔 </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è)定按鍵信號;ok: 任何設(shè)定動作的確認鍵; </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)部重置信號;</p><p>  reset為復位信號</p><p>  clock:由外接信號發(fā)生器提供1Hz的系統(tǒng)時鐘信號;</p><p>  alarm: 鬧鐘設(shè)定按鍵信號;</p><p>  stop: 定時器設(shè)定動作按鍵:</p><p>  ok: 任何設(shè)定動作的確認鍵;

82、</p><p>  sec_tune: 秒數(shù)調(diào)整的按鍵信號;</p><p>  min_tune: 分數(shù)調(diào)整的按鍵信號;</p><p>  hour__tune: 時數(shù)調(diào)整的按鍵信號。</p><p>  3.7 數(shù)據(jù)選擇模塊</p><p>  通常6個時分秒數(shù)字所顯示的是正常的計數(shù)時鐘,但

83、在鬧鐘與定時器時間設(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個數(shù)字多路掃描輸出,可顯示在七段顯示器中</p>

100、<p>  p1,p2,p3,p4:out std_logic;--分與秒4個數(shù)字多路掃描電源激活輸出  seg2:out std_logic_vector(6 downto 0);--時的2個數(shù)字多路掃描輸出,可顯示在七段顯示器中</p><p>  3.8 譯碼掃描輸出模塊</p><p>  譯碼由時,分,秒的譯碼所組成,掃描輸出由分秒掃描輸出電路和時掃描輸

101、出電路組成。為了節(jié)省IC的輸出引腳及耗電量,可以將4組數(shù)字輸出或2組數(shù)字輸出作為多路輸出,故所需引腳數(shù)由28降至7個,14降至7個;另外使用四合一型七段顯示器與視覺暫留效應可降低顯示耗電量3/4。首先將6個數(shù)字通過 bin21ed組件由BCD碼轉(zhuǎn)換成七段顯示器碼,然后分別將分秒的4個數(shù)字通過scan4組件掃描輸出,而將小時數(shù)的2個數(shù)字通過scan2組件掃描輸出,最后完成整個電子鐘的功能。其電路原理圖如下圖所示:</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ī)定集成輸出范圍信號。</p><p><b>  輸出端口說明:</b></p><p>  ten、one:十位、個位輸出。</p><p>  3.8.2 時

114、鐘譯碼顯示的引腳說明圖及程序</p><p>  時鐘譯碼顯示源程序如下</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ī)定集成輸出范圍信號。</p><p><b>  輸出端口說明:</b></p><p>  ten、one:十位、個位輸出</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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論