8位计数器EDA课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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