EDA课程设计交通灯课程设计报告EDA.docx
《EDA课程设计交通灯课程设计报告EDA.docx》由会员分享,可在线阅读,更多相关《EDA课程设计交通灯课程设计报告EDA.docx(31页珍藏版)》请在冰点文库上搜索。
EDA课程设计交通灯课程设计报告EDA
第一章设计任务和要求·········································
1.1设计任务与要求··················································
1.2设计分析························································
第二章电路工作原理及方案设计
第三章单元电路设计与仿真·································
3.1软件原理图······················································
3.2各模块的原理及其程序············································
3.2.1计数模块的设计及仿真图········································
3.2.2控制模块的设计及仿真图········································
3.2.3分位模块的设计及仿真图········································
3.2.4分频模块的设计及仿真图········································
3.2.5译码模块的设计及仿真图········································
第四章心得总结···········································
第一章设计任务与要求
1.1设计任务与要求
在十字路口的两个方向上各设一组红、绿、黄灯,显示顺序为其中一个方向为绿灯、黄灯、红灯。
另一个方向为红灯、绿灯、黄灯。
设置一组数码管,以倒计时的方式显示可以通过的或者禁止通行的时间,其中绿灯、黄灯、红灯的持续时间分别为20S,5S,25S
当各条路上任意一条路上出现故障时,各方向都是红灯亮,倒计时停止,且显示数字在闪烁。
当特殊情况结束后,控制器恢复正常。
1.2设计分析
1,主控制模块:
(1)当没有故障出现时,灯的运行方法如下所示:
状态
A路(主干道)
B路(支干道)
红
黄
绿
红
黄
绿
S1
√
√
S2
√
√
S3
√
√
S4
√
√
其中,s1,s2,s3,s4分别是四种状态下的表现,程序我们用了状态机的方法,罗列了4种状态,利用case语句把4种状态分别表现出来;部分程序如下:
casestateis
whens1=>--“=>”等效于then
reda<='1';--a路红灯灭
yellowa<='1';--a路黄灯灭
greena<='0';--a路绿灯亮
redb<='0';--b路红灯亮
yellowb<='1';--b路黄等灭
greenb<='1';--b路黄等灭
numa<=count;
numb<=count+5;
可见,一路灯走完一个周期T=50s(红25+黄5+绿20).
第二章电路工作原理及方案设计
总体框图:
在VHDL设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:
输入信号:
复位开关信号reset;外部时钟信号clk。
LED七段显示数码管的输出信号count1(6downto0),count2(6downto0),count3(6downto0),count4(6downto0);在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。
根据实验设计的结构功能,来确定使用哪些模块以及这些模块之间的关系。
通过上面的分析,不难得知可以把交通灯控制系统划分为4个模块:
时钟分频模块,计数模块,控制模块,分位译码模块。
控制器电路:
根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。
当检测到手动控制信号(Con=’1’)时,执行手动控制;
计数器电路:
这里需要的计数器的计数范围为0~89。
计到89后,下一个时钟沿升为1时,开始下一轮计数,此外当系统复位信号(Reset=’1’)使计数器异步清‘0’。
手动信号(Con=’1’)使系统清‘0’。
分位译码电路:
因为控制器输出的倒计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数,如20分为2和0,7分为0和7)。
七段数码管的译码电路根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管,我们用的是共阳极数码管,因此译码电路输出逻辑数值‘0’点亮二极管,译码电路输出逻辑数值‘1’熄灭二极管。
第三章单元电路设计与仿真
3.1软件原理图
3.2各模块的原理及其程序
3.2.1计数模块的设计及仿真图
功能:
实现0到99的计数
clk0—脉冲输入
con—手动控制信号
reset—复位信号
countnum—计数输出
仿真波形如下:
模块程序:
libraryieee;
useieee.std_logic_1164.all;
entitycounteris
port
(clk0:
instd_logic;
con:
instd_logic;
reset:
instd_logic;
countnum:
bufferintegerrange0to99);
endcounter;
architectureoneofcounteris
begin
process(reset,clk0)
begin
ifreset='1'then
countnum<=0;
elsifrising_edge(clk0)then
ifcon='1'then
countnum<=0;
else
ifcountnum=99then
countnum<=0;
else
countnum<=countnum+1;
endif;
endif;
endif;
endprocess;
endone;
3.2.2控制模块的设计及仿真图
功能:
控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。
clk1—脉冲信号输入
con1—手动控制信号
con2—状态控制信号
countnum—计数输入
numa,numb—两个方向的倒计时数值输出
ra,ga,ya,ga1,rb,gb,yb,gb1—发光二极管输出
仿真波形如下:
模块程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycontrolleris
port
(clk1:
instd_logic;
con1:
instd_logic;
con2:
instd_logic;
countnum:
inintegerrange0to89;
numa,numb:
outintegerrange0to25;
ra,ga,ya,ga1:
outstd_logic;
rb,gb,yb,gb1:
outstd_logic);
endcontroller;
architectureoneofcontrolleris
signalm:
integerrange0to7;
begin
process(clk1,con1,con2,countnum)
variableaa:
std_logic_vector(7downto0);
begin
if(clk1'eventandclk1='1')then
ifcon1='0'then
ifcountnum>=65then
numb<=90-countnum;
numa<=90-countnum;
ifcountnum>=70then
aa:
="00011000";
elseaa:
="00101000";
numa<=70-countnum;
endif;
elsifcountnum>=45then
numb<=65-countnum;
numa<=65-countnum;
ifcountnum>=50then
aa:
="10000100";
elseaa:
="10000010";
numb<=50-countnum;
endif;
elsifcountnum>=20then
numa<=45-countnum;
numb<=45-countnum;
ifcountnum>=25then
aa:
="01001000";
elseaa:
="00101000";
numa<=25-countnum;
endif;
elsifcountnum>=0then
numa<=20-countnum;
numb<=20-countnum;
ifcountnum>=5then
aa:
="10000100";
elseaa:
="10000010";
numb<=5-countnum;
endif;
endif;
else
ifcon1='1'then
numa<=0;
numb<=0;
ifcon2='1'then
ifm=7then
m<=0;
else
m<=m+1;
endif;
endif;
ifm=0then
aa:
="01001000";
elsifm=1then
aa:
="00101000";
elsifm=2then
aa:
="10000100";
elsifm=3then
aa:
="10000010";
elsifm=4then
aa:
="00011000";
elsifm=5then
aa:
="00101000";
elsifm=6then
aa:
="10000001";
elsifm=7then
aa:
="10000010";
endif;
endif;
endif;
endif;
ra<=aa(7);
ga<=aa(6);
ya<=aa(5);
ga1<=aa(4);
rb<=aa(3);
gb<=aa
(2);
yb<=aa
(1);
gb1<=aa(0);
endprocess;
endone;
3.2.3分位模块的设计与仿真图
模块程序:
libraryieee;
useieee.std_logic_1164.all;
entityfenweiis
port(numin:
inintegerrange0to25;
numa,numb:
outintegerrange0to9);
endfenwei;
architectureoneoffenweiis
begin
process(numin)
variablenuma1,numb1:
integerrange0to9;
begin
ifnumin>=20then
numa1:
=2;
numb1:
=numin-20;
elsifnumin>=10then
numa1:
=1;
numb1:
=numin-10;
else
numa1:
=0;
numb1:
=numin;
endif;
numa<=numa1;
numb<=numb1;
endprocess;
endone;
功能:
把倒计时的数值分成2个1位的十进制数。
numin:
倒计时数值输入
numa,numb—将数值分为2个1位的十进制输出
仿真波形如下:
3.2.4分频模块的设计及仿真
模块程序
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityclk_10is
port(clk:
instd_logic;
clk_div10:
outstd_logic);
endclk_10;
architectureoneofclk_10is
signalclk_temp:
std_logic;
begin
process(clk)
variablecounter:
std_logic_vector(2downto0);
constantmd:
std_logic_vector(2downto0):
="101";
begin
if(clk'eventandclk='1')then
if(counter=md)then
counter:
=(others=>'0');
clk_temp<=notclk_temp;
endif;
counter:
=counter+1;
endif;
endprocess;
clk_div10<=clk_temp;
endone;
功能:
实现分频
接口:
clk—脉冲输入
Clk-div10—分频后脉冲输出
仿真结果如下:
3.2.5译码模块的设计及仿真图
功能:
根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管。
bb[3..0]--BCD码输入
clk2—脉冲输入
ya,yb,yc,yd,ye,yf,yg—七段数码管显示输出
仿真波形如下:
程序模块:
libraryieee;
useieee.std_logic_1164.all;
entityyimais
port(
clk2:
instd_logic;
bb:
instd_logic_vector(3downto0);
ya:
outstd_logic;
yb:
outstd_logic;
yc:
outstd_logic;
yd:
outstd_logic;
ye:
outstd_logic;
yf:
outstd_logic;
yg:
outstd_logic);
enddisplay;
architectureoneofyimais
signaltemp:
std_logic_vector(6downto0);
begin
process(bb)
begin
casebbis
when"0000"=>temp<="1000000";
when"0001"=>temp<="1111001";
when"0010"=>temp<="0100100";
when"0011"=>temp<="0110000";
when"0100"=>temp<="0011001";
when"0101"=>temp<="0010010";
when"0110"=>temp<="0000010";
when"0111"=>temp<="1011000";
when"1000"=>temp<="0000000";
when"1001"=>temp<="0010000";
whenothers=>temp<="1111111";
endcase;
endprocess;
ya<=temp(0);
yb<=temp
(1);
yc<=temp
(2);
yd<=temp(3);
ye<=temp(4);
yf<=temp(5);
yg<=temp(6);
endone;
第四章心得总结
通过实验设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学内容,本学期我们进行了VHDL实验设计,老师命题,六人一大组,分工合作进行设计(包括设计总体方案、软件原理、计数模块、控制模块、分位模块、分频模块、译码模块等工作)。
我们做的是交通灯控制器的设计。
确定题目后,我们首先进行了单元模块的设计,将每一个单元模块设计完成后再经行仿真,仿真成功后就可以进行顶层文件的编写了,在顶层文件的编写过程中遇到了一些问题,特别是各模块之间的连接,以及信号的定义,总是有错误。
有的时候信号的定义容易出现混淆,在反复的修改过后,顶层文件终于能够编译成功了。
在波形仿真的过程中,同样遇到了困难,有的时候,由于ENDTIME的时间修改的太大,会出现仿真时间过长的问题,这个时候应该要把ENDTIME的时间相应的改小,或是修改系统时钟的频率。
在设计的过程中还应该多联系下实际情况,要了解实际情况下交通信号灯的工作情况,才能更好的完成此次的课程设计。
在今后的工作和学习中,我们不能仅仅把目光停留在课本上,要多理论联系实际。
有的时候,理论上是正确的东西放到现实中去,可能由于种种因素的制约,并不能达到实际的效果,还需要我们进行相应的修改才能完成要求。
这次的课程设计使我巩固了以前学习到的知识,还使我掌握了以前没有掌握的知识,同时锻炼了自己的能力。
在这次实验设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教师兄,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
通过几天的课程设计,我对数据库软件EDA技术、VHDL、等系列知识都有了一定的了解。
使用EDA技术开发页面的能力也有了很大提高。
同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。
做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。
最后参照每个模块把输入和输出引脚设定,运用我们所学的VHDL语言进行编程。
总之,通过这次的设计,进一步了解了EDA技术,收获很大,对软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
另外,我还学到了一个人的力量毕竟有限,但是团队的力量势不可挡,我们不能只靠自己,遇到不会的要多多求助同学,
这次设计虽然结束了,也留下了很多遗憾,因为由于期末,面临各科考试,时间的紧缺,并没有做到最好。
相信以后我们会以更加积极地态度对待我们的学习、对待我们的生活。
我们的激情永远不会结束,相反,我们会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,我们会更加珍惜拥有的,更加努力的去完善它,增进它。
关于使用VHDL的问题:
①VHDL的语法问题:
由于初次接触VHDL硬件编程语言,容易犯一些小错误,像端口括号前分号不加,二进制变量与十进制变量加不加引号的问题等等。
当然大部分语法问题编译的时候能够报错从而发现。
但是,也有一些小规则,虽然语法通过了,但是功能却不能实现。
本实验的代码调试中发现了大量的这样的问题。
②可能是由于编译器的一些原因,在使用case……when……语句时,出现了一些不可预知的问题。
由于要实现的是一个比较捕获触发器,所以只有在某几个输入状态的时候需要改变输出的值,而在其他输入状态时输出量要保持,使用case语句,但在实验中发现,case语句中没有使用的状态虽然用了others关键字进行设置,但实际运行中其输出并不稳定为我们希望的值。
最终将所有可能输入情况的case状态均进行了设置,才解决了这个问题,看来以后casewhen语句要少用啊!
!
参考书目
(1)VHDL数字控制系统设计电子工业出版社
(2)EDA技术与VHDL清华大学出版社
附录总程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydingcengis
port(clkd,resetd,cond,con1d:
instd_logic;
count1:
outstd_logic_vector(6downto0);
count2:
outstd_logic_vector(6downto0);
count3:
outstd_logic_vector(6downto0);
count4:
outstd_logic_vector(6downto0);
reda,greena,yellowa,greena1:
outstd_logic;
redb,greenb,yellowb,greenb1:
outstd_logic);
endentitydingceng;
architectureoneofdingcengis
componentclk_10
port(clk:
instd_logic;
clk_div10:
outstd_logic);
endcomponent;
componentcounter
port
(clk0:
instd_logic;
con:
instd_logic;
reset:
instd_logic;
countnum:
bufferintegerrange0to89);
endcomponent;
componentcontroller
port
(clk1:
instd_logic;
con1:
instd_logic;
con2:
instd_logic;
countnum:
inintegerrange0to89;
numa,numb:
outintegerrange0to25;
ra,ga,ya,ga1:
outstd_logic;
rb,gb,yb,gb1:
outstd_logic);
endcomponent;
componentfenwei
port(numin:
inintegerrange0to