VHDL毕业或课程设计报告.docx

上传人:b****8 文档编号:9134715 上传时间:2023-05-17 格式:DOCX 页数:23 大小:92.90KB
下载 相关 举报
VHDL毕业或课程设计报告.docx_第1页
第1页 / 共23页
VHDL毕业或课程设计报告.docx_第2页
第2页 / 共23页
VHDL毕业或课程设计报告.docx_第3页
第3页 / 共23页
VHDL毕业或课程设计报告.docx_第4页
第4页 / 共23页
VHDL毕业或课程设计报告.docx_第5页
第5页 / 共23页
VHDL毕业或课程设计报告.docx_第6页
第6页 / 共23页
VHDL毕业或课程设计报告.docx_第7页
第7页 / 共23页
VHDL毕业或课程设计报告.docx_第8页
第8页 / 共23页
VHDL毕业或课程设计报告.docx_第9页
第9页 / 共23页
VHDL毕业或课程设计报告.docx_第10页
第10页 / 共23页
VHDL毕业或课程设计报告.docx_第11页
第11页 / 共23页
VHDL毕业或课程设计报告.docx_第12页
第12页 / 共23页
VHDL毕业或课程设计报告.docx_第13页
第13页 / 共23页
VHDL毕业或课程设计报告.docx_第14页
第14页 / 共23页
VHDL毕业或课程设计报告.docx_第15页
第15页 / 共23页
VHDL毕业或课程设计报告.docx_第16页
第16页 / 共23页
VHDL毕业或课程设计报告.docx_第17页
第17页 / 共23页
VHDL毕业或课程设计报告.docx_第18页
第18页 / 共23页
VHDL毕业或课程设计报告.docx_第19页
第19页 / 共23页
VHDL毕业或课程设计报告.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VHDL毕业或课程设计报告.docx

《VHDL毕业或课程设计报告.docx》由会员分享,可在线阅读,更多相关《VHDL毕业或课程设计报告.docx(23页珍藏版)》请在冰点文库上搜索。

VHDL毕业或课程设计报告.docx

VHDL毕业或课程设计报告

《VHDL语言》课程设计报告第1章微波炉控制器的设计概述

1.1设计简介

状态控制器KZQ的功能是控制微波炉工作过程中的状态转换,并发出有关控制信息;输入信号为CLK、TEST、START、SET_T、RESET和DONE,输出信号为LD_DONE、LD_CLK、LD_8888和COOk信号。

KZQ根据输入信号和自身当时所处的状态完成状态的转换和输出相应的控制信号:

LD_DONE指示ZZQ装入烹调完毕的状态信息“donE”的显示驱动信息数据;LD_CLK指示ZZQ装入设置的烹饪时间数据;LD_8888指示ZZQ装入用于测试的数据“8888”以显示驱动信息数据;COOk指示烹饪正在进行之中,并提示计时器进行减计数。

数据装载器ZZQ的功能是根据KZQ发出的控制信号选择定时时间、测试数据或烹调完成信息的装入。

当LD_DONE为高电平时,输出烹调完毕的状态信息数据;LD_CLK为高电平时,输出设置的烹饪时间数据:

LD_8888为高电平时,输出测试数据。

输出信号LOAD用于提示JSQ将处于数据装入状态。

计时器JSQ的功能是负责烹调过程中的时间递减计数,并提供烹调完成时的状态信号供KZQ产生烹调完成信号。

LOAD为高电平时完成装入功能,COOk为高电平时执行逆计数功能。

输出DONE指示烹调完成。

MINH、MNL、SEC_H和SEC_L为完成烹调所剩的时间以及测试状态信息“8888”、烹调完毕的状态信息“donE”的BCD码信息。

显示译码器YMQ47的功能就是负责将各种显示信息的BCD转换成七段数码管显示的驱动信息编码。

需要译码的信息有:

数字0~9,字母d、o、n、E。

1.2设计要求

微波炉控制器WBLKZQ的具体功能要求如下:

上电后系统首先处于一种复位状态。

