华北电力大学科技学院EDA课程设计汇编.docx
《华北电力大学科技学院EDA课程设计汇编.docx》由会员分享,可在线阅读,更多相关《华北电力大学科技学院EDA课程设计汇编.docx(19页珍藏版)》请在冰豆网上搜索。
![华北电力大学科技学院EDA课程设计汇编.docx](https://file1.bdocx.com/fileroot1/2023-5/31/8b11f468-a2ee-4806-9573-7113f1ebd9be/8b11f468-a2ee-4806-9573-7113f1ebd9be1.gif)
华北电力大学科技学院EDA课程设计汇编
科技学院
课程设计报告
(2015--2016年度第一学期)
名称:
EDA课程设计
题目:
交通灯控制系统设计
院系:
科技学院
班级:
13k2
学号:
31
学生姓名:
指导教师:
胡老师
设计周数:
2
成绩:
日期:
2015年12月10日
一、课程设计的目的与要求
1.1实验目的
掌握交通灯控制系统的基本原理,及用VHDL状态机实现该系统的方法。
1.2实验内容
设计一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制系统,具体要求如下:
(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。
(2)主、支道交替允许通行,主干道每次放行45s,支干道每次放行25s,在每次由亮绿灯变成亮红灯的转换过程中,要亮5s的黄灯作为过渡,并进行减计时显示。
1.3实验要求
1、用8段数码管分别显示两个干道的交通计时。
2、能够正常实现红、黄、绿灯的切换。
二、设计正文
1.1设计思路
主、干支道交替允许通行,主干道每次放行45秒,支干道每次放行25秒,由黄转绿的过程中要亮5秒红灯。
分析可以得到,主干道绿灯亮45秒,黄灯亮5秒,红灯亮25秒。
而且对应于主干道这一过程,支干道依次亮45秒红灯,25秒绿灯,5秒黄灯。
1.2、分频器的设计
试验箱上提供的最小信源信号频率是2赫兹,而红绿灯系统的设计是秒计时,需要1赫兹的信号,因此需要对试验箱提供的2赫兹信号进行二分频。
本设计中利用T触发器对信源信号二分频。
具体实现步骤为:
设置信号cp,每当信源信号clk的上升沿到来一次,cp取反翻转一次,从而实现二分频。
1.3、红绿灯转换的设计
设置一个计时器,cp信号上升沿每到来一次,计时器加1。
因为红绿黄灯完成一次转换的时间是75秒,所以设计计时器计时达到75秒时自动清零,重新计时。
设从计时器开始计时,主干道的状态为绿、黄、红,相应的支干道的状态为红、绿、黄。
从计时器开始计时为起点,设置时间轴,根据时间判断亮红灯还是绿灯、黄灯。
判断规则是:
对于主干道,当时间countnum小于45秒,绿灯亮;当时间大于等于45秒小于50秒,黄灯亮;当时间大于等于50秒,红灯亮。
其中,时间等于45秒和50秒处是绿黄灯、黄红灯转换点。
同理,对于支干道,当时间countnum小于45秒时,红灯亮;当时间大于等于45秒小于70秒时,绿灯亮;当时间大于等于70秒时,黄灯亮。
其中,时间等于5秒和70秒处是红绿灯,绿黄等转换点。
主干道和支干道用同一个计时器计时,用两个进程分别判断。
1.4、交通计时的设计
数码管是减计时显示灯亮剩余时间。
设置信号numA,numB分别计算主干道和支干道上灯亮剩余时间。
因为绿灯亮45秒,黄灯亮5秒,红灯亮25秒,所以在时间轴上,当主干道绿灯亮时,numA等于45减countnum,黄灯亮时,numA等于50减countnum,红灯亮时numA等于75减countnum。
当支干道上红灯亮时,numB等于45减countnum,绿灯亮时,numB等于70减countnum,黄灯亮时,numB等于75减countnum。
从而实现倒计时的功能。
5、数码管的设计
每条道路上有两个数码管,分别显示倒计时时间的十位和个位。
利用10整除倒计时时间得到十位上数字,对时间求余得到个位上数字。
结合数码管的管脚信息,利用状态机将十进制数字和驱动数码管显示的七位二进制码一一对应起来。
三、课程设计总结
1.1在这次课程设计中我学到很多理论之外的东西,EDA这门课程的实用性很强。
这次课程设计就是一个列子,平时看到红绿灯没觉得制作是需要很多的知识,这次做了交通灯的设计之后发现需要大量的EDA书本上的知识。
这次的课程设计就相当于把平时的一些小实验和知识点全部综合起来得到的结果,经历过这次的课程设计之后我明白了,如果平时不认真学号一些基础知识,到最后是根本做不出来的。
同时我也在网上查找了很多资料,从之前的不会到慢慢的学会看代码,改代码和写代码。
1.2设计的时候需要先理解红绿黄这三个灯的跳转,还有数码管的显示,和计算器的倒计时。
在进行实验仿真的时候,我第一次做的是直接显示十进制的数字,但是在最后匹配管脚的时候匹配不了,所以我自己重新改了代码,改成二进制输出,此时仿真实验图显示的是十进制转换成二进制的数,我坚信是对的,所以我最后在实验箱里出现了正确的现象。
我觉得自己应该相信自己。
五、参考文献
[1]胡正伟,谢志远,范寒柏编著.电子设计自动化.中国电力出版社
[2]邹彦编著.EDA技术与数字系统设计.2007年.北京:
电子工业出版社.
[3]潘松,黄继业编著.EDA技术与VHDL(第二版).2007年.北京:
清华大学出版社.
[4]王锁萍编著.电子设计自动化教程.2000年.成都:
电子科技大学出版社.
附录
1.红绿灯显示示意图
主干道
绿灯45秒
黄灯5秒
红灯25秒
支干道
红灯45秒
绿灯25秒
黄灯5秒
2.交通灯控制系统框图
3.程序
libraryieee;
useieee.std_logic_1164.all;
entitypbd_16is
port(clk:
instd_logic;
redA,greenA,yellowA:
outstd_logic;
redB,greenB,yellowB:
outstd_logic;
seg1,seg2,seg3,seg4:
outstd_logic_vector(6downto0));
endentitypbd_16;
architecturertlofpbd_16is
signalcp:
std_logic;
signalcountnum:
integerrange0to75:
=0;
signalnumA,numB:
integerrange0to45;
signalnumA1,numB1:
integerrange0to4;
signalnumA2,numB2:
integerrange0to9;
begin
process(clk)
begin
ifclk'eventandclk='1'thencp<=notcp;
endif;
endprocess;
process(cp)
begin
ifcp'eventandcp='1'then
ifcountnum=75then
countnum<=0;
else
countnum<=countnum+1;
endif;
endif;
endprocess;
process(cp)
begin
ifcountnum<45then
redA<='0';
greenA<='1';
yellowA<='0';
numA<=45-countnum;
elsifcountnum<50then
redA<='0';
greenA<='0';
yellowA<='1';
numA<=50-countnum;
else
redA<='1';
greenA<='0';
yellowA<='0';
numA<=75-countnum;
endif;
endprocess;
process(cp)
begin
ifcountnum<45then
redB<='1';
greenB<='0';
yellowB<='0';
numB<=45-countnum;
elsifcountnum<70then
redB<='0';
greenB<='1';
yellowB<='0';
numB<=70-countnum;
else
redB<='0';
greenB<='0';
yellowB<='1';
numB<=75-countnum;
endif;
endprocess;
process(cp)
begin
numB1<=numB/10;
numB2<=numBrem10;
numA1<=numA/10;
numA2<=numArem10;
endprocess;
process(numA1)
begin
casenumA1is
when0=>seg1<="1111110";
when1=>seg1<="0110000";
when2=>seg1<="1101101";
when3=>seg1<="1111001";
when4=>seg1<="0110011";
endcase;
endprocess;
process(numA2)
begin
casenumA2is
when0=>seg2<="1111110";
when1=>seg2<="0110000";
when2=>seg2<="1101101";
when3=>seg2<="1111001";
when4=>seg2<="0110011";
when5=>seg2<="1011011";
when6=>seg2<="0011111";
when7=>seg2<="1110000";
when8=>seg2<="1111111";
when9=>seg2<="1111011";
endcase;
endprocess;
process(numB1)
begin
casenumB1is
when0=>seg3<="1111110";
when1=>seg3<="0110000";
when2=>seg3<="1101101";
when3=>seg3<="1111001";
when4=>seg3<="0110011";
endcase;
endprocess;
process(numB2)
begin
casenumB2is
when0=>seg4<="1111110";
when1=>seg4<="0110000";
when2=>seg4<="1101101";
when3=>seg4<="1111001";
when4=>seg4<="0110011";
when5=>seg4<="1011011";
when6=>seg4<="0011111";
when7=>seg4<="1110000";
when8=>seg4<="1111111";
when9=>seg4<="1111011";
endcase;
endprocess;
endarchitecturertl;
题目二:
数字频率计设计
一、实验目的
学习并掌握数字频率计原理、设计、分析和测试方法。
二、实验内容
用高频率信号检测低频率的信号,通过对高频率脉冲个数的计数得到低频率信号的频率。
(高频率信号的频率为已知,低频率信号为所测量值)。
或用低频率信号检测高频率信号(低频率信号的频率为已知,高频率信号为所测值)。
三、实验要求
1.用7段数码管显示频率值。
2.频率值用十进制表示。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityldz_11is
port(clk1,rst,setsec,setmin,sethour:
instd_logic;
sec1,sec0,min1,min0,hr1,hr0:
bufferstd_logic_vector(3downto0);
speaker:
outstd_logic;
a1,a2,a3,a4,a5,a6:
outstd_logic;
b1,b2,b3,b4,b5,b6:
outstd_logic;
c1,c2,c3,c4,c5,c6:
outstd_logic;
h1,h2,h3,h4,h5,h6:
outstd_logic;
e1,e2,e3,e4,e5,e6:
outstd_logic;
f1,f2,f3,f4,f5,f6:
outstd_logic;
g1,g2,g3,g4,g5,g6:
outstd_logic;
dot:
outstd_logic);
endentityldz_11;
architectureoneofldz_11is
componentledis
port(data:
instd_logic_vector(3downto0);
a,b,c,d,e,f,g:
outstd_logic);
endcomponentled;
signaltmp,clk:
std_logic;
begin
p0:
process(clk)--分频注释见①
variablecount:
std_logic_vector(1downto0);
begin
if(clk1'eventandclk1='1')then
if(count="10")then
count:
=(others=>'0');
tmp<=nottmp;else
count:
=count+1;
endif;
endif;
endprocessp0;clk<=tmp;
p1:
process(clk,rst,setsec,setmin,sethour)--校时注释见②
variables1,s0,m1,m0,h1,h0:
std_logic_vector(3downto0);
begin
ifclk'eventandclk='1'then
ifrst='1'then
ifsetsec='1'then
s0:
=s0+1;
ifs0="1010"thens0:
="0000";
s1:
=s1+1;
ifs1="0110"then
s1:
="0000";
endif;
endif;
endif;
ifsetmin='1'
thenm0:
=m0+1;
ifm0="1010"
thenm0:
="0000";
m1:
=m1+1;
ifm1="0110"
thenm1:
="0000";
endif;
endif;
endif;
ifsethour='1'then
h0:
=h0+1;
ifh0="1010"then
h0:
="0000";
h1:
=h1+1;
ifh0="0100"andh1="0010"thenh0:
="0000";h1:
="0000";
endif;
endif;
endif;
elses0:
=s0+1;--秒,分、时的计时注释见③
ifs0="1010"thens0:
="0000";
s1:
=s1+1;
ifs1="0110"thens1:
="0000";
m0:
=m0+1;
ifm0="1010"thenm0:
="0000";
m1:
=m1+1;
ifm1="0110"
thenm1:
="0000";
h0:
=h0+1;
ifh0="1010"thenh0:
="0000";
h1:
=h1+1;
ifh0="0100"andh1="0010"
thenh1:
="0000";
h0:
="0000";
endif;
endif;
endif;
endif;
endif;
endif;
endif;
sec0<=s0;
sec1<=s1;
min0<=m0;
min1<=m1;
hr0<=h0;
hr1<=h1;
endif;
ifclk1'eventandclk1='1'then--报时注释见④
ifm1="0101"andm0="1001"ands1="0101"then
ifs0="0101"ors0="0110"ors0="0111"ors0="1000"ors0="1001"thenspeaker<='1';
elsespeaker<='0';
endif;
endif;
endif;
endprocess;
led1:
ledportmap(data=>sec0,
a=>a1,
b=>b1,
c=>c1,
d=>h1,
e=>e1,
f=>f1,
g=>g1);
led2:
ledportmap(data=>sec1,
a=>a2,
b=>b2,
c=>c2,
d=>h2,
e=>e2,
f=>f2,
g=>g2);
led3:
ledportmap(data=>min0,
a=>a3,
b=>b3,
c=>c3,
d=>h3,
e=>e3,
f=>f3,
g=>g3);
led4:
ledportmap(data=>min1,
a=>a4,
b=>b4,
c=>c4,
d=>h4,
e=>e4,
f=>f4,
g=>g4);
led5:
ledportmap(data=>hr0,
a=>a5,
b=>b5,
c=>c5,
d=>h5,
e=>e5,
f=>f5,
g=>g5);
led6:
ledportmap(data=>hr1,
a=>a6,
b=>b6,
c=>c6,
d=>h6,
e=>e6,
f=>f6,
g=>g6);
endarchitectureone;