• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

按键加减计数器设计VHDL代码Quartus仿真

09/19 08:46
525
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-24102Q92251345.doc

共1个文件

名称:按键加减计数器设计VHDL代码Quartus仿真

软件:Quartus

语言:VHDL

代码功能:

按键加减计数器

1、设计加减计数器,通过按键控制加减

2、分别有加按键和减按键,按下加一或者减1

3、数码管显示当前计数值

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

演示视频:

设计文档:

Testbench

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
ENTITY key_jishu IS
   PORT (
      rst       : IN STD_LOGIC;--低电平有效
      key_in    : IN STD_LOGIC;--低电平有效
key_sub   : IN STD_LOGIC;--低电平有效--减法
      clk       : IN STD_LOGIC;--clk1_50M
      duanxuan  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--高电平有效
      weixuan   : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)--低电平有效
   );
END key_jishu;
ARCHITECTURE trans OF key_jishu IS
   
   SIGNAL display        : STD_LOGIC_VECTOR(7 DOWNTO 0) := "11000000";
   
   SIGNAL dis_num_gewei  : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000";
   SIGNAL dis_num_shiwei : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000";
   
   SIGNAL key_out        : STD_LOGIC := '1';--加法
SIGNAL key_out_sub    : STD_LOGIC := '1';--减法
   SIGNAL key_en         : STD_LOGIC := '0';
   
   SIGNAL cnt            : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
   
   SIGNAL select_num     : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000";
   SIGNAL geshu          : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000";
   
   SIGNAL sample_en      : STD_LOGIC := '0';
BEGIN
--////////////////////////////////////////////位选////////////////////////////////////////////////
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (select_num = "00000000000000011000011010011111") THEN
            select_num <= "00000000000000000000000000000000";--扫描频率
         ELSE
            select_num <= select_num + "00000000000000000000000000000001";--扫描频率计时数字
         END IF;
      END IF;
   END PROCESS;
   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (select_num = "00000000000000011000011010011111") THEN
            IF (geshu = "001") THEN
               geshu <= "000";
            ELSE
               geshu <= geshu + "001";--扫描哪个管子的指示位
            END IF;
         END IF;
      END IF;
   END PROCESS;
   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         CASE geshu IS--位选切换
            WHEN "000" =>
               weixuan <= "01";
               display <= dis_num_gewei;
            WHEN "001" =>
               weixuan <= "10";
               display <= dis_num_shiwei;
            WHEN OTHERS =>
         END CASE;
      END IF;
   END PROCESS;
 
--////////////////////////////////////////////按键加1模块,减1模块////////////////////////////////////////////// 
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (rst = '0') THEN
            dis_num_gewei <= "00000000";
            dis_num_shiwei <= "00000000";
         END IF;
--加法
         IF (key_out = '0' AND rst = '1') THEN
            IF (dis_num_gewei = "00001001") THEN--个位=9
               IF (dis_num_shiwei = "00001001") THEN--十位==9
                  dis_num_gewei <= "00000000";
                  dis_num_shiwei <= "00000000";
               ELSE
                  dis_num_shiwei <= dis_num_shiwei + "00000001";--十位
                  dis_num_gewei <= "00000000";
               END IF;
            ELSE
               dis_num_gewei <= dis_num_gewei + "00000001";--个位
               dis_num_shiwei <= dis_num_shiwei;
            END IF;
--减法
ELSIF (key_out_sub= '0' AND rst = '1') then
            IF (dis_num_gewei = "00000000") THEN--个位=0
               IF (dis_num_shiwei = "00000000") THEN--十位==0
                  dis_num_gewei <=  "00001001";
                  dis_num_shiwei <= "00001001";
               ELSE
                  dis_num_shiwei <= dis_num_shiwei - "00000001";--十位
                  dis_num_gewei <= "00001001";--十位==9
               END IF;
            ELSE
               dis_num_gewei <= dis_num_gewei - "00000001";--个位
               dis_num_shiwei <= dis_num_shiwei;
            END IF;
         END IF;
      END IF;
   END PROCESS;
--////////////////////////////////////////////按键消抖模块//////////////////////////////////////////////   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (rst = '0') THEN
            cnt <= "00000000000000000000000000000000";
         ELSE
            IF (cnt = "00000000000000000000000001111111") THEN--计时200mS
               cnt <= "00000000000000000000000000000000";
            ELSE
               cnt <= cnt + "00000000000000000000000000000001";
            END IF;
         END IF;
      END IF;
   END PROCESS;
   
   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (rst = '0') THEN
            sample_en <= '0';
         ELSE
            IF (cnt = "00000000000000000000000001111111") THEN--计时200mS
               sample_en <= '1';
            ELSE
               sample_en <= '0';
            END IF;
         END IF;
      END IF;
   END PROCESS;
   
   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         IF (rst = '0') THEN
            key_out <= '1';
key_out_sub<='1';
         ELSE
            IF (sample_en = '1') THEN--消抖后采样频率
               key_out <= key_in;--采样按键是否按下
key_out_sub<=key_sub;--采样按键是否按下
            ELSE
               key_out <= '1';
key_out_sub<='1';
            END IF;
         END IF;
      END IF;
   END PROCESS;

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1269

  • 2-24102Q92251345.doc
    下载

相关推荐