在工作时首先按SET_T键设置烹调时间,此时系统读入DATA0的数据作为烹调所需时间,然后系统自动回到复位状态,同时4个七段数码管显示时间信息(假设系统最长的烹调时间为59分59秒)。

再按START键后系统进入烹调状态,COOk信号开始为高电平,此时4个七段数码管每隔一秒钟变化一次,用以刷新还剩多少时间结束烹调。

烹调结束后,COOk信号变为低电平,同时4个七段数码管组合在一起显示“donE”的信息,然后系统回到复位状态。

系统可以通过按RESET键随时回到复位状态。

在复位状态下,按TEST键在4个数码管上会显示“8888”的信息,它可以测试4个七段数码管工作是否正常。

 

第2章微波炉控制器的设计思想

2.1设计思路

2.1.1设计步骤

(1)复位开关;

(2)启动开关;

(3)烹调时间设置;

(4)烹调时间显示;

(5)七段码测试;

(6)启动输出;

(7)按TEST键可以测试七段码管,显示为“8888”;

(8)设定时间后,按启动键开始烹调,同时七段码显示剩余时间,时间为0时,显示烹调完成信息“CDEF”.

2.1.2设计模块

A.先有一个大概的模块话设计,就如下图:

预设初值倒计时减计数输出数据

B:

再在上面大模块的基础上进行改进,增加复位端和测试端

复位输出数据

预设倒计时实现闪烁

初值减计数

测试

2.2设计过程

1、刚开始设计是先完成了FENPIN模块的设计,因为这个模块比较简单。

2、然后是对设初值大模块的设计,在这一部分的设计遇到两方案:

(1)设计四个按钮的初始话模块,四个按钮分别控制秒,十秒,分,十分4个数值的初始化加;

(2)设计两个按钮的初始化模块,两个按钮分别提供一个移位信号和一个加信号;

两个方案都用了一下,发现还好是2号方案比较好,不仅程序上比较简单而且省了很多按钮的使用,比较符合实际应用的要求;

3、在完成了初始话模块的设计之后,接下来就是减计数模块的设计,只要把由初始化模块所提供的数据进行减计数即可;

4、在完成以上三个模块时,程序的已经初见雏形了,然后把这三个模块连接起来,添加上复位和测试按钮就可以了;

5、用动态扫描的方法队数据进行输出,其中在输入数据是使相应的数据进行闪烁。

 

第3章单元模块设计

3.1单元模块设计总述

单元模块设计部分主要有4部分组成:

(一)、FENPIN模块,用于给后面的JIANJISHU模块和VIEW模块提供合适的频率。

(二)、FIRST模块,用于设定微波炉的初试时间而用。

(三)、JIANJISHU模块,配合FENPIN模块提供的时钟频率实现每秒减一的计数。

(四)、CHOICE模块和VIEW模块,利用动态扫描的方法显出对应数字。

3.2FENPIN模块的设计

FENPIN模块主要利用1Khz的时钟信号进行分频。

得到1s的outlck时钟信号(用于后期JIANJISHU模块的使用)和0.5s的screen的时钟信号(用于VIEW的显示闪烁使用)。

输出1s的时钟信号

为数码管的闪烁提供时钟信号

说明:

试验箱上有1Khz,2Khz等多个时钟信号。

而在这里采用1Khz的信号使用。

1Khz/1000=1s,所以采用1Khz进行千分频得到1s的信号。

仿真波形图:

每秒产生一个时钟脉冲

(程序代码见附录)

Move此时数码管有输出

Move选中时数码管无输出

3.2FIRST模块设计

FIRST模块主要用于对时间设定初始值而用,其中设有ABLE和CLK两时钟信号,分别用于外接按钮信号而用,其中CLK用于进行加计数,ABLE用于移位而用。

输出o1,o2,o3和o4分别是输出秒,十秒,分,十分。

而输出o5是为VIEW实现闪烁而用的。

其中的RES和TEST要配合JIANJISHU模块中的RES和TEST同时控制才能有效(具体会在JIANJISHU模块中详细介绍)。

输出初始数据

说明:

