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