设计题目:
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;
此段代码是本实验中最主要的代码,在编译软件中可以直接编译运行。