fpga數字鐘課程設計報告.doc
《fpga數字鐘課程設計報告.doc》由會員分享,可在線閱讀,更多相關《fpga數字鐘課程設計報告.doc(25頁珍藏版)》請在裝配圖網上搜索。
課程設計報告 設計題目:基于FPGA的數字鐘設計 班級:電子信息工程1301 學號:20133638 姓名:王一丁 指導教師:李世平 設計時間:2016年1月 摘要 EDA(Electronic Design Automation)電子設計自動化,是以大規(guī)??删幊唐骷樵O計載體,以硬件描述語言為系統(tǒng)邏輯描述的主要表達方式,通過相關的軟件,自動完成軟件方式設計得電子系統(tǒng)到硬件系統(tǒng),最終形成集成電子系統(tǒng)或專用集成芯片。本次課程設計利用Quartus II 為設計軟件,VHDL為硬件描述語言,結合所學知識設計一個多功能時鐘,具有顯示年、月、日、時、分、秒顯示,計時,整點報時,設定時間等功能。利用硬件描述語言VHDL 對設計系統(tǒng)的各個子模塊進行邏輯描述,采用模塊化的思想完成頂層模塊的設計,通過軟件編譯、邏輯化簡、邏輯綜合優(yōu)化、邏輯仿真、最終完成本次課程設計的任務。 關鍵詞:EDA VHDL語言 數字鐘 目 錄 摘要 1 課程設計目的 2 課程設計內容及要求 2.1 設計任務 2.2 設計要求 3 VHDL程序設計 3.1方案論證 3.2 系統(tǒng)結構框圖 3.3設計思路與方法 3.3.1 狀態(tài)控制模塊 3.3.2 時分秒模塊 3.3.3 年月日模塊 3.3.4 顯示模塊 3.3.5脈沖產生模塊 3.3.6 揚聲器與鬧鐘模塊 3.4 RTL整體電路 4 系統(tǒng)仿真與分析 5 課程設計總結,包括.收獲、體會和建議 6 參考文獻 1 課程設計目的 (1)通過設計數字鐘熟練掌握EDA軟件(QUARTUS II)的使用方法,熟練進行設計、編譯,為以后實際工程問題打下設計基礎。 (2)熟悉VHDL 硬件描述語言,提升分析、尋找和排除電子設計中常見故障的能力。 (3)通過課程設計,鍛煉書寫有理論根據的、實事求是的、文理通順的課程設計報告。 2 課程設計內容及要求 2.1 設計任務 (1)6個數字顯示器顯示時分秒,setpin按鍵產生一個脈沖,顯示切換為年月日。 (2)第二個脈沖可預置年份,第三個脈沖可以預置月份,依次第四、 五、六、七個脈沖到來時分別可以預置時期、時、分、秒,第八個脈沖到來后預置結束正常從左顯示時分秒。 (3)up為高時,upclk有脈沖到達時,預置位加一,否則減一。 2.2 設計要求 (1)在基本功能的基礎上,鬧鐘在整點進行報時,產生一定時長的高電平。 (2)實現鬧鐘功能,可對鬧鐘時間進行預置,當達到預置時間時進行報時。 3 VHDL程序設計 3.1方案論證 該數字鐘可以實現:計時功能、整點報時、鬧鐘和預置時間功能,因此時鐘系統(tǒng)可分為5個模塊:功能選擇模塊、時分秒計數模塊、年月日計數模塊、顯示模塊、揚聲器模塊、脈沖產生模塊。 (1) 功能選擇模塊是有狀態(tài)機構成的,功能為依次進行、設置時間、設置鬧鐘時間。 調整工作狀態(tài):數字鐘的初始狀態(tài)顯示時分秒,在setpin按鍵產生一個脈沖,顯示切換為年月日。 設置時間:第二個脈沖可預置年份,第三個脈沖可以預置月份,依次第四、 五、六、七個脈沖到來時分別可以預置時期、時、分、秒。第八個脈沖到來后,預置結束恢復初始狀態(tài),正常顯示時分秒。 設置鬧鐘時間:鬧鐘在setpin1按鍵產生第一個脈沖時設定鬧鐘的時,第二個脈沖設定分,第三個脈沖設定秒,第四個脈沖恢復顯示時分秒。 (2)時分秒計數模塊包括正常計時、鬧鐘、整點報時三個功能。 正常計時功能通過軟件編寫,60進制的秒計數器,60進制的分計數器,24進制的時計數器。時分秒的計數器具有清0、置數、進位和計數功能。其中reset為清0信號,當reset為0時,時分秒的計數器清0。當set產生第四個脈沖后,連續(xù)產生的set信號使分秒計數器依次進行置數。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。當set產生第八個脈沖時,數字鐘恢復時分秒的顯示。 鬧鐘功能是在正常計數功能上拓展,分為鬧鐘時間預置和鬧鐘響應兩個部分。鬧鐘時間預置功能:當set1連續(xù)產生脈沖時,依次對鬧鐘的時分秒位進行預置。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。當set1產生第四個脈沖時,數字鐘恢復時分秒的顯示。與此同時在程序中增添變量時計時功能可以持續(xù)運行。鬧鐘響應功能:通過預置后,儲存的變量與計時器模塊的時、分、秒進行比對,當時、分、秒相同時,模塊產生一個一段時間的高電平,傳輸給鬧鐘響應模塊。 整點報時功能:當計數器中的分位等于59,秒位等于59時,模塊產生一段高電平,輸出給揚聲器模塊進行報時。 (3) 年月日計數模塊分為年月日計數功能,年月日預置數功能。 年月日計數功能:以時位的進位脈沖為計時脈沖,閏年二月份為29天,普通年二月份為28天。一月、三月、五月、七月、八月、十月、十二月為31天,四月、六月、九月、十一月為30天。 年月日預置數功能:當set產生第一個脈沖后,依次進行年月日數器置數。以upclk為時鐘,通過up對預置位進行控制,當up為高時且upclk有脈沖到來時,預置位加一,否則減一。 (4) 顯示模塊:以時分秒,年月日模塊的輸出、狀態(tài)標志為輸入信號,通過狀態(tài)控制模塊產生的狀態(tài)標志對顯示模塊進行控制,顯示計時、預置時的不同狀態(tài)。 (5)揚聲器模塊:輸入信號為分位、秒位和狀態(tài)信號,當計時時鐘到達整點是輸出高電平,其他時刻輸出低電平。 (6)脈沖產生模塊:對輸入的信號進行1000分頻,產生周期為一秒的時鐘信號,用于數字鐘的時鐘輸入。 3.2系統(tǒng)結構框圖 3.3設計思路與方法 3.3.1 狀態(tài)控制模塊 狀態(tài)控制模塊實現對各個功能模塊的整體設計,包括對時間與日期的顯示與調整,鬧鐘的顯示與調整等控制操作。狀態(tài)機的輸入為setpin,setpin1,upclk。狀態(tài)機的狀態(tài)有11種狀態(tài)。:鬧鐘設置時位; :鬧鐘設置分位; :鬧鐘設置秒位; :時鐘顯示時分秒;:時鐘顯示年月日; :鐘設置年; :時鐘設置月; :時鐘設置日; :時鐘設置時; :時鐘設置分; :設置秒 在產生如上狀態(tài)的同時產生Tlock,flag狀態(tài)標志,此標志用來進行時鐘設置、鬧鐘設置與顯示控制。 RTL 電路圖 實現代碼如下: process(upclk) begin if (upclk=1 and upclkLAST_VALUE=0)then state<=next_state; -- 實現狀態(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(鬧鐘與揚聲器響應)。 時分秒模塊的RTL電路圖 時鐘選擇方式:在初始狀態(tài)和顯示年月日的狀態(tài)下,時分秒模塊的時鐘輸入為系統(tǒng)時鐘輸入(clk0),在其他狀態(tài)下,時分秒模塊的時鐘輸入為(upclk時鐘)用來進行置位。 實現代碼入下: process(lock,clk0,clk1) begin if(lock="0000" or lock="0001")then clk<=clk0; --正常計數時選擇clk0 else clk<=clk1; --預置的時候clk1 end if; end process; 時鐘計時功能,在顯示年月日,時分秒的狀態(tài)時,時鐘正常計數。當數字鐘處于置數狀態(tài)時,年、月、日、時、分、秒時鐘停止計時,各個位顯示預置數。在鬧鐘的預置功能實現的同時,通過增添變量,在設置鬧鐘的同時保證時鐘的正常計數,在鬧鐘預置結束后,恢復到初始的時鐘顯示。 3.2.3 年月日模塊 年月日模塊分為日期增加和日期減小兩個部分,日期增加:在顯示時分秒,顯示年月日和設置完秒位的狀態(tài)下,如果是二月,通過函數判斷是否為閏年,其他月份對大小月進行判斷,大月為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; 當以日位的進位為輸入,當存在輸入脈沖時,通過函數對月份進行加減,代碼如下: 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(響應信號),vcc(鬧鐘使能端),ala(高電平輸出)。當vcc為高時,且當op有響應信號輸入(高),鬧鐘產生一定時長的高電平。 鬧鐘的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)設置:setpin1=0;up=0;setpin置連續(xù)8個脈沖,f1000為頻率為1000hz的方波。 分析:在setpin第一次脈沖到來時,顯示年月日,因為數字鐘是初始狀態(tài)所以年月日均為0。Setpin。第二次脈沖到來時對時進行預置數,因為up=0,所以設置時位,時位在不斷地減小,在后面各位預置的過程中,每一位的預置過程都是減小。第三次脈沖來到是對分位進行預置,第四次脈沖到來時對秒位進行預置。第四次脈沖到來時對年進行預置,第五次脈沖到來時對月進行預置,第六次脈沖到來時對日進行預置。第七次脈沖到來時,數字鐘顯示時分秒,從仿真結果可以看出來,此時時鐘是從預置的時間開始計時的,第八次脈沖到來時,此時時鐘顯示的是年月日,此時顯示的年月日為預置的年月日。 從上述分析可以看出,經過仿真的程序基本達到數字鐘的基本要求,系統(tǒng)可靠。 4.2對鬧鐘狀態(tài)轉換的仿真 初始設置:初態(tài)設置:setpin1設計一個脈沖;up=0;setpin置連續(xù)2個脈沖,f1000為頻率為1000hz的方波。 當第一個setpin脈沖到來時,顯示年月日,第二個setpin脈沖來臨時時鐘對年進行預置,此后setpin1的第一個脈沖到來,時鐘的狀態(tài)轉為對鬧鐘時間的設置,達到實驗要求。 4.3對鬧鐘功能的仿真 初始設置:初態(tài)設置:setpin1設計三個脈沖;up=0;f1000為頻率為1000hz的方波。 數字鐘的原狀態(tài)顯示時分秒,由于未進行初始化,所以時分秒從0開始計時,當setpin1第一個脈沖到來時,數字鐘對鬧鐘的時刻的時位進行預置,當setpin1第二個脈沖到來時,數字鐘對鬧鐘的時刻的分位進行預置,當setpin1第三個脈沖到來時,數字鐘對鬧鐘的時刻的秒位進行預置,當第四個脈沖到來是恢復顯示時分秒,此時的時分秒已經計數到51秒,符合預期,在設置鬧鐘的同時,時鐘依舊計數,達到要求。 同時從初始時刻,鬧鐘的揚聲器產生一定時長高電平可以看出整點報時功能良好,達到設計要求。 5 課程設計總結(收獲、體會和建議) 本次VHDL設計的數字鐘定義了三種類型的端口,分別是in、out、buffer。In和out端口使用簡單,buffer端口具有回讀功能,因為buffer類型的端口不能連接到其他類型的端口上,因此不利于子模塊原件例化,不利于大型設計。 進程(Process)是VHDL中最為重要的部分,在本次設計中。我出現了對于時鐘引入,輸出多驅動,一個進程中不允許出現兩個時鐘沿觸發(fā)的錯誤,這些錯誤在未來的設計中都是應該避免的。順序語句如IF語句、CASE語句、LOOP語句、變量賦值語句等必須出現在進程、函數或子程序內部,而不能單獨出現在進程之外。 本次實驗讓我對VHDL 語言有了更深的認識,對語言的運用更加熟悉,為未來的實際應用打下了良好的基礎。因為實驗室的條件限制,并沒有將程序下載到實際器件中觀察現象,只是通過軟件對系統(tǒng)進行仿真,希望以后可以機會接觸并使用實際器件。 6 參考文獻 1. 吳廷鑫. 基于FPGA的多功能數字鐘設計[J]. 科技經濟市場, 2015, (5): 1-5 2.徐大詔. 基于FPGA實現的數字鐘設計[J]. 信息技術, 2009, (12): 101-104 3.張子剛, 盧戈, 田鵬. 基于VHDL的數字時鐘的設計[J]. 氣象水文海洋儀器, 2008, (2): 10-14 4.樊永寧, 張曉麗. 基于VHDL的多功能數字鐘的設計[J]. 工礦自動化, 2006, (3): 92-94 5.江翠云 基于CPLD和VHDL的數字鐘的設計[期刊論文]-硅谷2010(2)- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- fpga 數字 課程設計 報告
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://zhongcaozhi.com.cn/p-6549854.html