开始设计时,由于没有考虑全面设计了一个有4个按键分别控制秒,十秒,分,十分的方案,因为课设要接近与实际设计,而实际不可能给予如此多的按键,这样不仅占用大量空间而且产品也是非常的不美观,所以之后就改成现在的由ABLE控制移位,再由CLK给予时钟脉冲的方式进行设计,最后发现这样的设计不仅没有上述的缺点更加使我的程序变的更加的简单。

仿真波形图:

每个上升沿都会进行加计数

当res和test为零时输出分别是“0000”和“8888”

Able在每个脉冲到来是都会进行移位,而o5正好显示出正在加的位数

注意:

编写此段代码是要注意秒位和分位都是记从1记到9然后进位自己变成0的,

而十秒位和十分位是记到5然后变成0的。

(程序代码见附页)

3.3JIANJISHU模块的设计

JIANJISHU模块的主要用于对FIRST的数据进行选择性的处理和输出:

(一)、当JIANJISHU模块中的res=0时,由于res作为输入同样也连接这FRIST模块中

的res,他们是由一个输入共同控制的,所以此时输出的就是“0000”;

(二)、当JIANJISHU模块中的test=0时,同res一样的道理,此时输出为“8888”;

(三)、当q4=15(输出为F)或start=0时,LED就不会亮了,表示工作完成或处

于等待状态,此时不对FIRST模块中的数据进行任何处理就直接输出;

(四)、在以上条件都不满足的情况下,若此时start=1,那么JIANJISHU模块才

开始了真正的工作状态,即配合FENPIN模块中时钟outclk开始每秒减一的记时计数;

本程序中复位键res和test的详细说明:

这里的res和test和模块FRIST中的res和test是用同一个控制端,而且JIANJISHU的res和test是必不可少的。

因为每次进行计数完后由于是利用信号进行减计数,在记完一次数之后q1,q2,q3和q4都会保持最后一次的状态,如果不及时清零的话,那么下一次的res,test以及加计数就是只能对前一级的输入进行复位和测试,输出的将是前一级的各个位数减去q1,q2,q3和q4的值,所以在JIANJISHU模块中进行清零是十分重要的。

仿真波形图:

输入初值为“0015”

 当start=1时开始配合clks的始终上升沿开始减计数

在各位都记到0时,就数码管就会显示“FEDC”同时LED熄灭

这就是上次提到的复位是清零了所有的中间信号,这样输出为FIRST中提供原始数据

(程序代码见附页)

3.4CHOICE模块和VIEW模块

CHOICE模块和VIEW模块必须放在一起进行使用,CHOICE模块是进行数据选则而使用的,VIEW模块是用于在相应的为进行输出对应的数,两者和起来就是一个动态扫描的过程。

A:

CHOICE模块;

说明:

这里的clk时钟信号是使用和FENPIN模块中一样的时钟信号(1Khz),因为人

的眼睛对时间的分辨为20个微秒,用1Khz的信号完全能满足这样的要求;要注意CHOICE有两个输出,o2显然输出的是对应的数据信号,而o1要输出的是一个位选信号,是为下一个模块VIEW显示而用。

B:

VIEW模块;

说明:

f1是接受位信号用的,f2是接受数据而用的。

详细说明一下screen和able的作用:

Screen是有FENPIN模块通过对时钟信号分频得到的,当在模块FRIST选中某一

进行加数初始化是,VIEW就可以在时钟screen在为1是正常输出able所指的那位,

当screen为0时,able所指的那位不能对应输出,这样就能达到让相应的数码管闪

的效果。

仿真波形图:

(程序代码见附页)

第4章硬件实验

管脚设置

To

Location

I/OBank

I/OStandard

1

Clk1

PIN_152

3

LVTTL

2

Clk2

PIN_135

3

LVTTL

3

Move

PIN_136

3

LVTTL

4

Rest

PIN_137

3

LVTTL

5

Testt

PIN_138

3

LVTTL

6

Startt

PIN_156

3

LVTTL

7

Lighto

PIN_165

3

LVTTL

8

Sel[2]

PIN_5

1

LVTTL

9

Sel[1]

PIN_4

1

LVTTL

