• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

電子計時時鐘帶設(shè)計報告VHDL代碼Quartus仿真

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

2-24010Z94505I0.doc

共1個文件

名稱:電子計時時鐘帶設(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

  • 2-24010Z94505I0.doc
    下載

相關(guān)推薦