最新8个led循环显示计数器.docx
- 文档编号:26205547
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:26
- 大小:226.05KB
最新8个led循环显示计数器.docx
《最新8个led循环显示计数器.docx》由会员分享,可在线阅读,更多相关《最新8个led循环显示计数器.docx(26页珍藏版)》请在冰豆网上搜索。
最新8个led循环显示计数器
长沙学院
课程设计说明书
题目8个LED循环显示、计数器的设计
系(部)电子与通信工程系
专业(班级)电气工程及其自动化2
姓名
学号2010
指导教师瞿瞾
起止日期
电子设计自动化设计任务书
系(部):
电子与通信工程系专业:
电气工程及其自动化指导教师:
瞿曌
课题名称
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天
编写设计说明书
教研室
意见
年月日
系(部)主管领导意见
年月日
长沙学院课程设计鉴定表
姓名
学号
专业
电气工程及其自动化
班级
2
设计题目
8个LED循环显示、计数器的设计
指导教师
瞿曌
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
评定等级:
答辩小组长签名:
日期:
教研室意见:
教研室主任签名:
日期:
系(部)意见:
系主任签名:
日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
目录
一、设计任务1
二、设计要求1
三、设计原理1
四、设计步骤1
1)设计分频计数器1
2)设计数控分频2
3)LED灯循环设计3
4)数码管扫频4
5)8个数码管计数4
6)引脚分配6
五、设计流图7
六、程序语言7
七、设计思考与总结10
八、参考文献11
一、设计任务
设计一个8个LED循环显示,同时数码管也显示LED亮的次数。
由于系统时钟为50MHz,直接当作时钟会由于计数速度太快而无法使发光二极管正常发光,因此首先需要对系统时钟进行分频,然后再以分频后的时钟作为计数器的计数时钟。
二、设计要求
要求设置3个按钮,一个供“开始”用,一个供“停止”用,一个供系统“复位”用;对8个LED循环显示的延续时间进行调整;调整步长自定。
系统提供50MHZ频率的时钟源。
完成该系统的硬件和软件的设计,并制作出实物装置,调试好后并能实际运用(指导教师提供制作所需的器件),最后就课程设计本身提交一篇课程设计说明书。
三、设计原理
首先,要设计一个8个led灯循环显示的计数器,重要的设计部分在于让led灯循环显示,同时在显示的同时数码管的数加1。
即为要让led灯亮的同时,数码管上面的数字加1。
因此,需要在同一个脉冲下完成计数器加1,led灯循环亮一位。
由于系统给定的时钟是50Mhz,而我们可视的频率为24hz内,很显然数码管和led灯不能正常工作,这就涉及到要将50mhz频率分频,将频率变小,使计数器和led灯能正常工作;
其次,led灯要实现循环显示,即第一个灯亮之后,在出现一个上升沿脉冲后,第二个灯亮,第一个灯灭,来一个脉冲移动一个,并实现循环,为了实现循环,设计思路是讲来一次脉冲将最高位补到最低位,次最高位变成最高位。
级设计一个移位寄存器,准确的说是循环移位寄存器。
再者,由于数码管要求是动态显示,显然还要分出一个置位工作扫描频率,由于人的视觉暂留,频率应该大于24hz,为了数码管显示效果,我分出了1000hz的频率来扫描8位数码管的工作。
最后,分频是为了将50mhz的频率减小,即在50mhz(clk)出现n个上升沿之前另一个clk1不翻转,而在n个上升沿时翻转,在2n之前一直保持翻转后的状态,到2n时,计数器清零,同时再实现翻转,这样就能做出任意较小的频率实现设计。
四、设计步骤
1)设计分频计数器
首先设计分频计数器,由于要有一个数码管置位工作扫描频率(1000HZ),还要有一个实现计数个和led灯循环显示的频率,即分频要分出两个不同的频率,其中(扫描分频)程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk0:
instd_logic;
y:
inoutstd_logic);
endfenpin;
architectureoneoffenpinis
signalf:
std_logic;
begin
p_reg:
process(clk0)---1Hz分频
variablecnt:
integerrange1to50000;
begin
ifclk0'eventandclk0='1'then
ifcnt=25000then
cnt:
=1;f<='1';
else
cnt:
=cnt+1;f<='0';
endif;endif;
endprocessp_reg;
p_div:
process(f)
variablecnt2:
std_logic;
begin
iff'eventandf='1'then
cnt2:
=notcnt2;
ifcnt2='1'then
y<='1';
else
y<='0';endif;
endif;
endprocessp_div;
end;
在进程中,clk0为原始频率50mhz,进程P_REG为分频,进程P_DIV为整形,最后通过输出Y端口,输出为1000HZ;
仿真波形如图示
2)设计数控分频
下面即为计数频率(10HZ),CLK即为上面的输出Y频率1000HZ,而CLK经过数控分频后即为10HZ的频
率,CLK1就可作为LED灯的循环显示频率。
(数控分频)程序如下:
H1:
PROCESS(CLK,EN)
BEGIN
IFEN='1'ANDZT='0'THEN
ifCLK'eventandCLK='1'then
IFF="11111111"THENF<=DIN8;D<='1';
ELSEF<=F+1;D<='0';
ENDIF;ENDIF;endif;
ENDPROCESSH1;
H2:
PROCESS(D)
VARIABLECL:
STD_LOGIC;
BEGIN
IFD'EVENTANDD='1'THEN
CL:
=NOTCL;
IFCL='1'THENCLK1<='1';
ELSECLK1<='0';
ENDIF;ENDIF;
ENDPROCESSH2;
仿真波形图如下
通过DIN8置数,来再次对1000HZ的频率进行任意分频,CLK为频率,CLK1频率为数控分频之后的10HZ的时钟。
3)LED灯循环设计
接下来就是,在频率分出来后,设计led灯的循环显示了,碍于我们肉眼的可视能力,我只用频率小一些的,led灯循环显示的程序如下:
JA:
PROCESS(CLK1,RES,EN)
begin
IFRES='1'THENA<='1';LEDD<=(OTHERS=>'1');
ELSifCLK1'eventandCLK1='1'then
IFEN='1'ANDZT='0'THEN
IFA='1'THENA<='0';LEDD<="11111110";
ELSELEDD(0)<=LEDD(7);LEDD(7DOWNTO1)<=LEDD(6DOWNTO0);
endif;
ENDIF;
ENDIF;
REG8(7DOWNTO0)<=LEDD(7DOWNTO0);
endprocessJA;
仿真波形如下示
通过波形可以很清楚的看到,len灯移动清楚明了,接下来就是其他的了。
4)数码管扫频
JB:
process(clk)
begin
ifclk'eventandclk='1'then
ifwei=7thenwei<="000";
elsewei<=wei+1;
endif;endif;
endprocess;
JC:
process(wei)
begin
caseweiis
WHEN"000"=>LED8<="00000001";
WHEN"001"=>LED8<="00000010";
WHEN"010"=>LED8<="00000100";
WHEN"011"=>LED8<="00001000";
WHEN"100"=>LED8<="00010000";
WHEN"101"=>LED8<="00100000";
WHEN"110"=>LED8<="01000000";
WHEN"111"=>LED8<="10000000";
whenothers=>null;
ENDCASE;
ENDPROCESSJC;
仿真波形如下
在理论上,频率足够大时,实现动态扫频数码管,在波形中还是能勉强看得见的,虽然不是很好,当然在后面的整体波形中,能很好的看出来。
5)8个数码管计数
JD:
PROCESS(RES,EN,CLK1)
variableaa0,aa1,aa2,aa3:
std_logic_vector(3downto0);
variableaa4,aa5,aa6,aa7:
std_logic_vector(3downto0);
BEGIN
IFRES='1'THEN
aa0:
=(OTHERS=>'0');aa1:
=(OTHERS=>'0');aa2:
=(OTHERS=>'0');aa3:
=(OTHERS=>'0');
aa4:
=(OTHERS=>'0');aa5:
=(OTHERS=>'0');aa6:
=(OTHERS=>'0');aa7:
=(OTHERS=>'0');
ELSifCLK1'eventandCLK1='1'then
IFEN='1'ANDZT='0'THEN
ifaa0<=9then
aa0:
=aa0+1;endif;
ifaa0>9then
ifaa1=9andaa2=9andaa3=9andaa4=9andaa5=9andaa6=9andaa7=9then
aa0:
=(others=>'0');aa1:
=(others=>'0');
aa2:
=(others=>'0');aa3:
=(others=>'0');
aa4:
=(others=>'0');aa5:
=(others=>'0');aa6:
=(others=>'0');aa7:
=(others=>'0');
elsenull;endif;
ifaa0>9then
ifaa1=9andaa2=9andaa3=9andaa4=9andaa5=9andaa6=9then
aa7:
=aa7+1;
aa0:
=(others=>'0');aa1:
=(others=>'0');
aa2:
=(others=>'0');aa3:
=(others=>'0');
aa4:
=(others=>'0');aa5:
=(others=>'0');
aa6:
=(others=>'0');
elsenull;endif;endif;
ifaa0>9then
ifaa1=9andaa2=9andaa3=9andaa4=9andaa5=9then
aa6:
=aa6+1;aa0:
=(others=>'0');
aa1:
=(others=>'0');aa2:
=(others=>'0');
aa3:
=(others=>'0');aa4:
=(others=>'0');
aa5:
=(others=>'0');elsenull;
endif;endif;
ifaa0>9then
ifaa1=9andaa2=9andaa3=9andaa4=9then
aa5:
=aa5+1;aa0:
=(others=>'0');
aa1:
=(others=>'0');aa2:
=(others=>'0');
aa3:
=(others=>'0');aa4:
=(others=>'0');
elsenull;endif;endif;
ifaa0>9then
ifaa1=9andaa2=9andaa3=9then
aa4:
=aa4+1;aa0:
=(others=>'0');
aa1:
=(others=>'0');aa2:
=(others=>'0');
aa3:
=(others=>'0');elsenull;
endif;endif;
ifaa0>9then
ifaa1=9andaa2=9then
aa3:
=aa3+1;aa0:
=(others=>'0');
aa1:
=(others=>'0');aa2:
=(others=>'0');
elsenull;endif;endif;
ifaa0>9then
ifaa1=9then
aa2:
=aa2+1;
aa0:
=(others=>'0');aa1:
=(others=>'0');
elseaa1:
=aa1+1;aa0:
=(others=>'0');
endif;endif;endif;endif;endif;
cc0<=aa0;cc1<=aa1;cc2<=aa2;cc3<=aa3;
cc4<=aa4;cc5<=aa5;cc6<=aa6;cc7<=aa7;
endprocessJD;
由于有8个数码管,程序太长,再就是每个数码管的显示都一样,就不必要逐一赘述了,就列一个好了。
就列第一个数码管的显示情况,至于剩下的7个数码管只是满足条件不一样而已,这个在后面总程序中在展示。
1号数码管显示部分例程
ifwei="000"then
casecc0is
when"0000"=>leds<="1000000";
when"0001"=>leds<="1111001";
when"0010"=>leds<="0100100";
when"0011"=>leds<="0110000";
when"0100"=>leds<="0011001";
when"0101"=>leds<="0010010";
when"0110"=>leds<="0000010";
when"0111"=>leds<="1111000";
when"1000"=>leds<="0000000";
when"1001"=>leds<="0010000";
whenothers=>null;
endcase;endif;
仿真波形
在图中leds即为数码管的段,有图可以很好的显示,在不同数码管上显示数值。
当然,此图是为了操作简便,只显示了部分数值结果。
下面呢,进行引脚分配,引脚很多啊,分配起来很麻烦,繁琐。
一定的细心。
6)引脚分配
在上图中,可见引脚之多,共25各引脚,有一个暂停键ZT没能显示出来,为了美观,那一个引脚就不在截图了,再次说明就是了。
五、设计流图
10hz为数码管计数
10hz时钟为led灯计数时钟
1000hz时钟分频为10hz时钟
50Mhz时钟分频为1000hz
1000hz时钟对数码管扫频
在实验板上进行验证,让老师打分
为程序分配端口引脚
八个数码管的数值显示情况
10hz下数码管显示数值条件
六、程序语言
libraryieee;
useIEEE.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitykcsis
port(CLKD:
instd_logic;
RES:
INSTD_LOGIC;--复位端
EN:
INSTD_LOGIC;--使能端
DIN8:
INSTD_LOGIC_VECTOR(7DOWNTO0);--置数任意分频
REG8:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--发光二极管
led8:
outstd_logic_vector(7downto0);--数码管选择
leds:
outstd_logic_vector(6downto0));--数码段选择
endkcs;
architectureoneofkcsis
componentfenpin
port(CLKK:
instd_logic;--声明500hz信号
Y:
outstd_logic);
endcomponent;
signalwei:
std_logic_vector(2downto0);
signalcc0,cc1,cc2,cc3,cc4:
std_logic_vector(3downto0);
signalcc5,cc6,cc7:
std_logic_vector(3downto0);
SIGNALF:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALLEDD:
STD_LOGIC_VECTOR(7DOWNTO0);
signalCLK1,D,A,CLK:
std_logic;
begin
U1:
fenpinportmap(CLKK=>CLKD,Y=>CLK);
H1:
PROCESS(CLK,EN)
BEGIN
IFEN='1'ANDZT='0'THEN
ifCLK'eventandCLK='1'then
IFF="11111111"THENF<=DIN8;D<='1';
ELSEF<=F+1;D<='0';ENDIF;ENDIF;endif;
ENDPROCESSH1;
H2:
PROCESS(D)
VARIABLECL:
STD_LOGIC;
BEGIN
IFD'EVENTANDD='1'THENCL:
=NOTCL;
IFCL='1'THENCLK1<='1';
ELSECLK1<='0';ENDIF;ENDIF;
ENDPROCESSH2;
JA:
PROCESS(CLK1,RES,EN)
begin
IFRES='1'THENA<='1';LEDD<=(OTHERS=>'1');
ELSifCLK1'eventandCLK1='1'then
IFEN='1'THEN
IFA='1'THENA<='0';LEDD<="11111110";
ELSELEDD(0)<=LEDD(7);
LEDD(7DOWNTO1)<=LEDD(6DOWNTO0);
endif;ENDIF;ENDIF;
REG8(7DOWNTO0)<=LEDD(7DOWNTO0);
endprocessJA;
JB:
process(clk)--数码管移动
begin
ifclk'eventandclk='1'then
ifwei=7thenwei<="000";
elsewei<=wei+1;endif;endif;
endprocess;
JC:
process(wei)
begin
caseweiis
WHEN"000"=>LED8<="00000001";
WHEN"001"=>LED8<="00000010";
WHEN"010"=>LED8<="00000100";
WHEN"011"=>LED8<="00001000";
WHEN"100"=>LED8<="00010000";
WHEN"101"=>LED8<="00100000";
WHEN"110"=>LED8<="01000000";
WHEN"111"=>LED8<="10000000";
whenothers=>null;
ENDCASE;
ENDPROCESSJC;
JD:
PROCESS(RES,EN,CLK1)
Variableaa0,aa1,aa2,aa3:
std_logic_vector(3downto0);
variableaa4,aa5,aa6,aa7:
std_logic_vector(3downto0);
BEGIN
IFRES='1'THEN
aa0:
=(OTHERS=>'0');aa1:
=(OTHERS=>'0');aa2:
=(OTHERS=>'0');aa3:
=(OTHERS=>'0');
aa4:
=(OTHERS=>'0');aa5:
=(OTHERS=>'0');aa6:
=(OTHERS=>'0');aa7:
=(OTHERS=>'0');
ELSifCLK1'eventandCLK1='1'then
IFEN='1'ANDZT='0'THEN
ifaa0<=9then
aa0:
=aa0+1;endif;
ifaa0>9then
ifaa1=9andaa2=9andaa3=9andaa4=9andaa5=9andaa6=9andaa7=9then
aa0:
=(others=>'0');aa1:
=(others=>'0');aa2:
=(others=>'0');aa3:
=(others=>'0');
aa4:
=(others=>'0');aa5:
=(others=>'0');aa6:
=(others=>'0');aa7:
=(others=>'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 led 循环 显示 计数器