10

Sel[0]

PIN_3

1

LVTTL

11

Seg[7]

PIN_2

1

LVTTL

12

Seg[6]

PIN_1

1

LVTTL

13

Seg[5]

PIN_180

3

LVTTL

14

Seg[4]

PIN_179

3

LVTTL

15

Seg[3]

PIN_178

3

LVTTL

16

Seg[2]

PIN_177

3

LVTTL

17

Seg[1]

PIN_176

3

LVTTL

18

Seg[0]

PIN_175

3

LVTTL

注释:

Clk1:

选用的是1Khz的信号;

Clk2,Move,Rest,Testt:

选用的是按钮信号;

Startt:

使用的是开关信号;

Lighto:

LED输出;

 

第五章设计总结

这次我独立完成了一次完整的程序设计,在整个的设计过程中我感觉我的动手能力得到了比较高的提高吧,学了的东西如果连这么一个比较简单的课设都不能完成的话我感觉是比较羞愧的一件事情。

在整个的设计过程中现在回头好好回想一下我觉得还是有很多不足的,做任何事情起步的时候就应该有一个全局观,但是刚开始由于我没有考虑完全,在FIRST模块种设计了有四个按键控制的初始化程序,之后发现这样不仅程序非常的繁琐,而且这种课设应该和实际好好联系一下,有谁家的微波炉就光是刚开始设定初值都有这么多按钮,那么不仅难看而且比较耗资源,使用也不是最方便的,所以之后经过分析后选择了现在使用的由两个按钮就能事先数据初始化的功能。

因此在以后的设计工作中也要学会有大局观。

同是在编写复位和测试两个按键的功能是遇到了比较大的麻烦,总是输出一些莫名其妙的数据,之后发现是由于在JIANJISHU模块的中的中间信号没有清零而导致的,这样的一个遇到困难然后去解决这个问题的过程让我对中间信号有了比较深刻的理解。

在完成大半个程序之后,我发现在初始化数据的时候没有任何的提示是在对哪以为进行加,所以就去请教了老师,以老师的方案就是用一个时间较长的时钟信号对输出数码管的管脚进行或操作(数码管是共阴),当时我嫌这么方法写的代码比较长,所以我就尝试了一下在输出数码管的位选上做文章,用这个较长的时钟信号和位信号进行位操作,这样可以实现闪烁,但是在时钟信号为’1’时输入的位信号是“111”,由于实验箱上的数码管都进行了引脚的锁定,所以会让第8个数码管点亮,所以这个方案宣告失败,最后就采用了现程序使用的方法,和老师的差不多,写起来也比较方便。

总的来说这样的课程设计比上课有意思多了,在实际中还是有很多不是在课本上能学的到的东西,这个需要自己去理解,去总结的。

 

附页:

————————————微波炉定时控制器程序代码————————————

第一部分:

TOP(顶层文件)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytopis

port(rest,clk1,clk2,move,startt,testt:

instd_logic;

lighto:

outstd_logic;

sel:

outstd_logic_vector(2downto0);

seg:

outstd_logic_vector(7downto0));

end;

architecturethreeoftopis

componentfenpinis

port(clk:

instd_logic;分频

outclk,screen:

outstd_logic);

endcomponent;

componentfirstis

port(clk,able,res,test:

instd_logic;初始化数据

o1,o2,o3,o4,o5:

outstd_logic_vector(3downto0));

endcomponent;

componentjianjishuis

port(clks,start,res,test:

instd_logic;

in1,in2,in3,in4:

instd_logic_vector(3downto0);减计数

light:

outstd_logic;

out1,out2,out3,out4:

outstd_logic_vector(3downto0));

endcomponent;

componentchoiceis

port(clk:

std_logic;

f1,f2,f3,f4:

instd_logic_vector(3downto0);

o1:

outstd_logic_vector(1downto0);位选

o2:

outstd_logic_vector(3downto0));

endcomponent;

componentviewis

port(screen:

instd_logic;

f1:

instd_logic_vector(1downto0);

f2,able:

instd_logic_vector(3downto0);显示输出

segout:

outstd_logic_vector(7downto0);

selout:

outstd_logic_vector(2downto0));

