当前位置:   article > 正文

基于FPGA的简易计算器设计VHDL代码Quartus仿真

基于fpga的简易计算器

名称:基于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;
源代码

 扫描文章末尾的公众号二维码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/791736
推荐阅读
相关标签
  

闽ICP备14008679号