预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

基于FPGA设计的数码管动态扫描显示摘要:利用FPGA输入时钟,分频出1Hz的计数器;利用FPGA输入时钟,分频出1Hz的计数器;触发信号控制计数器,实现增、减计数功能;计数器的计数范围为0~9999;实现四位数码管的动态扫面显示。关键词:FPGA、分频、记数、码管动态扫描设计原理为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形式代码,用来控制显示的字形,称为断码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。各位数码管的段线并联,断码的输出对各位数码管来说都是相同的。因此在同一时刻如果各位数码管的位选线都处于选通状态的话,4位数码显示管将显示相同的的字符,若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式,即在某一时刻,只让某一位的位选处于导通状态,而其他位的位选处于关闭状态。同时,断线上输出相应要显示字符的字形码。这样在同一时刻,只有选通的哪一位显示出字符,而其他各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要的字符。虽然这些字符是在不同时刻出现的,而且同一时刻,只显示一位,其他各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼印象就会是连续稳定的显示。总之,多个数码管动态扫描显示,是将所有数码管的相同段=端并联在一起,通过选通信号分时控制各个数码管的公共端,循环一次点亮多个数码管,并利用人眼的视觉暂留现象,只要扫描的频率大于50HZ,将看不到闪烁现象。4个数码管需要50*4=200HZ以上才能看到持续稳定点亮现象。2.软件设计思想设计利用FPGA内部电路,经过分频,产生1HZ的扫描信号作为时钟,驱动计数器工作。选用模值为10的计数器,通过一个3线—8线译码器,产生断码,依次控制4个LED的亮灭,使得某一时刻有且仅有一个LED点亮,同时产生对应的,将点亮的LED数码管赋值显示为相应的数字予以显示。由于扫描频率较高,位LED数码管序列将显示持续稳定的0—9数码。3.程序设计libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityled1isport(clk,clk1:instd_logic;vss:outstd_logic_vector(3downto0);q:outstd_logic_vector(6downto0);k:inbit);endentityled1;architecturert1ofled1issignals:std_logic_vector(1downto0);signala1:std_logic_vector(1downto0);signald1:std_logic_vector(3downto0);signalvs:std_logic_vector(3downto0);signalcout1,cout2,cout3,cout4:std_logic_vector(3downto0);beginp1:process(clk1)beginif(clk1'eventandclk1='1')thenif(s=11)thens<="00";elses<=s+1;endif;endif;endprocess;a1<=s;p2:process(a1)begincasea1iswhen"00"=>vs<="0001";when"01"=>vs<="0010";when"10"=>vs<="0100";when"11"=>vs<="1000";endcase;vss<=vs;endprocess;p3:process(clk,k)beginif(clk'eventandclk='1')thenif(k='1')thenif(cout1=1001)thencout1<="0000";if(cout2=1001)thencout2<="0000";if(cout3=1001)thencout3<="0000";if(cout4=1001)thencout4<="0000";elsecout4<=cout4+1;endif;elsecout3<=cout3+1;endif;elsecout2<=cout2+1;endif;elsecout1<=cout1+1;endif;elsif(k='0')thenif(cout1=0000)thencout1<="1001";if(cout2=0000)thencout2<="1001";if(cout3=0000)thencout3<="1001";if(cout4=0000)thencout4<="1001";elsecout4