




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、評(píng)閱老師分 數(shù)數(shù)字電路課程設(shè)計(jì)班 級(jí) 06級(jí) 一班 專 業(yè) 信息工程 姓 名 苗捷 序 號(hào) 17 1 題目要求多功能秒表設(shè)計(jì)設(shè)計(jì)一個(gè)可以順計(jì)時(shí)和倒計(jì)時(shí)的秒表。要求計(jì)時(shí)的范圍為00.0S99.9S,用三位數(shù)碼管顯示。基本要求:(80分)(1) 倒計(jì)時(shí):通過(guò)小鍵盤(pán)可以實(shí)現(xiàn)設(shè)定計(jì)時(shí)時(shí)間(以秒為單位,最大計(jì)時(shí)時(shí)間為99.9秒)。通過(guò)鍵盤(pán)實(shí)現(xiàn)計(jì)時(shí)開(kāi)始、計(jì)時(shí)結(jié)束。當(dāng)所設(shè)定的倒計(jì)時(shí)間到達(dá)0.00S后,自動(dòng)停止倒計(jì)時(shí),同時(shí)響鈴。(2) 順計(jì)時(shí):初始值為0.00S,通過(guò)鍵盤(pán)實(shí)現(xiàn)開(kāi)始計(jì)時(shí)和結(jié)束計(jì)時(shí)功能。計(jì)時(shí)結(jié)束后,顯示記錄的時(shí)間。(3) 用三個(gè)發(fā)光二極管正確顯示以下?tīng)顟B(tài):倒計(jì)時(shí)狀態(tài)、順計(jì)時(shí)狀態(tài)、待機(jī)狀態(tài)。(4)
2、每當(dāng)接收到有效按鍵時(shí),蜂鳴器發(fā)出提示聲。擴(kuò)展功能:(20分)順計(jì)時(shí)在一次計(jì)時(shí)中可以記錄三個(gè)不同的結(jié)束時(shí)間,并能通過(guò)按鍵顯示三次所記錄的時(shí)間。說(shuō)明:以上各項(xiàng)功能的功能鍵設(shè)置自定,不作統(tǒng)一規(guī)定,以簡(jiǎn)單且使用靈活方便操作為原則。2 設(shè)計(jì)方案(或設(shè)計(jì)分析)經(jīng)過(guò)對(duì)題目的分析和思考,我所確立的初步方案如下:控制器鍵盤(pán)輸入計(jì)數(shù)器數(shù)碼管LED蜂鳴器圖(1)初步邏輯功能分析框圖如上圖可見(jiàn),需要一個(gè)核心控制器來(lái)對(duì)系統(tǒng)進(jìn)行整體控制,按鍵輸入部分收到按鍵信號(hào)后傳遞給控制器,控制器根據(jù)當(dāng)前狀態(tài)進(jìn)行相應(yīng)的動(dòng)作,包括:控制計(jì)數(shù)器的運(yùn)行和數(shù)碼管的顯示,控制蜂鳴器指示操作有效,控制LED顯示當(dāng)前狀態(tài)。題目要求設(shè)計(jì)一個(gè)可以順計(jì)時(shí)
3、和倒計(jì)時(shí)的秒表,計(jì)時(shí)的范圍為00.0S99.9S,三位數(shù)碼管顯示。所以計(jì)數(shù)器部分是一個(gè)可以雙向選擇記時(shí)的3位10進(jìn)制計(jì)數(shù)器,數(shù)碼管掃描顯示當(dāng)前計(jì)數(shù)值,同時(shí)還要考慮在一定狀態(tài)時(shí)要讓數(shù)碼管閃爍。鍵盤(pán)部分可以使用通常使用的掃描法來(lái)實(shí)現(xiàn)。初步確定按鍵有五個(gè),但是在實(shí)際編寫(xiě)過(guò)程中為了節(jié)省系統(tǒng)資源,對(duì)案件功能進(jìn)行了一定得復(fù)用,一共用了四個(gè)按鍵,所以就用不著對(duì)鍵盤(pán)進(jìn)行掃描了,這樣節(jié)省了系統(tǒng)的資源,同時(shí)也減少了復(fù)雜性。考慮到要進(jìn)行模塊化劃分,所以以上的邏輯功能劃分不能直接使用,所以再次進(jìn)行了如下的模塊劃分。控制器鍵盤(pán)輸入計(jì)數(shù)器數(shù)碼管LED蜂鳴器圖(2)初步模塊劃分框圖3 模塊實(shí)現(xiàn)在實(shí)際編寫(xiě)過(guò)程中,最終確定系統(tǒng)
4、分為三個(gè)模塊,分別如下:模塊1:keyboard圖(3)模塊1:keyboard鍵盤(pán)模塊,把鍵盤(pán)信號(hào)發(fā)送給控制器。具體源代碼如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyboard isport(clk : in std_logic; key_out : out std_logic_vector(3 downto 0); key_in : in std_logic_vector(3 downto 0); key : out std_logic_vector(2 down
5、to 0);end entity;architecture behav of keyboard istype type_state is (s0,s1);beginkey_out <= "0111" proc1:process(clk) begin if rising_edge(clk) thencase key_in iswhen "1110"=> key<="000"when "1101"=> key<="001"when "1011"=&g
6、t; key<="010"when "0111"=> key<="011"when others=> key<="111"end case; end if; end process;end behav;模塊2:counter圖(4)模塊2:counter最主要的部分,采用單進(jìn)程法實(shí)現(xiàn),主要部分是一個(gè)三位十進(jìn)制計(jì)數(shù)器,接收keyboard的鍵盤(pán)信號(hào)后進(jìn)行相應(yīng)的響應(yīng),控制LED和蜂鳴器并輸出顯示信號(hào)。具體源代碼如下:library ieee;use ieee.std_logic_1164.
7、all;use ieee.std_logic_unsigned.all;entity counter isport(clk : in std_logic; key : in std_logic_vector(2 downto 0); bcd1 : out std_logic_vector(3 downto 0); bcd2 : out std_logic_vector(3 downto 0); bcd3 : out std_logic_vector(3 downto 0); flash_mask : out std_logic_vector(2 downto 0); bell : out st
8、d_logic; led_up : out std_logic; led_down : out std_logic; led_pause : out std_logic; key_beep : out std_logic);end entity;architecture behav of counter issignal cnt1 : std_logic_vector(3 downto 0);-10signal cnt2 : std_logic_vector(3 downto 0);-1signal cnt3 : std_logic_vector(3 downto 0);-0.1type ty
9、pe_mode is (reset,pause,up,down,ov_down,buf,set1,set2,set3);signal mode : type_mode;constant key_sp : std_logic_vector := "000"-start pause incconstant key_set : std_logic_vector := "001"-setconstant key_dir : std_logic_vector := "010"constant key_reset : std_logic_vect
10、or := "011"constant key_null : std_logic_vector := "111"begin proc1:process(clk) variable key_tri : std_logic := '0' variable dir : std_logic := '0'-0=up, 1=down variable tick : integer range 0 to 50; variable buf1,buf2,buf3 : std_logic_vector(11 downto 0); variab
11、le buf_cnt1,buf_cnt2 : integer range 0 to 2; begin if (rising_edge(clk) then if key=key_null then key_tri := '0' end if; case mode is when reset =>- tick := 0; key_tri := '1' cnt1 <= (others => '0'); cnt2 <= (others => '0'); cnt3 <= (others =>
12、9;0'); dir := '0' bell <= '0' mode <= pause; when pause =>- led_pause <= '0' flash_mask <= "111" if dir='0' then-up led_up <= '0' led_down <= '1' else-down led_up <= '1' led_down <= '0' end if; i
13、f key_tri='0' thenkey_tri := '1' case key is when key_sp => led_pause <= '1' flash_mask <= "000" if dir='0' then mode <= up; else mode <= down; end if; when key_set => mode <= buf; when key_dir => tick := 0; if dir='0' then di
14、r :='1'-down led_up <= '1' led_down <= '0' else dir :='0'-up led_up <= '0' led_down <= '1' end if; when key_reset => mode <= reset; when others => key_tri := '0' end case; end if; when up =>- if key_tri='0' then
15、key_tri := '1' case key is when key_sp => mode <= pause; when key_set =>case buf_cnt1 iswhen 0 =>buf1:=cnt3&cnt2&cnt1;when 1 =>buf2:=cnt3&cnt2&cnt1;when 2 =>buf3:=cnt3&cnt2&cnt1;mode <= pause;end case;buf_cnt1:=buf_cnt1+1; when key_dir => null;
16、 when key_reset => null; when others => key_tri := '0' end case; end if; tick := tick + 1; if tick=49 then tick := 0; cnt3 <= cnt3 + 1; if cnt3="1001" then cnt3 <= "0000" cnt2 <= cnt2 + 1; if cnt2="1001" then cnt2 <= "0000" if cnt1=&q
17、uot;1001" then- cnt3 <= "1001"- cnt2 <= "1001" mode <=reset; elsecnt1 <= cnt1 + 1; end if; end if; end if; end if; when down =>- if key_tri='0' then key_tri := '1' case key is when key_sp => mode <= pause; when key_set =>null; when key
18、_dir => null; when key_reset => null; when others => key_tri := '0' end case; end if; tick := tick + 1; if tick=49 then tick := 0; cnt3 <= cnt3 - 1; if cnt3="0000" then cnt3 <= "1001" cnt2 <= cnt2 - 1; if cnt2="0000" then cnt2 <= "1001&
19、quot; if cnt1="0000" then cnt3 <= "0000" cnt2 <= "0000" mode <= ov_down; elsecnt1 <= cnt1 - 1; end if; end if; end if; end if; when ov_down =>- bell <= '1' if (key/=key_null) then mode <= reset; end if; when buf =>- flash_mask <= "
20、;000" case buf_cnt2 iswhen 0 =>cnt3 <= buf1(11 downto 8);cnt2 <= buf1(7 downto 4);cnt1 <= buf1(3 downto 0);when 1 =>cnt3 <= buf2(11 downto 8);cnt2 <= buf2(7 downto 4);cnt1 <= buf2(3 downto 0);when 2 =>cnt3 <= buf3(11 downto 8);cnt2 <= buf3(7 downto 4);cnt1 <=
21、 buf3(3 downto 0);end case; if key_tri='0' then key_tri := '1' case key is when key_sp => buf_cnt2 := buf_cnt2 + 1; when key_set => mode <= set1; when others =>key_tri := '0' end case; end if; when set1 =>- flash_mask <= "001" if key_tri='0'
22、; then key_tri := '1' case key is when key_sp => cnt1 <= cnt1 + 1; if cnt1="1001" then cnt1 <= "0000" end if; when key_set => mode <= set2; when key_dir => null; when key_reset => null; when others =>null; key_tri := '0' end case; end if; w
23、hen set2 =>- flash_mask <= "010" if key_tri='0' then key_tri := '1' case key is when key_sp => cnt2 <= cnt2 + 1; if cnt2="1001" then cnt2 <= "0000" end if; when key_set => mode <= set3; when key_dir => null; when key_reset => n
24、ull; when others => key_tri := '0' end case; end if; when set3 =>- flash_mask <= "100" if key_tri='0' then key_tri := '1' case key is when key_sp => cnt3 <= cnt3 + 1; if cnt3="1001" then cnt3 <= "0000" end if; when key_set =>
25、 mode <= pause; when key_dir => null; when key_reset => null; when others => key_tri := '0' end case; end if; end case; key_beep <= key_tri; end if; end process;bcd1 <= cnt1;bcd2 <= cnt2;bcd3 <= cnt3; end architecture;模塊3:display圖(5)模塊3:display顯示模塊,接收counter模塊的顯示信號(hào),并在
26、數(shù)碼管上進(jìn)行掃描輸出,同時(shí)還具有控制顯示閃爍的功能。具體源代碼如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity display is port(clk:in std_logic; flash_mask : in std_logic_vector(2 downto 0); bcd1 : in std_logic_vector(3 downto 0); bcd2 : in std_logic_vector(3 downto 0); bcd3 : in std_logic_vector
27、(3 downto 0); bcd : out std_logic_vector(3 downto 0); lsd : out std_logic_vector(2 downto 0); point : out std_logic);end display;architecture behav of display isbegin pro_lsd:process(clk) variable cnt : integer range 1 to 3; variable tick : integer range 0 to 127; begin if rising_edge(clk) then tick
28、 := tick + 1; lsd<="000" case cnt is when 1 => bcd <= bcd1; cnt := 2; point <= '0' if flash_mask(0)='1' and tick>63 then lsd(0) <= '0' else lsd(0) <= '1' end if; when 2 => bcd <= bcd2; cnt := 3; point <= '1' if flash_mas
29、k(1)='1' and tick>63 then lsd(1) <= '0' else lsd(1) <= '1' end if; when 3 => bcd <= bcd3; cnt := 1; point <= '0' if flash_mask(2)='1' and tick>63 then lsd(2) <= '0' else lsd(2) <= '1' end if; end case; end if; end pro
30、cess;end architecture;總連接圖:程序最終使用了125個(gè)宏單元和25個(gè)管腳。4 仿真分析首先進(jìn)行每個(gè)模塊的獨(dú)立仿真。模塊一:keyboard顯然,模塊的輸出信號(hào)key隨著鍵盤(pán)信號(hào)key_in而變化,模塊功能正常。這一部分主要是防止多個(gè)按鍵被按下。同時(shí),單獨(dú)劃分一個(gè)模塊也可以使以后的擴(kuò)展變得更加容易。模塊二:counter輸入1KHz的clk信號(hào),再輸入開(kāi)始記時(shí)的信號(hào),計(jì)數(shù)器開(kāi)始記時(shí),記時(shí)正常。模塊三:display掃描顯示正常,同時(shí)可以進(jìn)行正常的閃爍顯示功能。系統(tǒng)整體:整體仿真結(jié)果基本正確。5 設(shè)計(jì)中遇到的問(wèn)題整個(gè)設(shè)計(jì)過(guò)程一共用了半個(gè)多月的時(shí)間,其中有一大半的時(shí)間都是用來(lái)完
31、成擴(kuò)展功能的,而基本功能比較順利的就完成了。最開(kāi)始的時(shí)候進(jìn)行了邏輯上的模塊劃分,按照功能仔細(xì)的劃分了模塊,但是發(fā)現(xiàn)這樣對(duì)設(shè)計(jì)造成很大的麻煩,在程序編寫(xiě)到一半的時(shí)候整個(gè)推翻重寫(xiě)。第二次寫(xiě)這個(gè)程序較為順利,但是由于前期規(guī)劃沒(méi)有做好,在操作和程序邏輯上有一些混亂,雖然勉強(qiáng)能夠運(yùn)作但是效果不能讓人滿意。于是就有了第三次編寫(xiě)。這一次進(jìn)行了比較詳細(xì)的規(guī)劃,對(duì)程序也有了比較準(zhǔn)確的把握,寫(xiě)起來(lái)較為順利。尤其是對(duì)操作方法進(jìn)行了重新調(diào)整,還詳細(xì)的畫(huà)出了程序的流程圖。按照流程圖和一定的程序結(jié)構(gòu),順利的完成了程序基本功能的編寫(xiě),這一次只用了幾個(gè)小時(shí)就完全完成了程序的編寫(xiě)和調(diào)試,整個(gè)過(guò)程非常順利。在編寫(xiě)基本功能的過(guò)程中
32、由于整體較為順利,兩次推翻重新進(jìn)行所有工作,到了第三次全部完成,一共花了大概一周的時(shí)間。開(kāi)始的時(shí)候不熟悉VHDL設(shè)計(jì)的設(shè)計(jì)思想,走了不少?gòu)澛贰6以陂_(kāi)始的時(shí)候抱著寫(xiě)寫(xiě)看的想法,對(duì)程序的功能沒(méi)有進(jìn)行仔細(xì)的分析,所以寫(xiě)程序的時(shí)候思路不是非常清晰,而且經(jīng)常出現(xiàn)混亂。后來(lái),經(jīng)過(guò)探索,我總結(jié)出了“操作狀態(tài)”的模式,細(xì)致的劃定了各個(gè)狀態(tài)和操作,每個(gè)狀態(tài)該進(jìn)行什么樣的寄存器操作,什么樣的按鍵響應(yīng),按鍵或是寄存器變化之后會(huì)有什么樣的狀態(tài)變化。在畫(huà)出了相應(yīng)的狀態(tài)流程圖之后發(fā)現(xiàn)編寫(xiě)程序基本上就是照著圖“抄”程序,整個(gè)過(guò)程非常簡(jiǎn)單。雖然在按鍵方面出了一些問(wèn)題,但是很快經(jīng)過(guò)改進(jìn)之后就好了。之后就是對(duì)基本功能的擴(kuò)展,擴(kuò)展功能花了很大的力氣才完成,經(jīng)過(guò)不斷次對(duì)程序的修
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 銷售稅務(wù)常識(shí)培訓(xùn)課件
- 健康飲食產(chǎn)業(yè)園項(xiàng)目質(zhì)量管理方案(參考)
- 2025年雙門轎跑車合作協(xié)議書(shū)
- 2025年汽車尾氣自動(dòng)測(cè)定儀合作協(xié)議書(shū)
- 鄉(xiāng)城流動(dòng)中的中國(guó)男性婚姻擠壓緒論
- 2025年臨床前CRO項(xiàng)目發(fā)展計(jì)劃
- 物業(yè)服務(wù)委托合同 (二)
- 2025年無(wú)機(jī)電子材料合作協(xié)議書(shū)
- 2025年黑龍江省中考生物試卷(含答案)
- 2025年閑置物品調(diào)劑回收項(xiàng)目合作計(jì)劃書(shū)
- 杭州轉(zhuǎn)貸基金管理辦法
- 老北京胡同文化課件
- 公司安全隱患排查記錄表
- 糧食的形態(tài)與化學(xué)組成第二節(jié)糧食的主要化學(xué)成分下64課件
- 兒科護(hù)士考試試題及答案
- 創(chuàng)新社區(qū)管樂(lè)團(tuán)活動(dòng)方案
- 中國(guó)農(nóng)田水利行業(yè)發(fā)展前景及發(fā)展策略與投資風(fēng)險(xiǎn)研究報(bào)告2025-2028版
- 前列腺癌根治術(shù)護(hù)理查房課件
- 外研版六年級(jí)英語(yǔ)下冊(cè) Module2 unit1 教學(xué)課件PPT小學(xué)公開(kāi)課
- 2021-2022學(xué)年人教版數(shù)學(xué)六年級(jí)上冊(cè)第一單元測(cè)試卷【含答案】
- 《別墅設(shè)計(jì)任務(wù)書(shū)》word版
評(píng)論
0/150
提交評(píng)論