8位计数器EDA课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书

题目8个LED循环显示、计数器的设计

起止日期 2009.12.18-2010.1.4

电子设计自动化设计任务书

系(部):电子与通信工程系专业:电气工程及其自动化指导教师:

长沙学院课程设计鉴定表

目录

1、课程设计目的 (5)

2、课程设计题目 (5)

3、设计内容 (5)

3.1 设计思路 (5)

3.2 设计步骤 (5)

4、程序中各引脚的分配 (12)

5、程序结构框图 (13)

6、完整程序 (14)

7、课程设计总结 (21)

参考文献 (22)

一、课程设计目的

系统提供一个50MHZ的时钟,要求用VHDL语言设计一个8位计数器,同时有一

个8位led循环显示灯,当灯亮一次,数码管上就记一次数。通过做此计数器,知道分频的概念,并且知道如何分频,同时知道什么是数码管的动态显示,怎么做出数码管的动态显示。

二、课程设计题目

8个LED循环显示、计数器的设计。

三、设计内容

1、设计思路:

由于要设计一个8个led灯循环显示的计数器。则重要的设计部分在于让led灯循环显示,同时在显示的同时数码管的数加1;要让led灯亮的同时,数码管上面的数字加1,则需要在同一个脉冲下完成计数器加一,led等循环亮一位。

由于系统给定的时钟是50Mhz,显然数码管和led灯不能正常工作,这就涉及到要将50mhz频率分频,将频率变小,使计数器和led灯能正常工作;

Led灯设计思路:led灯要实现循环显示,即第一个灯亮之后,在出现一个上升沿脉冲后,第二个灯亮,第一个灯灭,来一个脉冲移动一个,并实现循环,为了实现循环,设计思路是讲来一次脉冲将最高位补到最低位,次最高位变成最高位。

数码管的设计思路:由于数码管要求是动态显示,显然还要分出一个置位工作扫描频率,由于人的视觉暂留,频率应该大于24hz,为了数码管显示效果,我分出了1000hz的频率来扫描8位数码管的工作。

分频的设计思路:分频是为了将50mhz的频率减小,即在50mhz(clk)出现n个上升沿之前另一个clk1不翻转,而在n个上升沿时翻转,在2n之前一直保持翻转后的状态,到2n时,计数器清零,同时再实现翻转,这样就能做出任意较小的频率实现设计。

2、设计步骤:

首先设计分频计数器,由于要有一个数码管置位工作扫描频率,还要有一个实现计数个和led灯循环显示的频率,即分频要分出两个不同的频率:

分频程序入下:

process(clk)

variable cout:integer:=0;

begin

IF clk'event and clk='1' then

cout:=cout+1;

if cout<=25000 then clk1<='0';

elsif cout<50000 then clk1<='1';

else cout:=0;

end if;

end if;

end process;

process(clk)

variable cout:integer:=0;

BEGIN

IF clk'event and clk='1' then

cout:=cout+1;

IF cout<=1250000 then clk2<='0';

elsif cout<25000000 then clk2<='1';

else cout:=0;

end if;

在进程中,clk为原始频率50mhz,以上两个进程是为了分出2hz频率和1000hz频率,其中count是进程中的一个变量,用来出现上升沿脉冲计数。其中clk1是分出来的1000hz;频率,clk2是分出来的2hz的led灯移动和数码管计数的频率;

在频率分出来后,就可以设计led灯的循环显示了,led灯循环显示的程序如下:

process(rst,start,clk2)

variable reg8:std_logic_vector(7 downto 0);

variable fg:integer:=1;

begin

if rst='1' then

reg8:=(others=>'1');

fg:=1;

elsif clk2'event and clk2='1' then

if start='1' then

if fg=1 then reg8:="11111110";

fg:=0;

else reg8:=reg8(6 downto 0)®8(7);

end if;

end if;

end if;

din8<=reg8;

end process;

程序中,rst是复位信号,功能是在在出现rst=1是,将led回到最初始状态,从程序中看是灯全灭掉,当rst=0是,回复循环显示;start是一个开始信号,只有start=1是,计数才开始工作;din8是一个八位的二进制数,在硬件上直接和8个led灯连接;fg是设计的一个标志位,目的是为了在开始来第一个脉冲时,使第一个led灯变亮,并将fg赋值为零,来第二个脉冲时,就开始循环;

当rst=0并且start=1时,Led的波形图如下:

从图中看出,在rst为0,start为1时,则led灯的显示就会出现出现循环显示,din由

11111110到01111111,之后又回到11111110开始循环;

在rst=1是,将会复位,即din=“11111111”,波形如下:

从图中明显能看出,在rst为1时,本该进行循环的程序在rst=1时,将使din全部置一了,即实现你rst的功能。

在做start的功能时,start的功能是,在rst=0,start=1时,将会做led灯的循环,在rst=0,start=1时,将使其暂停循环功能,并保持当前状态不变,波形图如下:

如图所示,在start=0时,din就停留在11110111,此二进制数正好十进制是239,一直保持此状态,在start=1是,则开始循环的工作。

做完以上程序的设计,即要实现数码管的动态显示,首先要做的就是数码管的动态显示,即要不间断的扫面8个数码管的工作位,扫描置位程序如下:

process(clk1)

begin

if clk1'event and clk1='1' then

if wei=7 then wei<="000";

else wei<=wei+1;

end if;

end if;

end process;

process(wei)

begin

case wei is

相关文档
最新文档