名稱:利用VHDL語言,實現(xiàn)0~8090任意進制8421BCD計數(shù)譯碼顯示電 路,并將計數(shù)器輸出的8421BCD進行共陰數(shù)碼管顯示設(shè)計VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
1、計數(shù)器具有同步置數(shù)功能、異步清零功能,用VHDL實現(xiàn)計數(shù)邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
2、8421BCD碼7段譯碼部分可以參見74LS48功能,用VHDL實現(xiàn)譯碼邏輯,并闡述設(shè)計原理,給出關(guān)鍵 block diagram設(shè)計框圖。
3、譯碼輸岀后驅(qū)動的數(shù)碼管為共陰極數(shù)碼管,闡述電路原理,給出相應(yīng)編碼方式。
報告要求
(1)按要求的格式書寫,所有內(nèi)容一律打印、封面要求統(tǒng)一
(2)報告內(nèi)容包括設(shè)計過程、軟件仿真的結(jié)果及分析
(3)報告中要有整體電路原理圖、各模塊原理圖;
(4)軟件仿真包括各個模塊的仿真和整體電路的仿真
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
設(shè)計文檔:
任意進制8421BCD計數(shù)譯碼顯示
1、課題任務(wù)及要求
1.1課題任務(wù)
利用VHDL語言,實現(xiàn)0~8090任意進制8421BCD計數(shù)譯碼顯示電路,并將計數(shù)器輸出的8421BCD進行共陰極數(shù)碼管顯示。要求:
1. 計數(shù)器具有同步置數(shù)功能、異步清零功能,利用VHDL實現(xiàn)計數(shù)邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
2. 8421BCD碼譯碼部分可以參見74LS48功能,用VHDL實現(xiàn)譯碼邏輯,并闡述設(shè)計原理,給出關(guān)鍵block diagram設(shè)計框圖。
3. 譯碼輸出后驅(qū)動的數(shù)碼管為共陰極數(shù)碼管,闡述電路原理,給出響應(yīng)的編碼方式。
1.2課題要求
課題設(shè)計實現(xiàn)的功能指標為。
●設(shè)計指標一:計數(shù)器具有同步置數(shù)功能、異步清零功能
●設(shè)計指標二:使用8421BCD計數(shù)器
●設(shè)計指標三:譯碼輸出后驅(qū)動的數(shù)碼管為共陰極數(shù)碼管
2、設(shè)計內(nèi)容
系統(tǒng)總體設(shè)計思路為采用分模塊設(shè)計,模塊分為計數(shù)模塊、數(shù)碼管顯示模塊及頂層模塊,具體模塊功能具體介紹如下。
2.1 設(shè)計總體功能簡介
系統(tǒng)總體設(shè)計思路為采用分模塊設(shè)計,模塊分為計數(shù)模塊、數(shù)碼管顯示模塊及頂層模塊,采用自頂向下的設(shè)計思想??傮w功能為實現(xiàn)0~8090任意進制8421BCD計數(shù)譯碼顯示電路,并將計數(shù)器輸出的8421BCD進行共陰極數(shù)碼管顯示
2.2 頂層模塊功能
頂層模塊實現(xiàn)將計數(shù)模塊和顯示模塊連接的功能,頂層模塊如下圖所示
上圖中,bcd_counter為計數(shù)模塊,display為顯示模塊。頂層輸入端口有:
Clk:時鐘信號
Load:同步置數(shù)使能信號
Data_in[15:0]:同步置數(shù)的數(shù)據(jù),采用8421BCD編碼
頂層輸出端口為4個7段數(shù)碼管信號:
HEX0[6..0]:數(shù)碼管0
HEX1[6..0]:數(shù)碼管1
HEX2[6..0]:數(shù)碼管2
HEX3[6..0]:數(shù)碼管3
2.3 計數(shù)模塊功能
計數(shù)模塊如下圖所示:
輸入端口有:
Clk:時鐘信號
Rst_p:系統(tǒng)復(fù)位信號,高電平有效
Load:同步置數(shù)使能信號
Data_in[15:0]:同步置數(shù)的數(shù)據(jù),采用8421BCD編碼
輸出端口為計數(shù)值:
Data_out[15..0]:計數(shù)值輸出采用8421BCD編碼
該模塊實現(xiàn)0~8090任意進制8421BCD計數(shù)器的功能,計數(shù)器具有同步置數(shù)功能、異步清零功能
2.4 顯示模塊功能
顯示模塊如下圖所示:
輸入端口有:
Clk:時鐘信號
Data[15:0]:計數(shù)值,采用8421BCD編碼
輸出端口為4個7段數(shù)碼管信號:
HEX0[6..0]:數(shù)碼管0
HEX1[6..0]:數(shù)碼管1
HEX2[6..0]:數(shù)碼管2
HEX3[6..0]:數(shù)碼管3
該模塊實現(xiàn)8421BCD碼譯碼功能,譯碼輸出后驅(qū)動的數(shù)碼管為共陰極數(shù)碼管。
3、設(shè)計及實現(xiàn)方法
3.1 計時模塊設(shè)計方法
計時模塊實現(xiàn)0~8090任意進制8421BCD計數(shù)器的功能,計數(shù)器具有同步置數(shù)功能、異步清零功能。主要代碼如下:
上述代碼中,為實現(xiàn)任意進制的功能,定義了一個信號MOD_NUM信號,將該值設(shè)置為多少就是多少進制。下面process進制實現(xiàn)具體任意進制BCD碼計數(shù)器的功能,定義了一個BCD編碼的信號為count。
首先,實現(xiàn)異步清零的功能,當(dāng)rst信號為1時,輸出count為0,然后實現(xiàn)同步置數(shù)功能,當(dāng)load信號為1時,將輸入的data_in賦值給count。
最后就是實現(xiàn)BCD碼計數(shù)器功能,首先判斷是否計數(shù)到999,若是,則千位加1,否則繼續(xù)判斷是否計數(shù)到99,若是,則百位加1;否則繼續(xù)判斷是否計數(shù)到9,若是,則十位加1。否則只需要個位加1。
Count為BCD編碼,其15~12位表示千位,11~8表示百位,7~4表示十位,3~0表示個位。
3.2 顯示模塊設(shè)計方法
顯示模塊實現(xiàn)8421BCD碼譯碼功能,譯碼輸出后驅(qū)動的數(shù)碼管為共陰極數(shù)碼管。其中單個數(shù)碼管顯示代碼如下:
數(shù)碼管顯示模塊用于控制數(shù)碼管將計數(shù)值顯示出來。使用7段數(shù)碼管顯示,每個數(shù)碼管輸入為7位,對應(yīng)下圖中的abcdefg7段,數(shù)碼管為共陰極,當(dāng)輸入1時對應(yīng)的段點亮,當(dāng)輸入為0時,對應(yīng)的段滅。
根據(jù)上圖可以觀察到,若要顯示數(shù)字0,G滅,ABCDEF亮,如果是共陽極數(shù)碼管也就是對應(yīng)編碼為“1000000”,共陰極數(shù)碼管則正好相反,故可以寫成not “1000000”,也就是“0111111”,其中從左到右依次對應(yīng)GFEDCBA。以此類推可以得到0~9的所有編碼。
4、調(diào)試及運行結(jié)果
4.1 計時模塊調(diào)試及運行結(jié)果
對計時模塊進行單獨仿真,仿真圖如下圖所示(為便于觀察,設(shè)置進制為34)。
上圖中,rst為異步清零信號,圖中可以看到,當(dāng)rst信號為1時,輸出data_out立馬清零。圖中l(wèi)oad為置位信號,圖中可以看到,load信號為高時,輸出data_out為data_in得值。
當(dāng)rst和load信號均無效時,計數(shù)器按時鐘正常計數(shù),可以看到,當(dāng)計數(shù)到34后,計數(shù)器清零,重新開始計數(shù),故進制正確。
4.2 顯示模塊調(diào)試及運行結(jié)果
對顯示模塊進行單獨仿真,仿真圖如下圖所示(為便于觀察,設(shè)置計數(shù)器計數(shù)0~9)。
上圖中,計數(shù)值輸入為0000~0009,其中HEX0顯示個位,也就是0~9,HEX1~3均顯示0。根據(jù)前面關(guān)于數(shù)碼管的介紹可知,0對應(yīng)的編碼為0111111,1對應(yīng)的編碼為0000110,以此類推可以做到仿真圖0~9編碼具正確。
4.3 系統(tǒng)總體調(diào)試及運行結(jié)果
對系統(tǒng)進行總體仿真,仿真圖如下圖所示:
上圖可以看到,整體仿真圖的仿真結(jié)果相當(dāng)于將計數(shù)模塊和顯示模塊進行合并顯示,最終輸出為HEX0~3的編碼值。可以看到,當(dāng)異步清零時,輸出的編碼值為0000,當(dāng)同步置數(shù)時,輸出的編碼值為0034,其他情況下為遞增計數(shù)。
5、設(shè)計總結(jié)
5.1設(shè)計中的問題、原因分析及解決方法
設(shè)計中一開始沒有正確理解BCD編碼的含義,導(dǎo)致使用了通常的二進制編碼,這種編碼的優(yōu)點是代碼簡單,計數(shù)器較容易實現(xiàn),但是缺點是不能直接按位分離出千位,百位,十位個位,導(dǎo)致時數(shù)碼管顯示不正確,后續(xù)改進為8421BCD編碼,雖然計數(shù)器代碼設(shè)計相對復(fù)雜一點,但是對于數(shù)碼管顯示部分就可以按位分離出千位,百位,十位和個位。
5.2設(shè)計方案的優(yōu)缺點
本設(shè)計方案的優(yōu)點是結(jié)構(gòu)清晰,采用分模塊設(shè)計方法,各個模塊功能比較明確,可以分模塊仿真,易于調(diào)試;缺點的話在于任意進制的設(shè)計在計數(shù)模塊內(nèi)通過一個參數(shù)進行定義,當(dāng)要修改進制時,需要修改該模塊內(nèi)的參數(shù),不是很靈活。
5.3心得體會
通過這次設(shè)計,我加深了對VHDL代碼的理解,熟悉了quartus軟件的編碼和仿真操作,并且對8421BCD碼的作用也有了更深刻的認識。通過這次實驗,我對我使用VHDL和EDA工具有了一定的提高,后續(xù)有其他功能設(shè)計的話可以更加容易的上手,也鍛煉了自己發(fā)現(xiàn)問題和解決問題的能力,為今后打下堅固基礎(chǔ)。
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ENTITY?display?IS ???PORT?( ??????clk???:?IN?STD_LOGIC; ??????data??:?IN?STD_LOGIC_VECTOR(15?DOWNTO?0); ??????HEX0??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ??????HEX1??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ??????HEX2??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0); ??????HEX3??:?OUT?STD_LOGIC_VECTOR(6?DOWNTO?0) ???); END?display; ARCHITECTURE?RTL?OF?display?IS BEGIN ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?data(3?DOWNTO?0)?IS ????????????WHEN?"0000"?=> ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ???????????????HEX0? ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?data(7?DOWNTO?4)?IS ????????????WHEN?"0000"?=> ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ???????????????HEX1? ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?data(11?DOWNTO?8)?IS ????????????WHEN?"0000"?=> ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ???????????????HEX2? ?????????END?CASE; ??????END?IF; ???END?PROCESS;
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1518