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

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

15小时前
227
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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
    下载

相关推荐