8位计数器EDA课程设计报告Word下载.docx
- 文档编号:22520352
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:30
- 大小:69.83KB
8位计数器EDA课程设计报告Word下载.docx
《8位计数器EDA课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《8位计数器EDA课程设计报告Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
教研室
意见
年月日
系(部)主管领导意见
长沙学院课程设计鉴定表
姓名
学号
专业
电气工程及其自动化
班级
设计题目
指导教师
瞿曌
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
答辩小组长签名:
日期:
教研室意见:
教研室主任签名:
系(部)意见:
系主任签名:
日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
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<
elsecout:
endif;
endprocess;
BEGIN
IFcout<
=1250000thenclk2<
25000000thenclk2<
在进程中,clk为原始频率50mhz,以上两个进程是为了分出2hz频率和1000hz频率,其中count是进程中的一个变量,用来出现上升沿脉冲计数。
其中clk1是分出来的1000hz;
频率,clk2是分出来的2hz的led灯移动和数码管计数的频率;
在频率分出来后,就可以设计led灯的循环显示了,led灯循环显示的程序如下:
process(rst,start,clk2)
variablereg8:
std_logic_vector(7downto0);
variablefg:
=1;
begin
ifrst='
reg8:
=(others=>
'
);
fg:
elsifclk2'
eventandclk2='
ifstart='
iffg=1thenreg8:
="
11111110"
fg:
elsereg8:
=reg8(6downto0)&
reg8(7);
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='
ifwei=7thenwei<
000"
elsewei<
=wei+1;
process(wei)
caseweiis
when"
=>
selout<
00000001"
001"
00000010"
010"
00000100"
011"
00001000"
100"
00010000"
101"
00100000"
110"
01000000"
111"
10000000"
whenothers=>
null;
endcase;
clk1是分出来的1khz频率,wei是设置的一个三位二进制数,从000-111,每一个状态都是置一个数码管工作,selout是一个7位二进制数,是个硬件上数码管的工作位一一对应。
在做好置位后,余下的就是数码管显示计数的问题了,数码管显示的是一个8位十进制的数,功能能实现进位,数码管计数的程序如下:
process(rst,start,clk2)
variableao0:
std_logic_vector(3downto0);
variableao1:
variableao2:
variableao3:
variableao4:
variableao5:
variableao6:
variableao7:
then
ao0:
ao1:
ao2:
ao3:
ao4:
ao5:
ao6:
ao7:
elsifclk2'
ifstart='
ifao0<
=9then
=ao0+1;
ifao0>
9then
ifao1=9andao2=9andao3=9andao4=9andao5=9andao6=9andao7=9then
elsenull;
9then
ifao1=9andao2=9andao3=9andao4=9andao5=9andao6=9then
=ao7+1;
ifao1=9andao2=9andao3=9andao4=9andao5=9then
=ao6+1;
ifao1=9andao2=9andao3=9andao4=9then
=ao5+1;
ifao1=9andao2=9andao3=9then
=ao4+1;
ifao1=9andao2=9then
=ao3+1;
ifao1=9then
=ao2+1;
elseao1:
=ao1+1;
co0<
=ao0;
co1<
=ao1;
co2<
=ao2;
co3<
=ao3;
co4<
=ao4;
co5<
=ao5;
co6<
=ao6;
co7<
=ao7;
程序中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)
ifwei="
caseco0is
0000"
led7s1<
1000000"
0001"
1111001"
0010"
0100100"
0011"
0110000"
0100"
0011001"
0101"
0010010"
0110"
0000010"
0111"
1111000"
1000"
0000000"
1001"
0010000"
null;
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:
led7s1:
outstd_logic_vector(6downto0));
end;
architectureoneofjishuis
signalclk1,clk2:
std_logic;
signalwei:
std_logic_vector(2downto0);
signalco0:
signalco1:
signalco2:
signalco3:
signalco4:
signalco5:
signalco6:
signalco7:
reg8:
iffg=1thenre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计数器 EDA 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)