名稱:電子計時時鐘帶設(shè)計報告VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
電子計時時鐘帶設(shè)計報告
利用VHDL語言,實現(xiàn)電子計時時鐘,要求能夠顯示分鐘、秒鐘,顯示輸出為共陰極數(shù)碼管,要求:
1、電子計時時鐘具有異步清零、同步置數(shù)功能,用VHDL實現(xiàn)計數(shù)邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
2、用VHDL實現(xiàn)譯碼顯示邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
3、驅(qū)動的數(shù)碼管為共陰極數(shù)碼管,闡述電路原理,給出相應(yīng)編碼方式。
(1)按設(shè)計指導(dǎo)書中要求的格式書寫,所有內(nèi)容一律打??;
(2)報告內(nèi)容包括設(shè)計過程、軟件仿真的結(jié)果及分析;
(3)報告中要有整體電路原理圖、各模塊原理圖;
(4)軟件仿真包括各個模塊的仿真和整體電路的仿真;
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. 仿真圖
整體仿真圖
60進制計數(shù)器模塊
顯示模塊
設(shè)計報告.doc
電子計時時鐘設(shè)計報告
一、功能要求
利用VHDL語言,實現(xiàn)電子計時時鐘,要求能夠顯示分鐘、秒鐘,顯示輸出為共陰極數(shù)碼管,要求:
1、電子計時時鐘具有異步清零、同步置數(shù)功能,用VHDL實現(xiàn)計數(shù)邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
2、用VHDL實現(xiàn)譯碼顯示邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
3、驅(qū)動的數(shù)碼管為共陰極數(shù)碼管,闡述電路原理,給出相應(yīng)編碼方式。
二、設(shè)計原理
根據(jù)功能要求分析,設(shè)計電子計時時鐘,要求能夠顯示分鐘、秒鐘,分鐘和秒鐘都是60進制,因此可以設(shè)計一個60進制的計數(shù)器,然后將該計數(shù)器調(diào)用2次,將秒鐘對應(yīng)的60進制計數(shù)器的進位輸出控制分鐘計數(shù),也就是當(dāng)秒鐘計數(shù)60次后,分鐘計數(shù)1次。這樣就能實現(xiàn)分鐘和秒鐘的控制。秒鐘的60進制計數(shù)器控制時鐘為1Hz,即1秒計數(shù)一次。要求驅(qū)動的數(shù)碼管為共陰極數(shù)碼管,共陰極數(shù)碼管的原理為8個發(fā)光二極管的陰極連在一起,分8個端口的控制信號,當(dāng)端口輸入高電平時,對應(yīng)的二極管點亮,如下圖所示。
三、設(shè)計過程
3.1. 60進制的計數(shù)器設(shè)計
60進制計數(shù)器的輸入端口有時鐘端口clk,異步清零端口reset、同步置數(shù)信號set_key,同步置數(shù)十位time_ten[3:0]和同步置數(shù)十位time_one[3:0]以及使能信號端口enable;輸出端口為十位輸出cnt_ten[3:0],個位輸出cnt_one[3:0]以及進位輸出cout。
下圖為60進制計數(shù)器的原理圖
具體代碼編碼分2部分,一部分為計數(shù)控制,一部分為進位信號控制。計數(shù)控制首先判斷reset值若為高電平,則輸出全為0,然后在時鐘clk的上升沿檢測同步置數(shù)信號,若為高電平,則進行置位,將同步置數(shù)十位time_ten[3:0]和同步置數(shù)十位time_one[3:0]賦值給計數(shù)器。然后判斷enable,若為高電平則正常計數(shù),計數(shù)時先對個位計數(shù),個位計數(shù)到9后,個位清零,十位加1,若計數(shù)到59,則十位個位均回0。
進位信號的控制為判斷此時十位和個位是否已經(jīng)計數(shù)到59,若是,則輸出1,否則輸出0。至此60進制計數(shù)器就設(shè)計完成了。
3.2 顯示譯碼模塊設(shè)計
顯示譯碼模塊的輸入信號為分鐘十位和個位cnt_ten_minute[3:0]、cnt_one_minute[3:0]以及秒鐘的十位和個位cnt_ten_second[3:0]、cnt_one_second[3:0]。輸出打端口為4個數(shù)碼管輸出端口,與輸入一一對應(yīng),分別為分十位、分個位、秒十位、秒個位:HEX_ten_minute[3:0]、HEX_one_minute[3:0]、HEX_ten_second[3:0]、HEX_one_second[3:0]。下圖為顯示譯碼模塊的原理圖。
具體代碼編碼采用case語句,分為4個進程,一個進程對應(yīng)一個數(shù)碼管的譯碼,輸入計數(shù)信號的值為0~9的范圍,因此需要對0~9共10個數(shù)進行編碼。根據(jù)下圖,可以分析得到每個數(shù)字對應(yīng)的a,b,c,d,e,f,g,dp值。
3.3 頂層電路設(shè)計
模塊代碼設(shè)計完成后,在頂層新建原理圖文件,添加2個60進制計數(shù)器模塊和一個顯示譯碼模塊,原理圖如下:
圖中,將秒鐘的60進制計數(shù)器的cout信號作為分鐘的enable信號,使得秒鐘計數(shù)到59時可以觸發(fā)分鐘的計數(shù)器加1。再將秒鐘的計數(shù)輸出和分鐘的計數(shù)輸出都連到顯示模塊的輸入,最終得到完成的電路圖。
四、仿真結(jié)果及分析
4.1 計數(shù)器模塊仿真
60進制計數(shù)器模塊的仿真圖如下所示
上圖中,當(dāng)reset信號為高電平時,電路異步清零,cnt_ten和cnt_one輸出均為0,reset信號為低電平時,enable為高電平,開始計數(shù),當(dāng)檢測到set_key為高電平時,進行同步置數(shù),cnt_ten和cnt_one輸出均為置數(shù)的time_ten和time_one。set_key為低電平時,繼續(xù)從當(dāng)前值進行計數(shù),當(dāng)計數(shù)到59時輸出進位信號cout,同時計數(shù)器回到0。仿真圖驗證了計數(shù)器的各項功能。
4.2 譯碼模塊仿真
譯碼模塊的仿真圖如下圖所示:
上圖中,HEX_ten_minute[3:0]、HEX_one_minute[3:0]、HEX_ten_second[3:0]、HEX_one_second[3:0]分別表示分十位、分個位、秒十位、秒個位。其中HEX_ten_minute對應(yīng)的譯碼值為01001111(最高位為dp,最低位為a),通過與數(shù)碼管對應(yīng)的a,b,c,d,e,f,g,dp值比較,該碼對應(yīng)的數(shù)字為3,與cnt_ten_minute的值一致,因此分鐘十位譯碼仿真正確,其他為同理,均能驗證仿真正確。
4.3 整體仿真
整體功能仿真如下圖所示:
圖中,異步清零和同步置數(shù)功能與60進制計數(shù)器模塊的仿真一致,且可以觀察到秒鐘計數(shù)到59后,分鐘才加1,且同時秒鐘回答0重新開始計數(shù)。下圖為整體仿真圖的局部放大圖,圖中可以清晰看到秒鐘到分鐘的進位過程。
最終的4個數(shù)碼管顯示信號為HEX0、HEX1,HEX2,HEX3,其中HEX1為秒鐘個位,HEX0為秒鐘十位,HEX3為分鐘個位,HEX2為分鐘十位。
五、總結(jié)
通過此次實驗,我使用QuartusII軟件和VHDL語言,設(shè)計了電子計時時鐘,且通過模塊仿真和整體仿真驗證了設(shè)計的正確性,使我對Quartus軟件的使用更加熟悉,同時也進一步加深了對VHDL語言的理解。目前我所設(shè)計的這個電子時鐘只是仿真,并沒有時間在硬件上運行,后續(xù)如果改進的話可以嘗試使其真正的在開發(fā)板上運行。
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --60進制計數(shù)器 ENTITY?counter_60?IS ???PORT?( ??????clk??????:?IN?STD_LOGIC;--時鐘 ??enable???:?IN?STD_LOGIC;--使能 ??reset????:?IN?STD_LOGIC;--復(fù)位,異步清零 ??????set_key??:?IN?STD_LOGIC;--同步置數(shù)按鍵 ??????time_ten?:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0);--置數(shù)值十位 ??????time_one?:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0);--置數(shù)值個位?? ??????cnt_ten??:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0);--計數(shù)值十位 ??????cnt_one??:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0);--計數(shù)值個位 ??????cout?????:?OUT?STD_LOGIC--進位 ???); END?counter_60; ARCHITECTURE?behave?OF?counter_60?IS ???SIGNAL?cnt_ten_buf?:?STD_LOGIC_VECTOR(3?DOWNTO?0)?:=?"0000";--計數(shù)值十位 ???SIGNAL?cnt_one_buf?:?STD_LOGIC_VECTOR(3?DOWNTO?0)?:=?"0000";--計數(shù)值個位 BEGIN ???PROCESS?(clk,reset) ???BEGIN IF(reset='1')THEN--異步復(fù)位 cnt_ten_buf?<=?"0000"; ????????cnt_one_buf?<=?"0000"; ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN--正常計時 IF(set_key='1')THEN--同步置數(shù) cnt_ten_buf?<=?time_ten;--置數(shù)值十位 cnt_one_buf?<=?time_one;--置數(shù)值個位?? ELSIF(enable='1')THEN--使能 ?IF?(cnt_ten_buf?=?"0101"?AND?cnt_one_buf?=?"1001")?THEN--59后變?yōu)?0 cnt_ten_buf?<=?"0000"; cnt_one_buf?<=?"0000"; ?ELSIF?(cnt_one_buf?=?"1001")?THEN--個位為9,十位加1 cnt_ten_buf?<=?cnt_ten_buf?+?"0001"; cnt_one_buf?<=?"0000"; ?ELSE--個位累加 cnt_ten_buf?<=?cnt_ten_buf; cnt_one_buf?<=?cnt_one_buf?+?"0001"; ?END?IF; END?IF; ?????END?IF; ???END?PROCESS; cout<='1'?when?(cnt_ten_buf?=?"0101"?AND?cnt_one_buf?=?"1001")?else?'0';--進位 ??? ???cnt_ten?<=?cnt_ten_buf;--計數(shù)值十位 ???cnt_one?<=?cnt_one_buf;--計數(shù)值個位??? END?behave;
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=513