VHDL课程设计报告.docx
《VHDL课程设计报告.docx》由会员分享,可在线阅读,更多相关《VHDL课程设计报告.docx(32页珍藏版)》请在冰豆网上搜索。
VHDL课程设计报告
课程设计
课程名称:
交通灯设计.
一、课程设计内容
1.学习ALTERA公司的FPGA/CPLD的结构、特点和性能。
2.学习集成开发软件MAX+plusII/QuartusII的使用及设计过程。
3.熟悉EDA工具设计数字电路设计方法,掌握VHDL硬件描述语言设计方法。
4.根据给定题目设计数字电路,来加深对可编程逻辑器件的理解和掌握。
二、课程设计应完成的工作
1.在所选择器件内完成交通灯控制器的设计,要求设计完成后芯片具有交通灯控制器的全部功能、包括显示和操作接口。
2.交通灯控制器要求控制十字路口两道路的交通灯,两道路交替通行,每次通行时间可设定20——60秒之间,每个路口要求有前行、禁止、人行灯。
(根据实际设计进度考虑可以增加左右转向灯,等待和通行时间显示等)。
3.撰写设计说明书一份(不少于2000字),阐述系统的工作原理,软、硬件设计方法,重点阐述软件思路。
说明书应包括封面、任务书、目录、摘要、正文、参考文献(资料)等内容,以及硬件电路综合图和软件程序清单等材料。
注:
设计说明书题目字体用小三,黑体,正文字体用五号字,宋体,小标题用四号及小四,宋体,并用A4纸打印。
三、课程设计进程安排
序号
课程设计各阶段名称
日期
1
软件学习
12月1日12月12日
2
编写软件
12月12日1月7日
3
软件仿真调试
1月8日
4
软、硬件仿真调试,撰写设计说明书
1月12日
5
完善设计说明书,提交设计说明书
1月13日
四、设计资料及参考文献
1.康华光主编,《电子技术基础-数字部分》,高等教育出版社,1998。
2.谭会生等主编,《EDA技术及应用》,西安电子科技大学出版社,2001
3.潘松等主编,《EDA技术实用教程》,科学出版社,2006
4.雷伏容主编,《VHDL电路设计》,清华大学出版社,2006
5.CharlesH.Roth等著,《数字系统设计与VHDL》,电子工业出版社,2008
五、成绩评定综合以下因素:
(1)说明书及设计图纸的质量(占50%)。
(2)独立工作能力及设计过程的表现(占30%)。
(3)回答问题的情况(占20%)。
说明书和图纸部分评分分值分布如下:
1、任务分析与设计思路(10分)
要求说明设计任务的具体技术指标打算如何实现,根据实现各技术指标的解决方法,提出总体设计的思路和解决方案,说明其中关键问题及其解决办法。
2、详细设计(50分)
根据总体设计完成下面任务:
1)用Quartus综合出电路原理图;(10分)
2)列出芯片引脚分配并有注释;(10分)
3)提供波形图并给出具体分析;(10分)
4)提交程序清单,程序清单必须有详细注释。
(10分)
六、其他说明
1.课程设计需独立完成,每人必须提交课程设计说明书。
2.课程设计说明书内容不得雷同,雷同者本课程设计成绩一律不及格。
指导老师不负责甄别原创者与抄袭者。
正文
一.摘要..........................
二.设计思路........................
三.设计过程........................
1.分频模块div..................
2.红绿的现实模块crosslight与crosslight2......
3.计数兼译码模块.................
4.模块连接图....................
五.设计分析与总结.....................
六.程序清单........................
一、摘要
EDA技术是以计算机为工具,根据硬件描述语言VHDL完成的设计文件,自动的完成逻辑编译,化简,分割,综合及优化,布局布线,仿真以及对特定目标芯片的适配编译和编程下载等工作.随着基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息,通信,自动控制用计算机等领域的重要性日益突出。
作为一个学习通信工程专业的学生,我们必须不断的了解更多的新产品信息,这就更加要求我们对EDA有个全面认识。
本程序设计的是基于VHDL的数字时钟,采用EDA作为开发工具,VHDL语言为硬件描述语言,QUARTUSII作为程序的运行平台,所开发的程序经过调试运行,波形仿真验证,初步实现了设计目标。
本程序使用的硬件描述语言VHDL,可以大大降低了硬件数字系统设计的入门级别,让人感觉就是C语言的亲近。
通过本次的课程设计,不但使同学们进一步了解EDA技术在实际中的应用,也使同学们对EDA的综合应用有了更深一步的应用,这次的课程设计给同学们以后的学习与工作中有了一个全面的指导作用.
典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器,综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的VHDL原理图或状态图形描述,针对给定的硬件系统组件,进行编译,优化,转换和综合,最终获得我们欲将实现的功能的描述文件。
综合器在工作前,必须给定要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来,也就是说综合器是软件描述与硬件实现的一座桥梁。
综合过程就是将电路的高级语言描述转换成低级的,可与目标器件CPLD相映射的网表文件。
适配器的功能是将由综合器产生的网表文件配置与指定的目标器件中,产生最终的下载文件。
适配器所选的目标器件(CPLD芯片)必须包含于在综合器中已指定的目标器件系列。
硬件描述语言VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage。
它主要用于描述数字系统的结构,行为,功能和接口。
除了还有很多硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似与一般的高级计算机语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体内外部分的概念是VHDL系统设计的基本点。
二、设计思路
首先,既然是要用VHDL语言设计就必须得先学会VHDL语言,这是设计前必须的准备工作;其次,要求学会软件的仿真使用,此次设计中所用的软件工具是QUARTUSII5.1;再者就是具体设计过程的构想了。
在车流不需交叉转弯的单十字路口可以仅用简单的四组的红、黄、绿灯来控制,其中两两相同。
假设一个十字路口有东西南北方向,则南北方向红、黄、绿灯时序完全相同,东西方向亦如此。
当南北方向为绿灯时东西方向为红灯,此时南北方向通行而东西方向禁止通行,同时来至东、西方的车辆均可以右转,但不能左转,这是此设计的最大不足。
当一个直通方向的红灯停止时为该直通方向的出发的车辆不与另一直通方向已经进入十字路交叉处但还为使出的车辆发生碰撞事故,必须设置黄灯等待指示作为缓冲。
即为红灯停了亮黄灯,黄灯停了亮绿灯,绿灯停了亮红灯,依次循环。
同时可以设置黄等2秒,绿灯20秒,红灯22秒。
采用模块化设计,先将各个功能模块设计调试成功之后再用例化语句将各个功能模块连接起来,即建立顶层模块。
三、设计过程
1、分频模块div
其功能就是根据所提供的晶振频率进行分频,以予驱动计数模块和红绿灯显示模块能,此模块可以通过改变软件的个别参数实现任意倍数的分频。
Clk接晶振,fpclk用于驱动后续模块,rst接复位信号,低电平复位。
2、红绿的显示模块crosslight与crosslight2
用于对红绿灯的显示控制,分别控制两个直通方向的红绿灯,clk为时钟输入端,接分频模块的输出,rst1与rst0分别为复位信号输入端,高电平
复位,greenlgt、yellowlgt、redlgt与greenlgt0、yellowlgt0、redlgt0分别作为两个直通方向的绿灯黄灯和红灯的显示。
3、计数兼译码模块
这六个模块均为计数模块,其输出直接为字形码,即兼备译码的功能。
具体原理为采用加计数器的方向显示,利用直接查表赋值的方法逐一赋值,于是就可以实现正序的加一计数行成倒序的减一计数。
此六个模块的功能实现原理完全一致,EN02EN20EN22ENe02ENe20ENe22即为复位输入端,低电平复位。
右端均为输出端,输出与七段显示码对应的字型码可以直接驱动数码管。
4、模块连接图通过顶层模块的例化语句连接得到此图
(输入端口)
(输出端口)
四、仿真波形
图中第一个为分频器时钟输入,第二到七个信号为红绿灯的输出信号,以下为计数输出,计数输出全为字型码,可直接驱动七段数码管显示,例如图中的“1111110”为十进制“0”的字型码。
五、设计分析与总结
本次课程设计的程序的设计和调试都花了我不少精力,虽然结果并不如意但至少最后还是仿真陈功了,而且通过本次课程设计是我进一步加深了对VHDL硬件描述语言的理解及其运用,VHDL描述数字电路系统设计的行为、功能、输入和输出,它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VHDL将一个设计称为一个实体Entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。
当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。
所以,内部和外部的概念对系统设计的VHDL是十分重要的。
外部的实体名或连接由实体声明Entity来描述。
而内部的实体算法或实现则由结构体Architecture来描述。
结构体可以包含相连的多个进程process或者组建component等其他并行结构。
在此过程中,程序的反复调试简直让人想哭,有时候就仅仅是一个标点符号的错误都会花费大量的时间,特别是顶层模块的调用,一不小心就错误一大堆。
不过尽管感觉这次设计好难,但这也可以作为一次宝贵的人生体验,可以加强独立学习的能力,也许有同学会觉得快毕业了就没必要学习了但我不这样认为,我以前没学好是现在更应该抓住着大学剩下的短短时间。
尽管很累,但我觉得很值得,谢谢老师给予我这个“累”的机会。
六、程序清单
(由于六个计数兼显示模块设计思想完全一致,在注释部分仅对前面两个模块进行注释)
--顶层模块,完成各个功能模块的链接
LIBRARYIEEE;--主程序库说明部分
USEIEEE.Std_Logic_1164.ALL;
ENTITYyintongIS--实体说明
port(rst0,rst1,rst,clk:
instd_logic;
yellowlgt,greenlgt,redlgt:
outstd_logic;
greenlgt0,yellowlgt0,redlgt0:
outstd_logic;
DOUT02M:
outstd_logic_vector(6downto0);
DOUTe02M:
outstd_logic_vector(6downto0);
DOUT22M,DOUT22B:
outstd_logic_vector(6downto0);
DOUT20M,DOUT20B:
outstd_logic_vector(6downto0);
DOUTe20M,DOUTe20B:
outstd_logic_vector(6downto0);
DOUTe22M,DOUTe22B:
outstd_logic_vector(6downto0));
endyintong;
architecturetongofyintongis--结构体说明
componentdiv--分频模块引用
port(rst:
instd_logic;
clk:
instd_logic;
fpclk:
outstd_logic);
endcomponent;
componentcrosslight2--一直通方向红绿灯显示模块引用
port(clk:
instd_logic;
rst1:
instd_logic;
greenlgt:
outstd_logic;
yellowlgt:
outstd_logic;
redlgt:
outstd_logic);
endcomponent;
componentcrosslight--另一直通方向的红绿灯显示模块引用
port(clk:
instd_logic;
rst0:
instd_logic;
greenlgt0:
outstd_logic;
yellowlgt0:
outstd_logic;
redlgt0:
outstd_logic);
endcomponent;
componentcnt02s--一直通方向的黄灯显示模块引用
port(clk,EN02B:
instd_logic;
DOUT02M:
outstd_logic_vector(6downto0));
endcomponent;
componentcnte02s--另一直通方向的黄的显示模块引用
port(clk,ENe02B:
instd_logic;
DOUTe02M:
outstd_logic_vector(6downto0));
endcomponent;
componentCNT22s--一直通方向的红灯显示模块引用
port(clk,EN22A:
instd_logic;
DOUT22M,DOUT22B:
outstd_logic_vector(6downto0));
endcomponent;
componentCNT20s--一直通方向的绿灯显示模块引用
port(clk,EN20A:
instd_logic;
DOUT20M,DOUT20B:
outstd_logic_vector(6downto0));
endcomponent;
componentCNTe20s--另一直通方向的绿灯显示模块引用
port(clk,ENe20A:
instd_logic;
DOUTe20M,DOUTe20B:
outstd_logic_vector(6downto0));
endcomponent;
componentCNTe22s--另一直通方向的红灯显示模块引用
port(clk,ENe22A:
instd_logic;
DOUTe22M,DOUTe22B:
outstd_logic_vector(6downto0));
endcomponent;
signalo1:
std_logic;--信号量的定义
signalyl:
std_logic;--信号量的定义
signaleyl:
std_logic;--信号量的定义
signalrl:
std_logic;--信号量的定义下同
signalerl:
std_logic;
signalgl:
std_logic;
signalegl:
std_logic;
begin
u1:
divportmap(rst,clk,o1);--位置映射方法完成信号连接下同
u2:
crosslightportmap(o1,rst1,egl,eyl,erl);
u3:
crosslight2portmap(o1,rst0,gl,yl,rl);
u4:
cnt02sportmap(o1,yl,DOUT02M);
u5:
cnt22sportmap(o1,rl,DOUT22M,DOUT22B);
u6:
CNT20sportmap(o1,gl,DOUT20M,DOUT20B);
u7:
cnte02sportmap(o1,eyl,DOUTe02M);
u8:
CNTe20sportmap(o1,egl,DOUTe20M,DOUTe20B);
u9:
cnte22sportmap(o1,rl,DOUTe22M,DOUTe22B);
yellowlgt<=yl;--赋值输出下同
yellowlgt0<=eyl;
redlgt<=rl;
greenlgt<=gl;
greenlgt0<=egl;
redlgt0<=erl;
endtong;--顶层模块结束
--分频模块
libraryieee;--库说明
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydivis--实体说明
port(rst:
instd_logic;
clk:
instd_logic;
fpclk:
outstd_logic);
enddiv;
architecturearcofdivis--结构体说明
begin
process(clk)--并行进程语句
variablecount:
integerrange0to1000000000;--定义允许分频为0到--1000000000
variableclk0:
std_logic;
begin
ifrst='0'then--rst为低电平时复位
clk0:
='0';
elsifclk'eventandclk='1'then
ifcount=1000then
clk0:
=notclk0;
count:
=0;--上升沿敏感,定义1000分频
else
count:
=count+1;
endif;
endif;
fpclk<=clk0;
endprocess;
endarc;
--一方向红绿灯显示模块
libraryieee;--库说明
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycrosslightis--实体说明
generic(
yellow:
integer:
=2;--定义黄灯显示时间
green:
integer:
=20;--定义绿灯显示时间
red:
integer:
=22--定义红灯显示时间
);
port(
clk:
instd_logic;
rst0:
instd_logic;
greenlgt0:
outstd_logic;
yellowlgt0:
outstd_logic;
redlgt0:
outstd_logic);
endcrosslight;
architectureaofcrosslightis--结构体说明
typestatesis(st0,st1,st2);
signalstate:
states;
signalcnt:
integer;
signalcnt_end:
std_logic;
begin
process(rst0,clk)--并行进程语句实现红绿灯信号输入
begin
if(rst0='1')then--定义高电平复位
state<=st0;cnt<=0;
elsif(rising_edge(clk))then
if(cnt_end='1')then
cnt<=cnt+1;--计数加一
elsecnt<=0;
endif;
casestateis
whenst0=>
if(cnt=green)then
state<=st1;
elsestate<=st0;
endif;
whenst1=>
if(cnt=yellow)then
state<=st2;
elsestate<=st1;
endif;
whenst2=>
if(cnt=red)then
state<=st0;
elsestate<=st2;
endif;
endcase;
endif;
endprocess;
process(state)--并行进程语句实现红绿灯信号输出
begin
casestateis
whenst0=>
yellowlgt0<='1';
greenlgt0<='0';
redlgt0<='0';
cnt_end<='1';
if(cnt=green)then
cnt_end<='0';
endif;
whenst1=>
yellowlgt0<='0';
greenlgt0<='1';
redlgt0<='0';
cnt_end<='1';
if(cnt=yellow)then
cnt_end<='0';
endif;
whenst2=>
yellowlgt0<='0';
greenlgt0<='0';
redlgt0<='1';
cnt_end<='1';
if(cnt=red)then
cnt_end<='0';
endif;
endcase;
endprocess;
enda;
--另一方向红绿灯显示模块
libraryieee;--库说明
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycrosslight2is--实体说明
generic(
green:
integer:
=20;--定义绿灯显示时间
yellow:
integer:
=2;--定义黄灯显示时间
red:
integer:
=22--定义红灯显示时间
);
port(
clk:
instd_logic;
rst1:
instd_logic;
greenlgt:
outstd_logic;
yellowlgt:
outstd_logic;
redlgt:
outstd_logic
);
endcrosslight2;
architectureaofcrosslight2is--结构体说明
typestatesis(st0,st1,st2);
signalstate:
states;
signalcnt:
integer;
signalcnt_end:
std_logic;
begin
process(rst1,clk)--并行进程语句实现红绿灯信号输入
begin
if(rst1='1')then
state<=st0;cnt<=0;--复位
elsif(rising_edge(clk))then
if(cnt_end='1')then
cnt<=cnt+1;
elsecnt<=0;
endif;
casestateis
whenst0=>
if(cnt=red)then
state<=st1;
elsestate<=st0;
endif;