endcomponent;

signalb,c,d,e,f,g,h,i,j:

std_logic_vector(3downto0);

signala,k:

std_logic;

signalq:

std_logic_vector(1downto0);

signalp:

std_logic_vector(3downto0);

begin

u1:

fenpinportmap(clk=>clk1,outclk=>a,screen=>k);

u2:

firstportmap(clk=>clk2,res=>rest,test=>testt,able=>move,

o1=>b,o2=>c,o3=>d,o4=>e,o5=>j);

u3:

jianjishuportmap(clks=>a,start=>startt,res=>rest,test=>testt,in1=>b,in2=>c,

in3=>d,in4=>e,light=>lighto,out1=>f,out2=>g,out3=>h,out4=>i);

u4:

choiceportmap(clk=>clk1,f1=>f,f2=>g,f3=>h,f4=>i,o1=>q,o2=>p);

u5:

viewportmap(able=>j,screen=>k,f1=>q,f2=>p,segout=>seg,selout=>sel);

end;

 

————————————————————————————————————

 

第二部分:

FENPIN(时钟分频)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfenpinis

port(clk:

instd_logic;

outclk,screen:

outstd_logic);

end;

architecturefirstoffenpinis

signalQ1,Q2:

std_logic;

begin

one:

process(clk)

variablecount1:

integerrange0to1002;

begin

Q1<='0';

ifcount1>1000thenQ1<='1';count1:

=0;

elsifclk'eventandclk='1'thencount1:

=count1+1;分出1秒信号

endif;

endprocess;

two:

process(clk)

variablecount2:

integerrange0to500;

begin

ifclk'eventandclk='1'then

ifcount2<250thenQ2<='1';count2:

=count2+1;

elseQ2<='0';count2:

=count2+1;闪烁信号

endif;

endif;

ifcount2>499thencount2:

=0;

endif;

endprocess;

outclk<=Q1;

screen<=Q2;

end;

 

第三部分:

FIRST(数据初始化)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfirstis

port(clk,able,res,test:

instd_logic;

o1,o2,o3,o4,o5:

outstd_logic_vector(3downto0));

end;

architecturetwooffirstis

signalq1,q2,q3,q4,q5:

std_logic_vector(3downto0);

begin

process(able)

begin

ifable'eventandable='1'then

ifq5<4thenq5<=q5+1;位选信号,选择相应的位进行初始

elseq5<="0000";化,其中“0000”为空位。

endif;

endif;

endprocess;

process(clk,res,test,q4)

begin

ifres='0'thenq1<="0000";q2<="0000";q3<="0000";q4<="0000";--复位键

elsiftest='0'thenq1<="1000";q2<="1000";q3<="1000";q4<="1000";--测试键

elsifclk'eventandclk='1'then

caseq5is

when"0001"=>ifq1<9thenq1<=q1+1;

elseq1<="0000";秒位加数

endif;

when"0010"=>ifq2<5thenq2<=q2+1;

elseq2<="0000";十秒位加数

endif;

when"0011"=>ifq3<9thenq3<=q3+1;

elseq3<="0000";分位加数

endif;

when"0100"=>ifq4<5thenq4<=q4+1;

elseq4<="0000";十分位加数

endif;

whenothers=>null;

endcase;

endif;

endprocess;

o1<=q1;

o2<=q2;

o3<=q3;

o4<=q4;

o5<=q5;--在VIEW模块中选择闪烁位

end;

 

————————————————————————————————————

 

第四部分:

JIANJISHU(数据按秒倒计时)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityjianjishuis

port(clks,start,res,test:

instd_logic;

in1,in2,in3,in4:

instd_logic_vector(3downto0);

light:

outstd_logic;

out1,out2,out3,out4:

outstd_logic_vector(3downto0));

end;

architectureoneofjianjishuis

signalq1,q2,q3,q4:

std_logic_vector(3downto0);

begin

process(start,clks,res,test,q4)

variablea:

std_logic_vector(1downto0);

begin

ifres='0

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2