FPGA VHDL 语言设计一个十进制计数器,具有显示位置随计数时钟在八个数码管中左右滚动的功能。每计数到 9 时,蜂鸣器响一声;每次滚动切换方向时,蜂鸣器响一声

设计题目:

FPGA VHDL 语言设计一个十进制计数器,具有显示位置随计数时钟在八个数码管中左右滚动的功能。每计数到 9 时,蜂鸣器响一声;每次滚动切换方向时,蜂鸣器响一声(出现任何停顿、跳 跃等现象不给分)

题目要求在数码管上显示从 0 至 9 十个数字,并且需要随着 位置的变化数码管位置也相应变化,在产生进位以及数码管滚动 到两边,切换滚动方向时均须产生报警信号。

A.数码管上对于数字的显示 8 段数码管需要由八位的二进制数给予高低电平控制其显示的 数字,在通过三位的二进制数依次递增,并达到阈值条件时依次 递减以实现滚动显示以及切换方向。

B.进位报警和滚动切换报警 进位报警要求在计数器到达 9 时产生高电平的报警信号,只 需要设置判断语句计数器是否到达 9 即可。对于滚动切换需要判 断数码管的位置,即是否到达最右边或者最右边的数码管,如果 到达就产生报警信号。

实验中主要对于八段数码管的显示,通过片位选使数码管点亮,在缺少开发板的情况下我们选择波形仿真图来检验实验结果的正确性。

主要代码以及操作过程如下:(下面代码是实验中最主要的代码,图文解释步骤以及源代码可以在我主页下载):

Library IEEE;
Use IEEE.STD_LOGIC_1164.ALL;
Use IEEE.STD_LOGIC_UNSIGNED.ALL;
Entity bylsmg is
port (
      CLK:in std_logic;
      DX :out std_logic_vector(7 downto 0);-----数码管片选信号
      WX :out std_logic_vector(2 downto 0);-----数码管位选信号
      WARJ:out std_logic;-----------------进位报警信号
      WARG:out std_logic);----------------滚动切换报警信号
END entity bylsmg;
Architecture BEHAV of bylsmg is
Begin
process (clk) is
variable NUM1:integer range 0 to 9;--定义变量
Begin 
if (clk'event and clk='1') then
NUM1:=NUM1+1;
if NUM1=9 then WARJ<='1';-----------------当计数到9时报警
else WARJ<='0';
end if;
if NUM1>9 then NUM1:=0;
End if;
End if;
case NUM1 is---------数码管数字的显示
	when 0 =>DX<="11111100";
	when 1 =>DX<="01100000";
	when 2 =>DX<="11011010";
	when 3 =>DX<="11110010";
	when 4 =>DX<="01100110";
	when 5 =>DX<="10110110";
	when 6 =>DX<="10111110";
	when 7 =>DX<="11100000";
	when 8 =>DX<="11111110";
	when 9 =>DX<="11110110";
when others =>NULL;-------------当为其他字符时不显示
End case;
End process;

Process (clk) is
variable NUM2:integer range 0 to 13;----------定义数码管滚动的个数
Begin
if (clk'event and clk='1')
then NUM2:=NUM2+1;
if (NUM2>13) then NUM2:=0;
End if;
End if;
Case NUM2 is----------------------------------十三个信号的选择
	when 0=>WX<="111";
	when 1=>WX<="110";
	when 2=>WX<="101";
	when 3=>WX<="100";
	when 4=>WX<="011";
	when 5=>WX<="010";
	when 6=>WX<="001";
	when 7=>WX<="000";
	when 8=>WX<="001";
	when 9=>WX<="010";
	when 10=>WX<="011";
	when 11=>WX<="100";
	when 12=>WX<="101";
	when 13=>WX<="110";
	when others =>NULL;
	End case;
if NUM2=  0 OR NUM2 =7 then WARG<='1';-------------当触碰到最左边或者最右边的数码管时产生高电平的报警信号
else WARG<='0';
end if;

End process;
End architecture BEHAV;

此段代码是本实验中最主要的代码,在编译软件中可以直接编译运行。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

5.23.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值