名称:基于FPGA的简易计算器设计VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
简易计算器。
设计要求:
1.系统主要外设:矩阵键盘(4×4)、数码管6个、系统时钟(50MHz);
2.系统主要功能:可以实现十位以内的加、减、乘、除运算;用户通过矩阵键盘进行输入,并用数码管来显示当前的输入数值和最终的计算结果。
*备注:矩阵键盘大小为4×4,可以自行设计每个按键的功能
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;
源代码
扫描文章末尾的公众号二维码