名稱:數字顯示自動記分器VHDL代碼Quartus仿真
軟件:Quartus
語言:VHDL
代碼功能:
數字顯示自動記分器
1.設計一個射擊用的數字顯示自動計分器,電路共設18個模擬開關,K1~K18,分別代表射擊者射中的目標,射中K1~K9分別得1~9分,射中K10~K18分別得10~90分;
2.要求每射中一次(K1~K18開關拔動一次)單發(fā)計數顯示器能自動顯示得分數,顯示2秒后自動消失;
3.每射中一次均應將射擊的得分數累計并顯示;
4.電路應具有復位功能,即每局結束后,應將各計數器自動清0,為下一次記分作好準備(手動復位);
5.單發(fā)計數顯示和累加計數顯示應分開;
6.脈神信號源(自行設計)為1KHz頻率。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設計文檔:
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;--時鐘 ??????rst_p??????????:?IN?STD_LOGIC;--復位 ??????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);--當前分數 ??????total_score_o??:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)?--總分數 ???); 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)機 ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN ?????????state?<=?s_idle;--復位 ??????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?=>--計時2秒狀態(tài) ???????????????IF?(time_cnt?>=?200)?THEN--1KHz計時2000就是2秒,仿真時把2000改小為200便于觀察 ??????????????????state?<=?s_end; ???????????????END?IF; ????????????WHEN?s_end?=>--結束 ???????????????state?<=?s_idle; ????????????WHEN?OTHERS?=> ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???--計時 ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN ?????????time_cnt?<=?0;--復位 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?s_wait)?THEN--計時2秒狀態(tài)下進行計數 ????????????time_cnt?<=?time_cnt?+?1;--計數 ?????????ELSE ????????????time_cnt?<=?0; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--計分 ???PROCESS?(clk,?rst_p) ???BEGIN ??????IF?(rst_p?=?'1')?THEN--復位 ?????????cur_score?<=?"00000000";---當前分 ?????????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--復位 ?????????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ā)計分 ???total_score_o?<=?total_score;--輸出總分 ??? END?trans;
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=500