8位计数器EDA课程设计报告.docx

上传人:b****6 文档编号:4687005 上传时间:2022-12-07 格式:DOCX 页数:25 大小:70.36KB
下载 相关 举报
8位计数器EDA课程设计报告.docx_第1页
第1页 / 共25页
8位计数器EDA课程设计报告.docx_第2页
第2页 / 共25页
8位计数器EDA课程设计报告.docx_第3页
第3页 / 共25页
8位计数器EDA课程设计报告.docx_第4页
第4页 / 共25页
8位计数器EDA课程设计报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

8位计数器EDA课程设计报告.docx

《8位计数器EDA课程设计报告.docx》由会员分享,可在线阅读,更多相关《8位计数器EDA课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。

8位计数器EDA课程设计报告.docx

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";

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

当前位置:首页 > 高中教育 > 理化生

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

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