最新8个led循环显示计数器新.docx

上传人:b****8 文档编号:8838728 上传时间:2023-02-02 格式:DOCX 页数:22 大小:223.44KB
下载 相关 举报
最新8个led循环显示计数器新.docx_第1页
第1页 / 共22页
最新8个led循环显示计数器新.docx_第2页
第2页 / 共22页
最新8个led循环显示计数器新.docx_第3页
第3页 / 共22页
最新8个led循环显示计数器新.docx_第4页
第4页 / 共22页
最新8个led循环显示计数器新.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

最新8个led循环显示计数器新.docx

《最新8个led循环显示计数器新.docx》由会员分享,可在线阅读,更多相关《最新8个led循环显示计数器新.docx(22页珍藏版)》请在冰豆网上搜索。

最新8个led循环显示计数器新.docx

最新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循环显示、计数器的设计

指导教师

瞿曌

指导教师意见:

 

评定等级:

教师签名:

日期:

答辩小组意见:

 

评定等级:

     答辩小组长签名:

     日期:

    

教研室意见:

 

教研室主任签名:

日期:

 

系(部)意见:

 

系主任签名:

        日期:

     

说明

课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;

一、设计任务

设计一个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=>'0');

elsenull;endif;

ifaa0>9then

ifaa1=9andaa2=9andaa3=9andaa4=9andaa5=9andaa6=9then

aa7:

=aa7+1;aa0:

=(others=>'0');

aa1:

=(others=>'0');aa2:

=(oth

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1