名稱:數(shù)字顯示自動(dòng)記分器VHDL代碼Quartus仿真
軟件:Quartus
語(yǔ)言:VHDL
代碼功能:
數(shù)字顯示自動(dòng)記分器
1.設(shè)計(jì)一個(gè)射擊用的數(shù)字顯示自動(dòng)計(jì)分器,電路共設(shè)18個(gè)模擬開關(guān),K1~K18,分別代表射擊者射中的目標(biāo),射中K1~K9分別得1~9分,射中K10~K18分別得10~90分;
2.要求每射中一次(K1~K18開關(guān)拔動(dòng)一次)單發(fā)計(jì)數(shù)顯示器能自動(dòng)顯示得分?jǐn)?shù),顯示2秒后自動(dòng)消失;
3.每射中一次均應(yīng)將射擊的得分?jǐn)?shù)累計(jì)并顯示;
4.電路應(yīng)具有復(fù)位功能,即每局結(jié)束后,應(yīng)將各計(jì)數(shù)器自動(dòng)清0,為下一次記分作好準(zhǔn)備(手動(dòng)復(fù)位);
5.單發(fā)計(jì)數(shù)顯示和累加計(jì)數(shù)顯示應(yīng)分開;
6.脈神信號(hào)源(自行設(shè)計(jì))為1KHz頻率。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 頂層原理圖
3. 程序文件
4. 程序編譯
5. RTL圖
狀態(tài)圖
6. 仿真圖
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --控制模塊 ENTITY?score_ctrl?IS ???PORT?( ??????clk????????????:?IN?STD_LOGIC;--時(shí)鐘 ??????rst_p??????????:?IN?STD_LOGIC;--復(fù)位 ??????k1_p???????????:?IN?STD_LOGIC;--按鍵1~18 ??????k2_p???????????:?IN?STD_LOGIC; ??????k3_p???????????:?IN?STD_LOGIC; ??????k4_p???????????:?IN?STD_LOGIC; ??????k5_p???????????:?IN?STD_LOGIC; ??????k6_p???????????:?IN?STD_LOGIC; ??????k7_p???????????:?IN?STD_LOGIC; ??????k8_p???????????:?IN?STD_LOGIC; ??????k9_p???????????:?IN?STD_LOGIC; ??????k10_p??????????:?IN?STD_LOGIC; ??????k11_p??????????:?IN?STD_LOGIC; ??????k12_p??????????:?IN?STD_LOGIC; ??????k13_p??????????:?IN?STD_LOGIC; ??????k14_p??????????:?IN?STD_LOGIC; ??????k15_p??????????:?IN?STD_LOGIC; ??????k16_p??????????:?IN?STD_LOGIC; ??????k17_p??????????:?IN?STD_LOGIC; ??????k18_p??????????:?IN?STD_LOGIC; ??????display_en?????:?OUT?STD_LOGIC;--顯示使能(顯示持續(xù)2秒) ??????cur_score_o????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0);--當(dāng)前分?jǐn)?shù) ??????total_score_o??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)?--總分?jǐn)?shù) ???); END?score_ctrl; ARCHITECTURE?trans?OF?score_ctrl?IS ???SIGNAL?key_valid???:?STD_LOGIC; ???type?state_type?is?( ??????s_idle?????????, ??????s_key??????????, ??????s_wait?????????, ??????s_end?????????? ???); ???SIGNAL?state:state_type; ???SIGNAL?time_cnt????:?INTEGER?:=?0; ??? ???SIGNAL?cur_score???:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ???SIGNAL?total_score?:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; BEGIN ???key_valid?<=?k1_p?OR?k2_p?OR?k3_p?OR?k4_p?OR?k5_p?OR?k6_p?OR?k7_p?OR?k8_p?OR?k9_p?OR?k10_p?OR?k11_p?OR?k12_p?OR?k13_p?OR?k14_p?OR?k15_p?OR?k16_p?OR?k17_p?OR?k18_p;--按鍵是否按鍵 ???--狀態(tài)機(jī) ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN ?????????state?<=?s_idle;--復(fù)位 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?s_idle?=>--初始狀態(tài) ???????????????IF?(key_valid?=?'1')?THEN--按鍵按下 ??????????????????state?<=?s_key; ???????????????ELSE ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?s_key?=>--按鍵按下狀態(tài) ???????????????state?<=?s_wait; ????????????WHEN?s_wait?=>--計(jì)時(shí)2秒狀態(tài) ???????????????IF?(time_cnt?>=?200)?THEN--1KHz計(jì)時(shí)2000就是2秒,仿真時(shí)把2000改小為200便于觀察 ??????????????????state?<=?s_end; ???????????????END?IF; ????????????WHEN?s_end?=>--結(jié)束 ???????????????state?<=?s_idle; ????????????WHEN?OTHERS?=> ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???--計(jì)時(shí) ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN ?????????time_cnt?<=?0;--復(fù)位 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?s_wait)?THEN--計(jì)時(shí)2秒狀態(tài)下進(jìn)行計(jì)數(shù) ????????????time_cnt?<=?time_cnt?+?1;--計(jì)數(shù) ?????????ELSE ????????????time_cnt?<=?0; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--計(jì)分 ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN--復(fù)位 ?????????cur_score?<=?"00000000";---當(dāng)前分 ?????????total_score?<=?"00000000";--總分 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?s_key)?THEN ????????????IF?(k1_p?=?'1')?THEN ???????????????cur_score?<=?"00000001";--1分 ???????????????total_score?<=?total_score?+?"00000001"; ????????????ELSIF?(k2_p?=?'1')?THEN ???????????????cur_score?<=?"00000010";--2分 ???????????????total_score?<=?total_score?+?"00000010"; ????????????ELSIF?(k3_p?=?'1')?THEN ???????????????cur_score?<=?"00000011";--3分 ???????????????total_score?<=?total_score?+?"00000011"; ????????????ELSIF?(k4_p?=?'1')?THEN ???????????????cur_score?<=?"00000100";--4分 ???????????????total_score?<=?total_score?+?"00000100"; ????????????ELSIF?(k5_p?=?'1')?THEN ???????????????cur_score?<=?"00000101";--5分 ???????????????total_score?<=?total_score?+?"00000101"; ????????????ELSIF?(k6_p?=?'1')?THEN ???????????????cur_score?<=?"00000110";--6分 ???????????????total_score?<=?total_score?+?"00000110"; ????????????ELSIF?(k7_p?=?'1')?THEN ???????????????cur_score?<=?"00000111";--7分 ???????????????total_score?<=?total_score?+?"00000111"; ????????????ELSIF?(k8_p?=?'1')?THEN ???????????????cur_score?<=?"00001000";--8分 ???????????????total_score?<=?total_score?+?"00001000"; ????????????ELSIF?(k9_p?=?'1')?THEN ???????????????cur_score?<=?"00001001";--9分 ???????????????total_score?<=?total_score?+?"00001001"; ???????????? ????????????ELSIF?(k10_p?=?'1')?THEN ???????????????cur_score?<=?"00001010";--10分 ???????????????total_score?<=?total_score?+?"00001010"; ????????????ELSIF?(k11_p?=?'1')?THEN ???????????????cur_score?<=?"00010100";--20分 ???????????????total_score?<=?total_score?+?"00010100"; ????????????ELSIF?(k12_p?=?'1')?THEN ???????????????cur_score?<=?"00011110";--30分 ???????????????total_score?<=?total_score?+?"00011110"; ????????????ELSIF?(k13_p?=?'1')?THEN ???????????????cur_score?<=?"00101000";--40分 ???????????????total_score?<=?total_score?+?"00101000"; ????????????ELSIF?(k14_p?=?'1')?THEN ???????????????cur_score?<=?"00110010";--50分 ???????????????total_score?<=?total_score?+?"00110010"; ????????????ELSIF?(k15_p?=?'1')?THEN ???????????????cur_score?<=?"00111100";--60分 ???????????????total_score?<=?total_score?+?"00111100"; ????????????ELSIF?(k16_p?=?'1')?THEN ???????????????cur_score?<=?"01000110";--70分 ???????????????total_score?<=?total_score?+?"01000110"; ????????????ELSIF?(k17_p?=?'1')?THEN ???????????????cur_score?<=?"01010000";--80分 ???????????????total_score?<=?total_score?+?"01010000"; ????????????ELSIF?(k18_p?=?'1')?THEN ???????????????cur_score?<=?"01011010";--90分 ???????????????total_score?<=?total_score?+?"01011010"; ????????????END?IF; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--顯示使能,持續(xù)2秒 ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN--復(fù)位 ?????????display_en?<=?'0'; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?s_wait)?THEN?? display_en?<=?'1'; ???ELSE display_en?<=?'0'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ???cur_score_o?<=?cur_score;--輸出單發(fā)計(jì)分 ???total_score_o?<=?total_score;--輸出總分 ??? END?trans;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=500