fpga數(shù)字鐘課程設(shè)計報告.doc
《fpga數(shù)字鐘課程設(shè)計報告.doc》由會員分享,可在線閱讀,更多相關(guān)《fpga數(shù)字鐘課程設(shè)計報告.doc(25頁珍藏版)》請在裝配圖網(wǎng)上搜索。
課程設(shè)計報告 設(shè)計題目:基于FPGA的數(shù)字鐘設(shè)計 班級:電子信息工程1301 學號:20133638 姓名:王一丁 指導教師:李世平 設(shè)計時間:2016年1月 摘要 EDA(Electronic Design Automation)電子設(shè)計自動化,是以大規(guī)模可編程器件為設(shè)計載體,以硬件描述語言為系統(tǒng)邏輯描述的主要表達方式,通過相關(guān)的軟件,自動完成軟件方式設(shè)計得電子系統(tǒng)到硬件系統(tǒng),最終形成集成電子系統(tǒng)或?qū)S眉尚酒?。本次課程設(shè)計利用Quartus II 為設(shè)計軟件,VHDL為硬件描述語言,結(jié)合所學知識設(shè)計一個多功能時鐘,具有顯示年、月、日、時、分、秒顯示,計時,整點報時,設(shè)定時間等功能。利用硬件描述語言VHDL 對設(shè)計系統(tǒng)的各個子模塊進行邏輯描述,采用模塊化的思想完成頂層模塊的設(shè)計,通過軟件編譯、邏輯化簡、邏輯綜合優(yōu)化、邏輯仿真、最終完成本次課程設(shè)計的任務(wù)。 關(guān)鍵詞:EDA VHDL語言 數(shù)字鐘 目 錄 摘要 1 課程設(shè)計目的 2 課程設(shè)計內(nèi)容及要求 2.1 設(shè)計任務(wù) 2.2 設(shè)計要求 3 VHDL程序設(shè)計 3.1方案論證 3.2 系統(tǒng)結(jié)構(gòu)框圖 3.3設(shè)計思路與方法 3.3.1 狀態(tài)控制模塊 3.3.2 時分秒模塊 3.3.3 年月日模塊 3.3.4 顯示模塊 3.3.5脈沖產(chǎn)生模塊 3.3.6 揚聲器與鬧鐘模塊 3.4 RTL整體電路 4 系統(tǒng)仿真與分析 5 課程設(shè)計總結(jié),包括.收獲、體會和建議 6 參考文獻 1 課程設(shè)計目的 (1)通過設(shè)計數(shù)字鐘熟練掌握EDA軟件(QUARTUS II)的使用方法,熟練進行設(shè)計、編譯,為以后實際工程問題打下設(shè)計基礎(chǔ)。 (2)熟悉VHDL 硬件描述語言,提升分析、尋找和排除電子設(shè)計中常見故障的能力。 (3)通過課程設(shè)計,鍛煉書寫有理論根據(jù)的、實事求是的、文理通順的課程設(shè)計報告。 2 課程設(shè)計內(nèi)容及要求 2.1 設(shè)計任務(wù) (1)6個數(shù)字顯示器顯示時分秒,setpin按鍵產(chǎn)生一個脈沖,顯示切換為年月日。 (2)第二個脈沖可預置年份,第三個脈沖可以預置月份,依次第四、 五、六、七個脈沖到來時分別可以預置時期、時、分、秒,第八個脈沖到來后預置結(jié)束正常從左顯示時分秒。 (3)up為高時,upclk有脈沖到達時,預置位加一,否則減一。 2.2 設(shè)計要求 (1)在基本功能的基礎(chǔ)上,鬧鐘在整點進行報時,產(chǎn)生一定時長的高電平。 (2)實現(xiàn)鬧鐘功能,可對鬧鐘時間進行預置,當達到預置時間時進行報時。 3 VHDL程序設(shè)計 3.1方案論證 該數(shù)字鐘可以實現(xiàn):計時功能、整點報時、鬧鐘和預置時間功能,因此時鐘系統(tǒng)可分為5個模塊:功能選擇模塊、時分秒計數(shù)模塊、年月日計數(shù)模塊、顯示模塊、揚聲器模塊、脈沖產(chǎn)生模塊。 (1) 功能選擇模塊是有狀態(tài)機構(gòu)成的,功能為依次進行、設(shè)置時間、設(shè)置鬧鐘時間。 調(diào)整工作狀態(tài):數(shù)字鐘的初始狀態(tài)顯示時分秒,在setpin按鍵產(chǎn)生一個脈沖,顯示切換為年月日。 設(shè)置時間:第二個脈沖可預置年份,第三個脈沖可以預置月份,依次第四、 五、六、七個脈沖到來時分別可以預置時期、時、分、秒。第八個脈沖到來后,預置結(jié)束恢復初始狀態(tài),正常顯示時分秒。 設(shè)置鬧鐘時間:鬧鐘在setpin1按鍵產(chǎn)生第一個脈沖時設(shè)定鬧鐘的時,第二個脈沖設(shè)定分,第三個脈沖設(shè)定秒,第四個脈沖恢復顯示時分秒。 (2)時分秒計數(shù)模塊包括正常計時、鬧鐘、整點報時三個功能。 正常計時功能通過軟件編寫,60進制的秒計數(shù)器,60進制的分計數(shù)器,24進制的時計數(shù)器。時分秒的計數(shù)器具有清0、置數(shù)、進位和計數(shù)功能。其中reset為清0信號,當reset為0時,時分秒的計數(shù)器清0。當set產(chǎn)生第四個脈沖后,連續(xù)產(chǎn)生的set信號使分秒計數(shù)器依次進行置數(shù)。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。當set產(chǎn)生第八個脈沖時,數(shù)字鐘恢復時分秒的顯示。 鬧鐘功能是在正常計數(shù)功能上拓展,分為鬧鐘時間預置和鬧鐘響應(yīng)兩個部分。鬧鐘時間預置功能:當set1連續(xù)產(chǎn)生脈沖時,依次對鬧鐘的時分秒位進行預置。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。當set1產(chǎn)生第四個脈沖時,數(shù)字鐘恢復時分秒的顯示。與此同時在程序中增添變量時計時功能可以持續(xù)運行。鬧鐘響應(yīng)功能:通過預置后,儲存的變量與計時器模塊的時、分、秒進行比對,當時、分、秒相同時,模塊產(chǎn)生一個一段時間的高電平,傳輸給鬧鐘響應(yīng)模塊。 整點報時功能:當計數(shù)器中的分位等于59,秒位等于59時,模塊產(chǎn)生一段高電平,輸出給揚聲器模塊進行報時。 (3) 年月日計數(shù)模塊分為年月日計數(shù)功能,年月日預置數(shù)功能。 年月日計數(shù)功能:以時位的進位脈沖為計時脈沖,閏年二月份為29天,普通年二月份為28天。一月、三月、五月、七月、八月、十月、十二月為31天,四月、六月、九月、十一月為30天。 年月日預置數(shù)功能:當set產(chǎn)生第一個脈沖后,依次進行年月日數(shù)器置數(shù)。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。 (4) 顯示模塊:以時分秒,年月日模塊的輸出、狀態(tài)標志為輸入信號,通過狀態(tài)控制模塊產(chǎn)生的狀態(tài)標志對顯示模塊進行控制,顯示計時、預置時的不同狀態(tài)。 (5)揚聲器模塊:輸入信號為分位、秒位和狀態(tài)信號,當計時時鐘到達整點是輸出高電平,其他時刻輸出低電平。 (6)脈沖產(chǎn)生模塊:對輸入的信號進行1000分頻,產(chǎn)生周期為一秒的時鐘信號,用于數(shù)字鐘的時鐘輸入。 3.2系統(tǒng)結(jié)構(gòu)框圖 3.3設(shè)計思路與方法 3.3.1 狀態(tài)控制模塊 狀態(tài)控制模塊實現(xiàn)對各個功能模塊的整體設(shè)計,包括對時間與日期的顯示與調(diào)整,鬧鐘的顯示與調(diào)整等控制操作。狀態(tài)機的輸入為setpin,setpin1,upclk。狀態(tài)機的狀態(tài)有11種狀態(tài)。:鬧鐘設(shè)置時位; :鬧鐘設(shè)置分位; :鬧鐘設(shè)置秒位; :時鐘顯示時分秒;:時鐘顯示年月日; :鐘設(shè)置年; :時鐘設(shè)置月; :時鐘設(shè)置日; :時鐘設(shè)置時; :時鐘設(shè)置分; :設(shè)置秒 在產(chǎn)生如上狀態(tài)的同時產(chǎn)生Tlock,flag狀態(tài)標志,此標志用來進行時鐘設(shè)置、鬧鐘設(shè)置與顯示控制。 RTL 電路圖 實現(xiàn)代碼如下: process(upclk) begin if (upclk=1 and upclkLAST_VALUE=0)then state<=next_state; -- 實現(xiàn)狀態(tài)變換 end if; end process; process(state,setpin,setpin1) begin next_state<=state; case(state) is when s0 => Tlock<="0000"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0; end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s1; end if; when s1=> Tlock<="0001"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s2;end if; when s2=> Tlock<="0010"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s3;end if; when s3=> Tlock<="0011"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s4;end if; when s4=> Tlock<="0100"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s5;end if; when s5=> Tlock<="0101"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s6; end if; when s6=> Tlock<="0110"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s7;end if; when s7=> Tlock<="0111"; flag<=1; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s0; end if; when g0=> Tlock<="1000"; flag<=0; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g1;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s0;end if; when g1=> Tlock<="1001"; flag<=0; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=g2;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s0; end if; when g2=> Tlock<="1010"; flag<=0; if(setpin1=1 and setpin1LAST_VALUE=0)then next_state<=s0;end if; if(setpin=1 and setpinLAST_VALUE=0) then next_state<=s0;end if; when others=> next_state<=s0; end case; end process; 3.3.2 時分秒模塊 時分秒模塊的輸入為ce(使能端),clk0(系統(tǒng)輸入時鐘),clk1(upclk時鐘),flag(標志位),lock(狀態(tài)位),up(預置位增減控制),ov(進位位),op(鬧鐘與揚聲器響應(yīng))。 時分秒模塊的RTL電路圖 時鐘選擇方式:在初始狀態(tài)和顯示年月日的狀態(tài)下,時分秒模塊的時鐘輸入為系統(tǒng)時鐘輸入(clk0),在其他狀態(tài)下,時分秒模塊的時鐘輸入為(upclk時鐘)用來進行置位。 實現(xiàn)代碼入下: process(lock,clk0,clk1) begin if(lock="0000" or lock="0001")then clk<=clk0; --正常計數(shù)時選擇clk0 else clk<=clk1; --預置的時候clk1 end if; end process; 時鐘計時功能,在顯示年月日,時分秒的狀態(tài)時,時鐘正常計數(shù)。當數(shù)字鐘處于置數(shù)狀態(tài)時,年、月、日、時、分、秒時鐘停止計時,各個位顯示預置數(shù)。在鬧鐘的預置功能實現(xiàn)的同時,通過增添變量,在設(shè)置鬧鐘的同時保證時鐘的正常計數(shù),在鬧鐘預置結(jié)束后,恢復到初始的時鐘顯示。 3.2.3 年月日模塊 年月日模塊分為日期增加和日期減小兩個部分,日期增加:在顯示時分秒,顯示年月日和設(shè)置完秒位的狀態(tài)下,如果是二月,通過函數(shù)判斷是否為閏年,其他月份對大小月進行判斷,大月為31天,小月為30天,代碼如下: if(clkevent and clk=1)then if(ce=1)then if(lock="0000")or(lock="0001")or(lock="0100"and up=1)then if(mon0="0010"and mon1="0000") then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1); elsif((mon0="0001"and mon0="0000")or(mon0="0011")or(mon0="0101") or(mon0="0111")or(mon0="1000")or(mon0="0000"and mon1="0001")or(mon0="0010"and mon1="0001"))then oddmonth_add_day(Td0,Td1,date0,date1); else evenmonth_add_day(Td0,Td1,date0,date1); end if; end if; 日期減少同理,代碼如下: if(lock="0100"and up=0)then if(mon0="0010"and mon1="0000")then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1); elsif((mon0="0001"and mon1="0000")or(mon0="0011")or(mon0="0101") or(mon0="0111")or(mon0="1000")or(mon0="0000"and mon1="0001") or(mon0="0010"and mon1="0001"))then oddmonth_sub_day(Td0,Td1,date0,date1); else evenmonth_sub_day(Td0,Td1,date0,date1); END IF; end if; end if; end if; 當以日位的進位為輸入,當存在輸入脈沖時,通過函數(shù)對月份進行加減,代碼如下: begin if(clkevent and clk=1)then if(ce=1)then if(lock="0000")or (lock="0001")or (lock="0011"and up=1)then add_month(Tm0,Tm1,mon0,mon1); end if; if(lock="0011"and up=0)then sub_month(Tm0,Tm1,mon0,mon1); end if; if (lock="0000")or (lock="0001") then if(mon0="0010"and mon1="0001")then sub_year(Ty0,Ty1,year0,year1); end if; end if; if(lock="0010"and up=1)then add_year(Ty0,Ty1,year0,year1); end if; if(lock="0010"and up=0)then sub_year(Ty0,Ty1,year0,year1); end if; end if; end if; 3.2.4 顯示模塊 顯示模塊的輸入為年、月、日、時、分、秒、lock(狀態(tài)標志),通過if語句,狀態(tài)機一共提供11鐘狀態(tài)。在不同狀態(tài)下,給顯示模塊的年月日時分秒不同的輸入,從而得到要求的顯示。 顯示電路的RTL電路 代碼如下: process(lock,sec0,sec1,min1,min0,hour1,hour0,date0,date1,mon0,mon1,year0,year1) begin if(lock="0000")then a0<=sec0;a1<=sec1;b0<=min0;b1<=min1;c0<=hour0;c1<=hour1; end if; if(lock="0001")then a0<=date0;a1<=date1;b0<=mon0;b1<=mon1;c0<=year0;c1<=year1; end if; if(lock="0101")or(lock="1000")then a0<="1111";a1<="1111";b0<="1111";b1<="1111";c0<=hour0;c1<=hour1; end if; if(lock="0110")or(lock="1001")then a0<="1111";a1<="1111";b0<=min0;b1<=min1;c0<="1111";c1<="1111"; end if; if(lock="0111")or(lock="1010")then a0<=sec0;a1<=sec1;b0<="1111";b1<="1111";c0<="1111";c1<="1111"; end if; if(lock="0010")then a0<="1111";a1<="1111";b0<="1111";b1<="1111";c0<=year0;c1<=year1; end if; if(lock="0011")then a0<="1111";a1<="1111";b0<=mon0;b1<=mon1;c0<="1111";c1<="1111"; end if; if(lock="0100")then a0<=date0;a1<=date1;b0<="1111";b1<="1111";c0<="1111";c1<="1111"; end if; end process; end led_disp_arc; 3.2.5脈沖發(fā)生模塊(分頻電路) 脈沖發(fā)生電路將提供的1000hz頻率分頻成1hz(供系統(tǒng)時鐘)。f1000為1000hz輸入,second_wave為分頻輸出。 分頻器的RTL電路 代碼如下: process(f1000,cnt) begin if(f1000event and f1000=1)then if(cnt="00000011")then cnt<="000000000";second_wave<=not second_wave; else cnt<=cnt+1; end if; end if; end process; end second_wave_arc; 3.2.6 揚聲器模塊 模塊的輸入為clk(系統(tǒng)時鐘),op(響應(yīng)信號),vcc(鬧鐘使能端),ala(高電平輸出)。當vcc為高時,且當op有響應(yīng)信號輸入(高),鬧鐘產(chǎn)生一定時長的高電平。 鬧鐘的RTL電路 代碼如下: signal temp1:std_logic_vector(3 downto 0); begin process(op,vcc,clk) begin if clkevent and clk=1 then if(vcc=1)then if(temp1="1111")then ala<=not ala; else temp1<=temp1+1; ala<=1; end if; end if; end if; end process; end alarm_arc; 3.3整體RTL電路 4 系統(tǒng)仿真與分析 4.1對基本要求的仿真 初態(tài)設(shè)置:setpin1=0;up=0;setpin置連續(xù)8個脈沖,f1000為頻率為1000hz的方波。 分析:在setpin第一次脈沖到來時,顯示年月日,因為數(shù)字鐘是初始狀態(tài)所以年月日均為0。Setpin。第二次脈沖到來時對時進行預置數(shù),因為up=0,所以設(shè)置時位,時位在不斷地減小,在后面各位預置的過程中,每一位的預置過程都是減小。第三次脈沖來到是對分位進行預置,第四次脈沖到來時對秒位進行預置。第四次脈沖到來時對年進行預置,第五次脈沖到來時對月進行預置,第六次脈沖到來時對日進行預置。第七次脈沖到來時,數(shù)字鐘顯示時分秒,從仿真結(jié)果可以看出來,此時時鐘是從預置的時間開始計時的,第八次脈沖到來時,此時時鐘顯示的是年月日,此時顯示的年月日為預置的年月日。 從上述分析可以看出,經(jīng)過仿真的程序基本達到數(shù)字鐘的基本要求,系統(tǒng)可靠。 4.2對鬧鐘狀態(tài)轉(zhuǎn)換的仿真 初始設(shè)置:初態(tài)設(shè)置:setpin1設(shè)計一個脈沖;up=0;setpin置連續(xù)2個脈沖,f1000為頻率為1000hz的方波。 當?shù)谝粋€setpin脈沖到來時,顯示年月日,第二個setpin脈沖來臨時時鐘對年進行預置,此后setpin1的第一個脈沖到來,時鐘的狀態(tài)轉(zhuǎn)為對鬧鐘時間的設(shè)置,達到實驗要求。 4.3對鬧鐘功能的仿真 初始設(shè)置:初態(tài)設(shè)置:setpin1設(shè)計三個脈沖;up=0;f1000為頻率為1000hz的方波。 數(shù)字鐘的原狀態(tài)顯示時分秒,由于未進行初始化,所以時分秒從0開始計時,當setpin1第一個脈沖到來時,數(shù)字鐘對鬧鐘的時刻的時位進行預置,當setpin1第二個脈沖到來時,數(shù)字鐘對鬧鐘的時刻的分位進行預置,當setpin1第三個脈沖到來時,數(shù)字鐘對鬧鐘的時刻的秒位進行預置,當?shù)谒膫€脈沖到來是恢復顯示時分秒,此時的時分秒已經(jīng)計數(shù)到51秒,符合預期,在設(shè)置鬧鐘的同時,時鐘依舊計數(shù),達到要求。 同時從初始時刻,鬧鐘的揚聲器產(chǎn)生一定時長高電平可以看出整點報時功能良好,達到設(shè)計要求。 5 課程設(shè)計總結(jié)(收獲、體會和建議) 本次VHDL設(shè)計的數(shù)字鐘定義了三種類型的端口,分別是in、out、buffer。In和out端口使用簡單,buffer端口具有回讀功能,因為buffer類型的端口不能連接到其他類型的端口上,因此不利于子模塊原件例化,不利于大型設(shè)計。 進程(Process)是VHDL中最為重要的部分,在本次設(shè)計中。我出現(xiàn)了對于時鐘引入,輸出多驅(qū)動,一個進程中不允許出現(xiàn)兩個時鐘沿觸發(fā)的錯誤,這些錯誤在未來的設(shè)計中都是應(yīng)該避免的。順序語句如IF語句、CASE語句、LOOP語句、變量賦值語句等必須出現(xiàn)在進程、函數(shù)或子程序內(nèi)部,而不能單獨出現(xiàn)在進程之外。 本次實驗讓我對VHDL 語言有了更深的認識,對語言的運用更加熟悉,為未來的實際應(yīng)用打下了良好的基礎(chǔ)。因為實驗室的條件限制,并沒有將程序下載到實際器件中觀察現(xiàn)象,只是通過軟件對系統(tǒng)進行仿真,希望以后可以機會接觸并使用實際器件。 6 參考文獻 1. 吳廷鑫. 基于FPGA的多功能數(shù)字鐘設(shè)計[J]. 科技經(jīng)濟市場, 2015, (5): 1-5 2.徐大詔. 基于FPGA實現(xiàn)的數(shù)字鐘設(shè)計[J]. 信息技術(shù), 2009, (12): 101-104 3.張子剛, 盧戈, 田鵬. 基于VHDL的數(shù)字時鐘的設(shè)計[J]. 氣象水文海洋儀器, 2008, (2): 10-14 4.樊永寧, 張曉麗. 基于VHDL的多功能數(shù)字鐘的設(shè)計[J]. 工礦自動化, 2006, (3): 92-94 5.江翠云 基于CPLD和VHDL的數(shù)字鐘的設(shè)計[期刊論文]-硅谷2010(2)- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- fpga 數(shù)字 課程設(shè)計 報告
鏈接地址:http://zhongcaozhi.com.cn/p-6549854.html