基于vhdl的fpga數(shù)字鐘設計_第1頁
基于vhdl的fpga數(shù)字鐘設計_第2頁
基于vhdl的fpga數(shù)字鐘設計_第3頁
基于vhdl的fpga數(shù)字鐘設計_第4頁
基于vhdl的fpga數(shù)字鐘設計_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

可編程數(shù)字系統(tǒng)設計課程設計實驗報告實驗名稱:基于VHDL的數(shù)字鐘設計_所屬課程:可編程數(shù)字系統(tǒng)設計《可編程數(shù)字系統(tǒng)》課程設計一、課程設計目的:熟悉EDA工具;掌握用VHDL語言進行數(shù)字系統(tǒng)設計的基本方法和過程。二、設計任務:設計一數(shù)字鐘,用數(shù)碼管顯示基本功能要求:(1)可以分屏顯示時、分、秒,可用數(shù)碼管的小數(shù)點“.”代替時、分、秒的分隔符“:”,分屏顯示是指由于數(shù)碼管只有4個,不能同時顯示時、分、秒,但可以只顯示時、分,或只顯示分、秒,通過按鍵來切換這兩種顯示方式。(2)可設置時鐘的開始時間。設置時,相應的數(shù)碼管要閃爍,指示當前設置的設置(內容)。(3)具有鬧鈴功能,可以設定鬧鈴時間。鬧鈴時間到,LED閃爍進行指示。三、設計原理:數(shù)字鐘的邏輯框圖如圖1所示。它由校時部分、鬧鐘部分、計時部分、顯示部分組成。振蕩器產生穩(wěn)定的高頻脈沖信號,作為數(shù)字鐘的時間基準,然后經(jīng)過分頻器輸出標準秒脈沖。秒鐘計數(shù)器滿60后向分計數(shù)器進位,分鐘計數(shù)器滿60后向小時計數(shù)器進位,時鐘計數(shù)器按照“24歸0”規(guī)律計數(shù)。計數(shù)器的輸出分別經(jīng)譯碼器送顯示。當計時出現(xiàn)誤差時或者到達另外一個時區(qū)時,可以用校時部分校時、校分、校秒。需要是用鬧鐘時,可以利用鬧鐘部分進行定時。四、系統(tǒng)分析:根據(jù)數(shù)字鐘的功能,我們可以將它的系統(tǒng)電路設計劃分為四個部分:校時部分、鬧鐘部分、計時部分和顯示部分。其中計時部分又劃分為秒鐘計時模塊、分鐘計時模塊、時鐘計時模塊,顯示部分又劃分為BCD譯碼模塊和掃屏輸出模塊。 校時模塊校時模塊秒鐘計時模塊分鐘計時模塊時鐘計時模塊譯碼模塊掃屏輸出鬧鐘模塊LED燈圖1數(shù)字鐘的頂層實體描述如下:--TOP.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYdigitalclockIS PORT( --輸入時鐘 CLK:INSTD_LOGIC; --設定鬧鐘 ALARM_SET:INSTD_LOGIC; --雙鍵位校時 SET:INSTD_LOGIC; MODE:INSTD_LOGIC; --選擇顯示方式 CHG:INSTD_LOGIC; --八段譯碼輸出 out_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0); --輸出片選 seg_out:OUTSTD_LOGIC_VECTOR(3DOWNTO0); --LED輸出 ED_OUT:OUTSTD_LOGIC );ENDdigitalclock;ARCHITECTUREEXAMPLEOFdigitalclockIS--元件例化COMPONENTadjuster PORT( --輸入時鐘 CLK:INSTD_LOGIC; --雙鍵位校時 SET:INSTD_LOGIC; MODE:INSTD_LOGIC; --計數(shù)使能,接VCC EN:INSTD_LOGIC; --秒計數(shù)器進位輸入 S_ENOUT:INSTD_LOGIC; --分計數(shù)器進位輸入 M_ENOUT:INSTD_LOGIC; --輸出1HZ時鐘 CLK1HZ:OUTSTD_LOGIC; --輸出使能 S_CE:OUTSTD_LOGIC; M_CE:OUTSTD_LOGIC; H_CE:OUTSTD_LOGIC );ENDCOMPONENT;COMPONENTCNT60 PORT( --輸入1HZ時鐘 CLK1HZ:INSTD_LOGIC; --計數(shù)使能 EN:INSTD_LOGIC; --進位輸出 ENOUT:OUTSTD_LOGIC; --BCD輸出 LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0); HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDCOMPONENT;COMPONENTCNT24 ORT( --輸入1HZ時鐘 CLK1HZ:INSTD_LOGIC; --計數(shù)使能 EN:INSTD_LOGIC; --BCD輸出 LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0); HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDCOMPONENT;COMPONENTdisplay PORT( --BCD輸入 in_data:INSTD_LOGIC_VECTOR(3DOWNTO0); --八段譯碼輸出 out_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDCOMPONENT;COMPONENTsaoping PORT( --選擇顯示方式 CHG:INSTD_LOGIC; --BCD輸入 SL:INSTD_LOGIC_VECTOR(7DOWNTO0); SH:INSTD_LOGIC_VECTOR(7DOWNTO0); ML:INSTD_LOGIC_VECTOR(7DOWNTO0); MH:INSTD_LOGIC_VECTOR(7DOWNTO0); HL:INSTD_LOGIC_VECTOR(7DOWNTO0); HH:INSTD_LOGIC_VECTOR(7DOWNTO0); ALARM_L:INSTD_LOGIC_VECTOR(7DOWNTO0); ALARM_H:INSTD_LOGIC_VECTOR(7DOWNTO0); --輸入時鐘 CLK:INSTD_LOGIC; --輸出片選 seg:outstd_logic_vector(3downto0); --BCD輸出 out_data:outstd_logic_vector(7downto0) );ENDCOMPONENT;COMPONENT alarm PORT( --輸入時鐘 CLK:INSTD_LOGIC; --設定鬧鐘 ALARM_SET:INSTD_LOGIC; --BCD輸入 IN_HL:INSTD_LOGIC_VECTOR(3DOWNTO0); IN_HH:INSTD_LOGIC_VECTOR(3DOWNTO0); IN_ML:INSTD_LOGIC_VECTOR(3DOWNTO0); IN_MH:INSTD_LOGIC_VECTOR(3DOWNTO0); --BCD輸出 LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0); HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0); --LED輸出 LED_OUT:OUTSTD_LOGIC );ENDCOMPONENT;--常數(shù)說明CONSTANTVCC:STD_LOGIC:='1';--信號說明SIGNALVCC_CON:STD_LOGIC;SIGNALS_ENOUT:STD_LOGIC;SIGNALM_ENOUT:STD_LOGIC;SIGNALCLK1HZ:STD_LOGIC;--計數(shù)使能SIGNALS_CE:STD_LOGIC;SIGNALM_CE:STD_LOGIC;SIGNALH_CE:STD_LOGIC;--BCD碼SIGNALSL:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALML:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALMH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALHL:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALHH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALALARM_LOW:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALALARM_HIGH:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALSL_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALSH_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALML_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALMH_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALHL_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALHH_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALALARM_L_OUT:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALALARM_H_OUT:STD_LOGIC_VECTOR(7DOWNTO0); BEGIN--元件聲明ADJUST_CONTROL:adjusterPORTMAP( --輸入時鐘 CLK=>CLK, --雙鍵位校時 SET=>SET, MODE=>MODE, --計數(shù)使能,接VCC EN=>VCC_CON, --秒計數(shù)器進位輸入 S_ENOUT=>S_ENOUT, --分計數(shù)器進位輸入 M_ENOUT=>M_ENOUT, --輸出信號 CLK1HZ=>CLK1HZ, --輸出使能 S_CE=>S_CE, M_CE=>M_CE, H_CE=>H_CE );VCC_CON<=VCC;S_CONTROL:CNT60PORTMAP( --輸入1HZ時鐘 CLK1HZ=>CLK1HZ, --計數(shù)使能,接VCC EN=>S_CE, --進位輸出 ENOUT=>S_ENOUT, --BCD輸出 LOW=>SL, HIGH=>SH );M_CONTROL:CNT60PORTMAP( --輸入1HZ時鐘 CLK1HZ=>CLK1HZ, --計數(shù)使能 EN=>M_CE, --進位輸出 ENOUT=>M_ENOUT, --BCD輸出 LOW=>ML, HIGH=>MH );H_CONTROL:CNT24PORTMAP( --輸入1HZ時鐘 CLK1HZ=>CLK1HZ, --計數(shù)使能 EN=>H_CE, --BCD輸出 LOW=>HL, HIGH=>HH ); ALARM_CLOCK:alarmPORTMAP( --輸入時鐘 CLK=>CLK, --設定鬧鐘 ALARM_SET=>ALARM_SET, --BCD輸入 IN_HL=>HL, IN_HH=>HH, IN_ML=>ML, IN_MH=>MH, --BCD輸出 LOW=>ALARM_LOW, HIGH=>ALARM_HIGH, --LED輸出 LED_OUT=>LED_OUT );SL_DIS:displayPORTMAP( --BCD輸入 in_data=>SL, --八段譯碼輸出 out_data=>SL_OUT );SH_DIS:displayPORTMAP( --BCD輸入 in_data=>SH, --八段譯碼輸出 out_data=>SH_OUT ); ML_DIS:displayPORTMAP( --BCD輸入 in_data=>ML, --八段譯碼輸出 out_data=>ML_OUT );MH_DIS:displayPORTMAP( --BCD輸入 in_data=>MH, --八段譯碼輸出 out_data=>MH_OUT );HL_DIS:displayPORTMAP( --BCD輸入 in_data=>HL, --八段譯碼輸出 out_data=>HL_OUT ); HH_DIS:displayPORTMAP( --BCD輸入 in_data=>HH, --八段譯碼輸出 out_data=>HH_OUT ); ALARM_L_DIS:displayPORTMAP( --BCD輸入 in_data=>ALARM_LOW, --八段譯碼輸出 out_data=>ALARM_L_OUT ); ALARM_H_DIS:displayPORTMAP( --BCD輸入 in_data=>ALARM_HIGH, --八段譯碼輸出 out_data=>ALARM_H_OUT ); SAOPINGQI:saopingPORTMAP( --BCD輸入 SL=>SL_OUT, SH=>SH_OUT, ML=>ML_OUT, MH=>MH_OUT, HL=>HL_OUT, HH=>HH_OUT, ALARM_L=>ALARM_L_OUT, ALARM_H=>ALARM_H_OUT, --選擇顯示方式 CHG=>CHG, --輸入時鐘 CLK=>CLK, --輸出片選 seg=>seg_out, --BCD輸出 out_data=>out_data );ENDEXAMPLE; 仿真結果如下:該頂層文件原理圖如下: 系統(tǒng)實驗實驗結果如下: 五、程序設計:1、校時模塊:采用的是雙鍵校時法,MODE和SET,其中MODE選擇需要調整的部分:時鐘、分鐘、秒鐘,而SET則作為調整脈沖。校時模塊的核心思想是利用一個計數(shù)器CON來作為狀態(tài)機,CON=0時為正常工作狀態(tài),CON=1時為調整秒鐘狀態(tài),CON=2時為調整分鐘狀態(tài),CON=3時為調整時鐘狀態(tài)。調整的時候,利用SET代替CLK1HZ作為計數(shù)器輸入脈沖,相當于按一次SET則被調整的計數(shù)器中的當前值+1,由此獲得一個數(shù)字鐘的時間設定效果。校時模塊同時還具有控制時鐘、分鐘、秒鐘計數(shù)器工作的功能,通過兩個進位輸入端以及三個使能控制端讓時鐘、分鐘、秒鐘計數(shù)器能夠有序工作。比如,當秒鐘計數(shù)器產生一個進位輸入校時模塊后,校時模塊才通過使能輸出端令分鐘計數(shù)器工作一下,以此類推控制分鐘、時鐘之間的有序工作。元件視圖如下: 源程序如下:--adjuster.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYadjusterIS PORT( --輸入時鐘 CLK:INSTD_LOGIC; --雙鍵位校時 SET:INSTD_LOGIC; MODE:INSTD_LOGIC; --計數(shù)使能,接VCC EN:INSTD_LOGIC; --秒計數(shù)器進位輸入 S_ENOUT:INSTD_LOGIC; --分計數(shù)器進位輸入 M_ENOUT:INSTD_LOGIC; --輸出1HZ時鐘 CLK1HZ:OUTSTD_LOGIC; --輸出使能 S_CE:OUTSTD_LOGIC; M_CE:OUTSTD_LOGIC; H_CE:OUTSTD_LOGIC );ENDadjuster;ARCHITECTUREEXAMPLEOFadjusterISSIGNALSEL:STD_LOGIC;SIGNALSCE_R:STD_LOGIC;SIGNALMCE_R:STD_LOGIC;SIGNALHCE_R:STD_LOGIC;SIGNALCON:INTEGERSIGNALCLKCON1:INTEGERSIGNALCLKCON2:INTEGERSIGNALOUTCLK:STD_LOGIC;SIGNALOUTCLK_TEMP:STD_LOGIC;BEGIN--變頻為1HZCLK1_PROC:PROCESS(CLK) BEGIN IFCLK'EVENTANDCLK='0'THEN IFCLKCON1=5000THEN CLKCON1<=0; OUTCLK_TEMP<='0'; ELSE CLKCON1<=CLKCON1+1; OUTCLK_TEMP<='1'; ELSEIF; ENDIF;ENDPROCESS;CLK2_PROC:PROCESS(OUTCLK_TEMP)BEGIN IFOUTCLK_TEMP'EVENTANDOUTCLK_TEMP='0'THEN IFCLKCON2=10000THEN CLKCON2<=0; OUTCLK<='0'; ELSE CLKCON2<=CLKCON2+1; OUTCLK<='1'; ENDIF; ENDIF;ENDPROCESS;-模為4的計數(shù)器CNT:PROCESS(MODE,SET)BEGINIFMODE'EVENTANDMODE='0'THENIFCON=3THEN CON<=0; ELSE CON<=CON+1; ENDIF; ENDIF;ENDPROCESS;--四個調整狀態(tài)CON_PRO:PROCESS(CON)BEGIN CASECONIS WHEN0=>SEL<='1'; SCE_R<='0'; MCE_R<='0'; HCE_R<='0'; WHEN1=> SEL<='0'; SCE_R<='1'; MCE_R<='0'; HCE_R<='0'; WHEN2=> SEL<='0'; SCE_R<='0'; MCE_R<='1'; HCE_R<='0'; WHEN3=> SEL<='0'; SCE_R<='0'; MCE_R<='0'; HCE_R<='1';ENDCASE;ENDPROCESS;SEL_PRO:PROCESS(SEL)BEGIN CASESELIS WHEN'0'=> S_CE<=SCE_R; M_CE<=MCE_R; H_CE<=HCE_R; CLK1HZ<=SET; WHEN'1'=> S_CE<=EN; M_CE<=S_ENOUT; H_CE<=M_ENOUT; CLK1HZ<=OUTCLK; ENDCASE;ENDPROCESS;ENDEXAMPLE;2、計時模塊:(1) 60進制計時模塊:利用計數(shù)器的方法設制一個60進制計數(shù)器,并設置個進位輸出端和個位、十位的BCD即時輸出端,其中BCD即時輸出端連接BCD譯碼模塊進行轉換數(shù)碼管程序所需的驅動譯碼。元件視圖如下:源程序如下:--CNT60.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYCNT60IS PORT( --輸入1HZ時鐘 CLK1HZ:INSTD_LOGIC; --計數(shù)使能 EN:INSTD_LOGIC; --進位輸出 ENOUT:OUTSTD_LOGIC; --BCD輸出 LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0); HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDCNT60;ARCHITECTUREEXAMPLEOFCNT60ISSIGNALLOW_R:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALHIGH_R:STD_LOGIC_VECTOR(3DOWNTO0):="0000";BEGIN--個位計數(shù)LOW_PROC:PROCESS(CLK1HZ,EN)BEGIN IFCLK1HZ'EVENTANDCLK1HZ='0'THEN IFEN='1'THEN IFLOW_R="1001"THEN LOW_R<="0000"; ELSE LOW_R<=LOW_R+"0001"; ENDIF; ENDIF; ENDIF;ENDPROCESS;LOW<=LOW_R;--十位計數(shù)HIGH_PROC:PROCESS(CLK1HZ,EN)BEGIN IFCLK1HZ'EVENTANDCLK1HZ='0'THEN IFEN='1'THEN IFLOW_R="1001"THEN IFHIGH_R="0101"THEN HIGH_R<="0000"; ELSE HIGH_R<=HIGH_R+"0001"; ENDIF; ENDIF; ENDIF; ENDIF;ENDPROCESS;HIGH<=HIGH_R;--計數(shù)值為59時,進位輸出ENOUT<='1'WHENLOW_R="1001"ANDHIGH_R="0101"ELSE'0';ENDEXAMPLE;(2)24進制計數(shù)模塊:利用計數(shù)器的方法設制一個24進制計數(shù)器,并設置、個位、十位的BCD即時輸出端,其中BCD即時輸出端連接BCD譯碼模塊進行轉換數(shù)碼管程序所需的驅動譯碼。元件視圖如下:源程序如下:--CNT24.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL; ENTITYCNT24IS PORT( --輸入1HZ時鐘 CLK1HZ:INSTD_LOGIC; --計數(shù)使能 EN:INSTD_LOGIC; --BCD輸出 LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0); HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0) );ENDCNT24;ARCHITECTUREEXAMPLEOFCNT24ISSIGNALLOW_R:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALHIGH_R:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALCLR:STD_LOGIC:='0';BEGIN--個位計數(shù)LOW_PROC:PROCESS(CLK1HZ,EN,CLR)BEGIN IFCLK1HZ'EVENTANDCLK1HZ='0'THEN IFEN='1'THEN IFLOW_R="1001"ORCLR='1'THEN LOW_R<="0000"; ELSE LOW_R<=LOW_R+"0001"; ENDIF; ENDIF; ENDIF;ENDPROCESS;LOW<=LOW_R;--十位計數(shù)HIGH_PROC:PROCESS(CLK1HZ,EN,CLR)BEGIN IFCLK1HZ'EVENTANDCLK1HZ='0'THEN IFEN='1'THEN IFCLR='1'THEN HIGH_R<="0000"; ELSIFLOW_R="1001"THEN HIGH_R<=HIGH_R+"0001"; ENDIF; ENDIF; ENDIF;ENDPROCESS;HIGH<=HIGH_R;--計數(shù)值為23時,清零CLR<='1'WHENLOW_R="0011"ANDHIGH_R="0010"ELSE'0';ENDEXAMPLE;3、鬧鐘模塊:該數(shù)字鐘具有可設置整點鬧鐘功能,當達到鬧鐘設定時間時,LED燈會自動閃爍表示警告鬧鐘時間已到,閃爍時間為一分鐘,一分鐘之后自動停止。鬧鐘的核心思想是,從時鐘計時模塊以及分鐘計時模塊的BCD碼即時出去與鬧鐘模塊中的計數(shù)器所設的值(也就是設定的時間)進行比較。由于該鬧鐘為整點鬧鐘,只能進行整點警告,利用ALARM_SET按鈕進行設定,每按一次,送給鬧鐘元件里面的計數(shù)器一個脈沖令設定的時間在原有的時間上加一小時。當比較結果完全相同時,LED輸出端輸出10HZ的脈沖到LED中令LED顯示閃爍狀態(tài),達到警告目的。元件視圖如下:源程序如下:--alarm.vhLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYalarmIS PORT( --輸入時鐘 CLK:INSTD_LOGIC; --設定鬧鐘 ALARM_SET:INSTD_LOGIC; --BCD輸入 IN_HL:INSTD_LOGIC_VECTOR(3DOWNTO0); IN_HH:INSTD_LOGIC_VECTOR(3DOWNTO0); IN_ML:INSTD_LOGIC_VECTOR(3DOWNTO0); IN_MH:INSTD_LOGIC_VECTOR(3DOWNTO0); --BCD輸出 LOW:OUTSTD_LOGIC_VECTOR(3DOWNTO0); HIGH:OUTSTD_LOGIC_VECTOR(3DOWNTO0); --LED輸出 LED_OUT:OUTSTD_LOGIC );ENDalarm;ARCHITECTUREEXAMPLEOFalarmISSIGNALclkcon1:integerrange0to5000;SIGNALclkcon2:integerrange0to1000;SIGNALclk50khz:std_logic;SIGNALclk10hz:std_logic;SIGNALLOW_R:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALHIGH_R:STD_LOGIC_VECTOR(3DOWNTO0):="0000";SIGNALLED_CON:integerrange0to1;SIGNALCLR:STD_LOGIC:='0';BEGIN--變頻為10HZclkcon1_proc:process(CLK) BEGIN IFCLK'EVENTANDCLK='0'THEN IFclkcon1=5000THEN clkcon1<=0; clk50khz<='0'; ELSE clkcon1<=clkcon1+1; clk50khz<='1'; ENDIF; ENDIF;ENDPROCESS;clkcon2_proc:process(clk50khz) BEGIN IFclk50khz'EVENTANDclk50khz='0'THEN IFclkcon2=1000THEN clkcon2<=0; clk10hz<='1'; ELSE clkcon2<=clkcon2+1; clk10hz<='0'; ENDIF; ENDIF;ENDPROCESS;--設定鬧鐘個位LOW_PROC:PROCESS(ALARM_SET,CLR)BEGIN IFALARM_SET'EVENTANDALARM_SET='0'THEN IFLOW_R="1001"ORCLR='1'THEN LOW_R<="0000"; ELSE LOW_R<=LOW_R+"0001"; ENDIF; ENDIF;ENDPROCESS;LOW<=LOW_R;--設定鬧鐘十位HIGH_PROC:PROCESS(ALARM_SET,CLR)BEGIN IFALARM_SET'EVENTANDALARM_SET='0'THEN IFCLR='1'THEN HIGH_R<="0000"; ELSIFLOW_R="1001"THEN HIGH_R<=HIGH_R+"0001"; ENDIF; ENDIF;ENDPROCESS;HIGH<=HIGH_R;--計數(shù)值為23時,清零CLR<='1'WHENLOW_R="0011"ANDHIGH_R="0010"ELSE'0';--響應判定alarm_proc:PROCESS(IN_HL,IN_HH,IN_ML,IN_MH)BEGIN IFLOW_R=IN_HLandHIGH_R=IN_HHTHEN IFIN_ML="0000"ANDIN_MH="0000"THEN LED_CON<=0; ELSE LED_CON<=1; ENDIF; ENDIF;ENDPROCESS;--LED輸出LED_proc:PROCESS(LED_CON)BEGIN CASELED_CONIS WHEN0=>LED_OUT<=clk10hz; WHEN1=>LED_OUT<='0'; ENDCASE;ENDPROCESS;ENDEXAMPLE; 4、顯示模塊(1)BCD譯碼模塊:利用共陽端數(shù)碼管的性質以及其在顯示“0-9”過程中的驅動程序可以獲得該BCD譯碼模塊。元件視圖如下:源程序為:--display.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYdisplayISPORT( --BCD輸入 in_data:INSTD_LOGIC_VECTOR(3DOWNTO0); --八段譯碼輸出 out_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDdisplay;ARCHITECTUREEXAMPLEOFdisplayISBEGIN PROCESS(in_data) BEGIN CASEin_dataIS WHEN"0000"=>out_data<="11000000"; WHEN"0001"=>out_data<="11111001"; WHEN"0010"=>out_data<="10100100"; WHEN"0011"=>out_data<="10110000"; WHEN"0100"=>out_data<="10011001"; WHEN"0101"=>out_data<="10010010"; WHEN"0110"=>out_data<="10000010"; WHEN"0111"=>out_data<="11111000"; WHEN"1000"=>out_data<="10000000"; WHEN"1001"=>out_data<="10010000"; WHENOTHERS=> out_data<="00000000"; ENDCASE; ENDPROCESS;ENDEXAMPLE;(2)掃頻輸出模塊:該FPGA板只有一個數(shù)碼管驅動端而有四個數(shù)碼管,所以需要利用利用片選高速掃屏的方法進行顯示。當一個數(shù)碼管的亮滅頻率到達100HZ以上時,由于人眼的視覺暫留功能,并不會感覺到它出現(xiàn)了亮滅的變化。在該模塊中令掃屏頻率也就是亮滅頻率為1KZH。該模塊同樣還有一個功能是切換分秒/時分/鬧鐘的顯示,通過CHG按鈕進行。在以下程序中,利用一個模為3的計數(shù)器CHG_CON作為狀態(tài)機,每按下一次CHG按鈕,CHG_CON自動增一。當CHG_CON=0時,顯示分秒;CHG_CON=1時,顯示時分;CHG_CON=2時,顯示鬧鐘。為了區(qū)別鬧鐘與正常計時區(qū)別,在這里鬧鐘的時鐘與分鐘之間沒有亮“點”間隔。元件視圖如下: 源程序如下:--saoping.vhdLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYsaopingISPORT( --選擇顯示方式 CHG:INSTD_LOGIC; --BCD輸入 SL:INSTD_LOGIC_VECTOR(7DOWNTO0); SH:INSTD_LOGIC_VECTOR(7DOWNTO0); ML:INSTD_LOGIC_VECTOR(7DOWNTO0); MH:INSTD_LOGIC_VECTOR(7DOWNTO0); HL:INSTD_LOGIC_VECTOR(7DOWNTO0); HH:INSTD_LOGIC_VECTOR(7DOWNTO0); ALARM_L:INSTD_LOGIC_VECTOR(7DOWNTO0); ALARM_H:INSTD_LOGIC_VECTOR(7DOWNTO0); --輸入時鐘 CLK:INSTD_LOGIC; --輸出片選 seg:outstd_logic_vector(3downto0); --BCD輸出 out_data:outstd_logic_vector(7downto0) );ENDsaoping;ARCHITECTUREEXAMPLEOFsaopingISSIGNALsaoping_con:INTEGERSIGNALclkcon:INTEGERSIGNALclk1khz:std_logic;SIGNALCHG_CONINTEGERRANGE0to2;BEGIN--變頻為1KHZclk_proc:process(CLK) BEGIN IFCLK'EVENTANDCLK='0'THEN IFclkcon=50000THEN clkcon<=0; clk1khz<='0'; ELSE; clkcon<=clkcon+1; clk1khz<='1'; ENDIF; ENDIF;ENDPROCESS;SEG_PROC:PROCESS(clk1khz)BEGIN IFclk1khz'EVENTANDclk1khz='0'THEN IFsaoping_con=3THEN saoping_con<=0; ELSE saoping_con<=saoping_con+1; ENDIF; ENDIF;ENDPROCESS;CHG_CON_PROC:PROCESS(CHG) BEGIN IFCHG'EVENTANDCHG='0'THEN IFCHG_CON=2THEN CHG_CON<=0; ELSE CHG_CON<=CHG_CON+1; ENDIF; ENDIF;ENDPROCESS;OUT_PROC:PROCESS(saoping_con)BEGIN CASECHG_CONIS WHEN0=> CASEsaoping_conIS WHEN3=>seg<="0111";--第四個亮 out_data<=SL; when2=>seg<="1011";--第三個亮 out_data<=SH; when1=>seg<="1101";--第二個亮 out_data<=ML-"10000000"; when0=>seg<="1110";--第一個亮 out_data<=MH; ENDCASE; WHEN1=> CASEsaoping_conIS WHEN3=>seg<="0111";--第四個亮 out_data<=ML; when2=>seg<="1011";--第三個亮 out_data<=MH; when1=>seg<="1101";--第二個亮 out_data<=HL-"10000000"; when0=>seg<="1110";--第一個亮 out_data<=HH; ENDCASE; WHEN2=> CASEsaoping_conIS WHEN3=>seg<="0111";--第四個亮 out_data<="11000000"; when2=>seg<="1011";--第三個亮 out_data<="11000000"; when1=>seg<="1101";--第二個亮 out_data<=ALARM_L; when0=>seg<="1110";--第一個亮 out_data<=ALARM_H; ENDCASE; ENDCASE;ENDPROCESS;ENDEXAMPLE;六、結論與分析: 本次所寫的程序能基本實現(xiàn)實驗要求的數(shù)字鐘功能,唯有調整時間時令調整所在位數(shù)的閃爍功能由于時間關系無法實現(xiàn)。 為了實現(xiàn)該功能,曾試過許多方法,包括在掃屏輸出模塊用不同的頻率對調整位與非調整位進行動態(tài)掃描輸出,但事實證明,這個方法是不可行的。由于頻率的不同,導致高頻率的時候數(shù)碼管輸出顯然會占用了低頻率輸出部分的顯示。也就是說在時分狀態(tài)進行調整時間時,如果當時時間為18.00,利用該方法則會出現(xiàn)18.18不斷閃爍或者00.00不斷閃爍。 盡管功能未能完成實現(xiàn),但我也通過該次課程設計對基于VHDL的EDA技術有了深刻理解。明白了自頂向下設計的方便性以及具體方法,了解到了一般EDA設計的步驟與思想,由解決了編譯過程中遇到錯誤學習了如何去修改以及更好地設計一個EDA程序。目錄第一章總論 11.1項目提要 11.2結論與建議 31.3編制依據(jù) 4第二章項目建設背景與必要性 52.1項目背景 52.2項目建設必要性 7第三章市場與需求預測 83.1優(yōu)質糧食供求形勢分析 83.2本區(qū)域市場需求預測 83.3服務功能 103.4市場競爭力和市場風險預測與對策 10第四章項目承擔單位情況 124.1基本情況 124.2主要業(yè)務范圍和業(yè)務能力 124.3人員構成 124.4主要技術成果獲獎情況及轉化能力 134.5現(xiàn)有基礎和技術條件 154.6資產與財務狀況 164.7項目技術協(xié)作單位情況 16第五章建設規(guī)模與產品方案 175.1建設規(guī)模確定的原則和依據(jù) 175.2建設規(guī)模及服務種類 18第六章項目選址與建設條件 196.1項目選址原則與要求 196.2項目建設用地情況 196.3項目用地位置 206.4自然與資源條件 206.5水資源優(yōu)勢 216.6社會經(jīng)濟條件 226.7糧田基本情況 22HYPERLI

溫馨提示

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

評論

0/150

提交評論