名称:基于FPGA的简易计算器设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
简易计算器
设计要求:
1.系统主要外设:矩阵键盘(4×4)、数码管6个、系统时钟(50MHz);
2.系统主要功能:可以实现十位以内的加、减、乘、除运算;用户通过矩阵键盘进行输入,并用数码管来显示当前的输入数值和最终的计算结果。
*备注:矩阵键盘大小为4×4,可以自行设计每个按键的功能。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. Testbench
6. 仿真图
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; --计算器 ENTITY?calculator_tb?IS END?calculator_tb; ARCHITECTURE?trans?OF?calculator_tb?IS ??? ???COMPONENT?state_ctrl?IS ??????PORT?( ?????????clk????????:?IN?STD_LOGIC; ?????????esc????????:?IN?STD_LOGIC; ?????????add????????:?IN?STD_LOGIC; ?????????sub????????:?IN?STD_LOGIC; ?????????mul????????:?IN?STD_LOGIC; ?????????div????????:?IN?STD_LOGIC; ?????????enter??????:?IN?STD_LOGIC; ?????????current_state?:?OUT?STD_LOGIC_VECTOR(2?DOWNTO?0); ?????????calcul?????:?OUT?STD_LOGIC_VECTOR(1?DOWNTO?0) ??????); ???END?COMPONENT; ??? ???COMPONENT?num_in?IS ??????PORT?( ?????????clk????????:?IN?STD_LOGIC; ?????????esc????????:?IN?STD_LOGIC; ?????????key_0??????:?IN?STD_LOGIC; ?????????key_1??????:?IN?STD_LOGIC; ?????????key_2??????:?IN?STD_LOGIC; ?????????key_3??????:?IN?STD_LOGIC; ?????????key_4??????:?IN?STD_LOGIC; ?????????key_5??????:?IN?STD_LOGIC; ?????????key_6??????:?IN?STD_LOGIC; ?????????key_7??????:?IN?STD_LOGIC; ?????????key_8??????:?IN?STD_LOGIC; ?????????key_9??????:?IN?STD_LOGIC; ?????????current_state?:?IN?STD_LOGIC_VECTOR(2?DOWNTO?0); ?????????calcul?????:?IN?STD_LOGIC_VECTOR(1?DOWNTO?0); ?????????OP_A???????:?OUT?integer; ?????????OP_B???????:?OUT?integer; ?????????OP_Result??:?OUT?integer ??????); ???END?COMPONENT; ????SIGNAL??clk????????:?STD_LOGIC;--时钟 ?SIGNALreset???????:?STD_LOGIC;--低电平复位 ?????? ????SIGNAL??OP_A???????:?integer;--输入的操作数A ????SIGNAL??OP_B???????:?integer;--输入的操作数B ????SIGNAL??OP_Result??:?integer;--结果 ???SIGNAL???esc????????:??STD_LOGIC;--ESC键 ???SIGNAL???add????????:??STD_LOGIC;--加 ???SIGNAL???sub????????:??STD_LOGIC;--减 ???SIGNAL???mul????????:??STD_LOGIC;--乘 ???SIGNAL???div????????:??STD_LOGIC;--除 ???SIGNAL???enter??????:??STD_LOGIC;--Enter键 ??? ???SIGNAL?current_state???:?STD_LOGIC_VECTOR(2?DOWNTO?0); ???SIGNAL?calcul??????????:?STD_LOGIC_VECTOR(1?DOWNTO?0); ??? ???SIGNAL?key_0_p?????????:?STD_LOGIC; ???SIGNAL?key_1_p?????????:?STD_LOGIC; ???SIGNAL?key_2_p?????????:?STD_LOGIC; ???SIGNAL?key_3_p?????????:?STD_LOGIC; ???SIGNAL?key_4_p?????????:?STD_LOGIC; ???SIGNAL?key_5_p?????????:?STD_LOGIC; ???SIGNAL?key_6_p?????????:?STD_LOGIC; ???SIGNAL?key_7_p?????????:?STD_LOGIC; ???SIGNAL?key_8_p?????????:?STD_LOGIC; ???SIGNAL?key_9_p?????????:?STD_LOGIC; ??? ???--?Declare?intermediate?signals?for?referenced?outputs ???SIGNAL?OP_A_buf??????:?integer; ???SIGNAL?OP_B_buf??????:?integer; ???SIGNAL?OP_Result_buf?:?integer; BEGIN ???--?Drive?referenced?outputs ???OP_A?<=?OP_A_buf; ???OP_B?<=?OP_B_buf; ???OP_Result?<=?OP_Result_buf; ??? ???--状态控制模块 ???i_state_ctrl?:?state_ctrl ??????PORT?MAP?( ?????????clk????????????=>?clk,--时钟 ?????????esc????????????=>?esc,--ESC键 ?????????add????????????=>?add,--加 ?????????sub????????????=>?sub,--减 ?????????mul????????????=>?mul,--乘 ?????????div????????????=>?div,--除 ?????????enter??????????=>?enter,--Enter键 ?????????current_state??=>?current_state,--当前状态 ?????????calcul?????????=>?calcul--计算 ??????); ??? ??? ???--数字输入模块 ???i_num_in?:?num_in ??????PORT?MAP?( ?????????clk????????????=>?clk,--时钟 ?????????esc????????????=>?esc, ?????????key_0??????????=>?key_0_p, ?????????key_1??????????=>?key_1_p, ?????????key_2??????????=>?key_2_p, ?????????key_3??????????=>?key_3_p, ?????????key_4??????????=>?key_4_p, ?????????key_5??????????=>?key_5_p, ?????????key_6??????????=>?key_6_p, ?????????key_7??????????=>?key_7_p, ?????????key_8??????????=>?key_8_p, ?????????key_9??????????=>?key_9_p, ?????????current_state??=>?current_state,--当前状态 ?????????calcul?????????=>?calcul,--计算方式,--00表示加--01表示减--10表示乘--11表示除 ?????????OP_A???????????=>?OP_A_buf,--输入的操作数A ?????????OP_B???????????=>?OP_B_buf,--输入的操作数B ?????????OP_Result??????=>?OP_Result_buf--结果 ??????); --仿真 init?:?PROCESS?????????????????????????????????????????????????????????????????????????????????? BEGIN? reset<='0'; ?wait?for?200?ns;? reset<='1'; ??wait?for?200?ns;? ?? esc<='0';?--ESC键 add<='0';--加 sub<='0';?--减 mul<='0';--乘 div<='0';?--除 enter<='0';?--Enter键 ?key_0_p<='0'; ?key_1_p<='0'; ?key_2_p<='0'; ?key_3_p<='0'; ?key_4_p<='0'; ?key_5_p<='0'; ?key_6_p<='0'; ?key_7_p<='0'; ?key_8_p<='0'; ?key_9_p<='0'; ? ?wait?for?200?ns; ?esc<='1';? ?wait?for?200?ns; ?esc<='0';??? ?wait?for?200?ns;? ? ?key_1_p<='1';? ?wait?for?200?ns; ?key_1_p<='0';??? ?wait?for?200?ns; ?--加 ?add<='1';? ?wait?for?200?ns; ?add<='0';??? ?wait?for?200?ns; ?key_2_p<='1';? ?wait?for?200?ns; ?key_2_p<='0';??? ?wait?for?200?ns; ? ?enter<='1';? ?wait?for?200?ns; ?enter<='0';??? ?wait?for?200?ns;? --////////////////////////////////////////////? ?esc<='1';? ?wait?for?200?ns; ?esc<='0';??? ?wait?for?200?ns; ? ? ?key_5_p<='1';? ?wait?for?200?ns; ?key_5_p<='0';??? ?wait?for?200?ns; ?sub<='1';? ?wait?for?200?ns; ?sub<='0';??? ?wait?for?200?ns; ?key_3_p<='1';? ?wait?for?200?ns; ?key_3_p<='0';??? ?wait?for?200?ns; ? ?enter<='1';? ?wait?for?200?ns; ?enter<='0';??? ?wait?for?200?ns;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=745
阅读全文
151