8位计数器EDA课程设计报告.docx
- 文档编号:4687005
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:25
- 大小:70.36KB
8位计数器EDA课程设计报告.docx
《8位计数器EDA课程设计报告.docx》由会员分享,可在线阅读,更多相关《8位计数器EDA课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
8位计数器EDA课程设计报告
课程设计说明书
题目8个LED循环显示、计数器的设计
起止日期2009.12.18-2010.1.4
电子设计自动化设计任务书
系(部):
电子与通信工程系专业:
电气工程及其自动化指导教师:
课题名称
8个LED循环显示、计数器的设计
设计内容及要求
试设计一个8个LED循环显示,同时数码管也显示LED亮的次数。
由于系统时钟为50MHz,直接当作时钟会由于计数速度太快而无法使发光二极管正常发光,因此首先需要对系统时钟进行分频,然后再以分频后的时钟作为计数器的计数时钟。
要求设置3个按钮,一个供“开始”用,一个供“停止”用,一个供系统“复位”用;对8个LED循环显示的延续时间进行调整;调整步长自定。
系统提供50MHZ频率的时钟源。
完成该系统的硬件和软件的设计,并制作出实物装置,调试好后并能实际运用(指导教师提供制作所需的器件),最后就课程设计本身提交一篇课程设计说明书。
设计工作量
1、VHDL语言程序设计;
2、波形仿真;
3、在实验装置上进行硬件测试,并进行演示;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、硬件测试、调试过程,参考文献、设计总结等。
进度安排
起止日期(或时间量)
设计内容(或预期目标)
备注
第1天
课题介绍,答疑,收集材料
第2天
设计方案论证
第3天
进一步讨论方案,对设计方案进行必要的修正,方案确定后开始进行VHDL语言程序设计
第4天
设计VHDL语言程序
第5~9天
在实验装置上进行硬件测试,对VHDL语言程序进行必要的修正,并进行演示
第10天
编写设计说明书
教研室
意见
年月日
系(部)主管领导意见
年月日
长沙学院课程设计鉴定表
姓名
学号
专业
电气工程及其自动化
班级
设计题目
8个LED循环显示、计数器的设计
指导教师
瞿曌
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
评定等级:
答辩小组长签名:
日期:
教研室意见:
教研室主任签名:
日期:
系(部)意见:
系主任签名:
日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
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)
variablecout:
integer:
=0;
begin
IFclk'eventandclk='1'then
cout:
=cout+1;
ifcout<=25000thenclk1<='0';
elsifcout<50000thenclk1<='1';
elsecout:
=0;
endif;
endif;
endprocess;
process(clk)
variablecout:
integer:
=0;
BEGIN
IFclk'eventandclk='1'then
cout:
=cout+1;
IFcout<=1250000thenclk2<='0';
elsifcout<25000000thenclk2<='1';
elsecout:
=0;
endif;
在进程中,clk为原始频率50mhz,以上两个进程是为了分出2hz频率和1000hz频率,其中count是进程中的一个变量,用来出现上升沿脉冲计数。
其中clk1是分出来的1000hz;频率,clk2是分出来的2hz的led灯移动和数码管计数的频率;
在频率分出来后,就可以设计led灯的循环显示了,led灯循环显示的程序如下:
process(rst,start,clk2)
variablereg8:
std_logic_vector(7downto0);
variablefg:
integer:
=1;
begin
ifrst='1'then
reg8:
=(others=>'1');
fg:
=1;
elsifclk2'eventandclk2='1'then
ifstart='1'then
iffg=1thenreg8:
="11111110";
fg:
=0;
elsereg8:
=reg8(6downto0)®8(7);
endif;
endif;
endif;
din8<=reg8;
endprocess;
程序中,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
ifclk1'eventandclk1='1'then
ifwei=7thenwei<="000";
elsewei<=wei+1;
endif;
endif;
endprocess;
process(wei)
begin
caseweiis
when"000"=>selout<="00000001";
when"001"=>selout<="00000010";
when"010"=>selout<="00000100";
when"011"=>selout<="00001000";
when"100"=>selout<="00010000";
when"101"=>selout<="00100000";
when"110"=>selout<="01000000";
when"111"=>selout<="10000000";
whenothers=>null;
endcase;
endprocess;
clk1是分出来的1khz频率,wei是设置的一个三位二进制数,从000-111,每一个状态都是置一个数码管工作,selout是一个7位二进制数,是个硬件上数码管的工作位一一对应。
在做好置位后,余下的就是数码管显示计数的问题了,数码管显示的是一个8位十进制的数,功能能实现进位,数码管计数的程序如下:
process(rst,start,clk2)
variableao0:
std_logic_vector(3downto0);
variableao1:
std_logic_vector(3downto0);
variableao2:
std_logic_vector(3downto0);
variableao3:
std_logic_vector(3downto0);
variableao4:
std_logic_vector(3downto0);
variableao5:
std_logic_vector(3downto0);
variableao6:
std_logic_vector(3downto0);
variableao7:
std_logic_vector(3downto0);
begin
ifrst='1'then
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
ao3:
=(others=>'0');
ao4:
=(others=>'0');
ao5:
=(others=>'0');
ao6:
=(others=>'0');
ao7:
=(others=>'0');
elsifclk2'eventandclk2='1'then
ifstart='1'then
ifao0<=9then
ao0:
=ao0+1;
endif;
ifao0>9then
ifao1=9andao2=9andao3=9andao4=9andao5=9andao6=9andao7=9then
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
ao3:
=(others=>'0');
ao4:
=(others=>'0');
ao5:
=(others=>'0');
ao6:
=(others=>'0');
ao7:
=(others=>'0');
elsenull;
endif;
ifao0>9then
ifao1=9andao2=9andao3=9andao4=9andao5=9andao6=9then
ao7:
=ao7+1;
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
ao3:
=(others=>'0');
ao4:
=(others=>'0');
ao5:
=(others=>'0');
ao6:
=(others=>'0');
elsenull;
endif;
endif;
ifao0>9then
ifao1=9andao2=9andao3=9andao4=9andao5=9then
ao6:
=ao6+1;
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
ao3:
=(others=>'0');
ao4:
=(others=>'0');
ao5:
=(others=>'0');
elsenull;
endif;
endif;
ifao0>9then
ifao1=9andao2=9andao3=9andao4=9then
ao5:
=ao5+1;
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
ao3:
=(others=>'0');
ao4:
=(others=>'0');
elsenull;
endif;
endif;
ifao0>9then
ifao1=9andao2=9andao3=9then
ao4:
=ao4+1;
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
ao3:
=(others=>'0');
elsenull;
endif;
endif;
ifao0>9then
ifao1=9andao2=9then
ao3:
=ao3+1;
ao0:
=(others=>'0');
ao1:
=(others=>'0');
ao2:
=(others=>'0');
elsenull;
endif;
endif;
ifao0>9then
ifao1=9then
ao2:
=ao2+1;
ao0:
=(others=>'0');
ao1:
=(others=>'0');
elseao1:
=ao1+1;
ao0:
=(others=>'0');
endif;
endif;
endif;
endif;
endif;
co0<=ao0;
co1<=ao1;
co2<=ao2;
co3<=ao3;
co4<=ao4;
co5<=ao5;
co6<=ao6;
co7<=ao7;
endprocess;
程序中co0-co7是对应数码管上从低位到高位的十进制数,ao0-ao7是程序中定义的中间变量;程序中的rst是复位信号,start是开始信号,在此的rst和start和led循环显示中的rst和start是同一信号,这样才能让led灯和数码管同步工作;
计数器的波形显示如下:
由上图看出,在start=1并且rst=0时,在出现上升沿时,co0加1,当co0到9时,在下一个上升沿将产生进位,使co1变成1,co0变成0。
在rst=1时,将产生复位,致使co0-co7全部置0,由波形可得:
显然,当产生复位信号时,全部置零了,说明程序的设计能达到预先设计的效果。
在rst=0,start=0时,根据设计,应该是数码管的数应该保持现有的状态不变,并且在start=1后,应该能继续计数,实际波形如下:
由图可以得出,在rst=0并且start=0是,co1=5,co0=3,之后,在start=1时,继续开始了计数,说明实现设计的能满足设计要求。
最后一部分就是做出数码管显示十进制数,由于每个数码管的显示都基本一样,就只有选择数码管的条件不同,在此只写出一个数码管的显示程序:
process(wei,co0,co1,co2,co3,co4,co5,co6,co7)
begin
ifwei="000"then
caseco0is
when"0000"=>led7s1<="1000000";
when"0001"=>led7s1<="1111001";
when"0010"=>led7s1<="0100100";
when"0011"=>led7s1<="0110000";
when"0100"=>led7s1<="0011001";
when"0101"=>led7s1<="0010010";
when"0110"=>led7s1<="0000010";
when"0111"=>led7s1<="1111000";
when"1000"=>led7s1<="0000000";
when"1001"=>led7s1<="0010000";
whenothers=>null;
endcase;
endif;
endprocess;
在wei=“000”时,将执行由co0的状态来显示个位上的数,co0-co9对应显示十进制数上的0-9;led7s1是一个七位二进制数,从低位到高位分别对应数码管的a,b,c,d,e,f,g管脚;十位,千位,万位等等的显示皆如此。
四、程序中各引脚的分配如下:
引脚名称
引脚编号
连接网络
引脚名称
引脚编号
连接网络
clk
J3
50MHZ
Selout[2]
G2
A6
start
M3
M1
Selout[3]
F1
A5
rst
T10
KEY
Selout[4]
F2
A4
Din[0]
R10
LED1
Selout[5]
E2
A3
Din[1]
N15
LED2
Selout[6]
G3
A2
Din[2]
U11
LED3
Selout[7]
G4
A1
Din[3]
R11
LED4
Led7s1[0]
L3
E_7SEG-A
Din[4]
U12
LED5
Led7s1[1]
L4
E_7SEG-B
Din[5]
R12
LED6
Led7s1[2]
H3
E_7SEG-C
Din[6]
U13
LED7
Led7s1[3]
H4
E_7SEG-D
Din[7]
R13
LED8
Led7s1[4]
H1
E_7SEG-E
Selout[0]
H2
A8
Led7s1[5]
L2
E_7SEG-F
Selout[1]
G1
A7
Led7s16]
K4
E_7SEG-G
五、程序结构框图:
完整的程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityjishuis
port(clk,rst,start:
instd_logic;
din8:
outstd_logic_vector(7downto0);
selout:
outstd_logic_vector(7downto0);
led7s1:
outstd_logic_vector(6downto0));
end;
architectureoneofjishuis
signalclk1,clk2:
std_logic;
signalwei:
std_logic_vector(2downto0);
signalco0:
std_logic_vector(3downto0);
signalco1:
std_logic_vector(3downto0);
signalco2:
std_logic_vector(3downto0);
signalco3:
std_logic_vector(3downto0);
signalco4:
std_logic_vector(3downto0);
signalco5:
std_logic_vector(3downto0);
signalco6:
std_logic_vector(3downto0);
signalco7:
std_logic_vector(3downto0);
begin
process(clk)
variablecout:
integer:
=0;
begin
IFclk'eventandclk='1'then
cout:
=cout+1;
ifcout<=25000thenclk1<='0';
elsifcout<50000thenclk1<='1';
elsecout:
=0;
endif;
endif;
endprocess;
process(clk)
variablecout:
integer:
=0;
BEGIN
IFclk'eventandclk='1'then
cout:
=cout+1;
IFcout<=1250000thenclk2<='0';
elsifcout<25000000thenclk2<='1';
elsecout:
=0;
endif;
endif;
endprocess;
process(rst,start,clk2)
variablereg8:
std_logic_vector(7downto0);
variablefg:
integer:
=1;
begin
ifrst='1'then
reg8:
=(others=>'1');
fg:
=1;
elsifclk2'eventandclk2='1'then
ifstart='1'then
iffg=1thenreg8:
="11111110";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计数器 EDA 课程设计 报告