EDA课程设计交通灯.docx
- 文档编号:6255808
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:15
- 大小:415.69KB
EDA课程设计交通灯.docx
《EDA课程设计交通灯.docx》由会员分享,可在线阅读,更多相关《EDA课程设计交通灯.docx(15页珍藏版)》请在冰豆网上搜索。
EDA课程设计交通灯
1、设计要求---------------------------------------03
2、设计规划方案-----------------------------------04
1试验箱部分--------------------------------04
1整体规划--------------------------------------04
2功能划分与模块划分----------------------------05
3各模块的实现方法、技术、要点------------------08
4程序的编写------------------------------------09
5仿真与调试------------------------------------14
2实验板部分--------------------------------15
1整体规划---------------------------------------15
2程序的编写-------------------------------------15
3仿真与调试-------------------------------------17
4设计中出现的问题及优化与改进-------------------17
3、任务完成情况及个人心得体会---------------------18
4、指导老师评价-----------------------------------19
注意:
后面所附程序仅供参考,为减小下载文件大小,此程序中将交通灯的周期进行了压缩,为主干道红灯4s黄灯2s绿灯4s,次干道红灯6s黄灯2s绿灯2s,可根据实际要求进行修改。
一、设计要求
1、基本要求:
1、主干道通行(绿灯):
主干道行车4秒;支路红灯,停车6s,数码管显示倒计时的秒,秒计时的频率为1Hz。
2、主干道缓冲(黄灯):
2秒,不显示计数,秒计时的频率为1HZ。
3、支路通行(绿灯):
2秒,主干道红灯,数码管显示倒计时的秒,秒计时的频率为1Hz。
4、支路缓冲(黄灯):
2秒,不显示计数,秒计时的频率为1HZ。
数码管采用动态显示。
2、其他要求:
1、晶振为12MHz。
2、采用CPLD器件为MAX7000AE的EPM7064AEL144_7。
3、采用数码管显示。
二、设计方案规划
1、实验箱部分
<1>、整体规划(确定输入与输出)
a、实验箱管脚
inputclk_lk,一个时钟输入
output[7:
0]seg,控制数码管显示数据
output[7:
0]dig,控制4个数码管的输出,高2位输出支路计时,低2位输出主干路计时。
output[5:
0]led,控制着主干路和支路的6个灯
<2>功能划分与模块划分
本程序由分频器,数码管动态显示程序,计数器,灯转换控制电路实现,可以大致分为4个模块或者4个过程语句实现。
第一部分实现分频功能,第二部分实现路灯控制功能,第三部分实现计时转换功能。
各功能和各模块的功能细分。
本程序主要由3个always过程块实现,其中第一个always块实现分频功能,if(clk_cnt==24'd12000000)代表晶振为12MHZ;第二个always过程块用来实现A方向灯控制,第三个always块用来实现B方向灯控制。
其中,第二个和第三个always块用来处理交通灯的计时,灯转换过程,是本程序的主要部分,其功能影响本程序的准确性,计数大致如图:
路别
绿灯
黄灯
红灯
主干道
4s
2s
4s
支干道
2s
2s
6s
<3>各模块的实现方法,技术、要点
第一个always过程块实现分频,可以用一个12MHZ分频器来实现,其中sec为分频器的输出端,以后调用sec实现分频功能,count为计数寄存器,用来计数12M,每计12M个数后就将sec取反用来表示分频结果;
第二个always块用来显示数码管动态扫描,将miao定义为输入要显示的数据,第一个case(count[16:
15])选择扫描显示数据,第二个case(count[16:
15])选择数码管显示位,两位可以有4种选择0,1,2,3分别对应4种不同状态;
第四个always块用来实现路灯控制以及计数,其中if(lampa==0)代表主干路,if(lampb==0)代表支路,lamp=3'bXXX代表要显示的灯,这里用代替实际交通灯,agreen,ayellow,ared分别代表主干绿灯,黄灯,红灯,bgreen,byellow,bred分别代表支路绿灯,黄灯,红灯,numa或numb可以用来表示一种计数状态,满足这种状态时可以改变灯的颜色以及计数时间。
<4>程序的编写
①交通灯控制模块
module
traffic(clk_lk,rst,clk,lampa,lampb,acount,bcount);
inputclk_lk,rst,clk;//产生系统时钟,复位信号,1s时钟信号
output[2:
0]lampa,lampb;//led灯(红黄绿)
output[7:
0]acount,bcount;//数码管倒计时显示
reg[2:
0]lampa,lampb;
reg[7:
0]numa,numb;
regtempa,tempb;
reg[2:
0]statea,stateb;//led灯控制
parameterared=8'h4,ayellow=8'h2,agreen=8'h4,
bred=8'h6,byellow=8'h2,bgreen=8'h2;//初始值
assignacount=numa;
assignbcount=numb;
always@(posedgeclk_lkornegedgerst)
begin
if(!
rst)
begin
statea<=3'h0;
lampa<=3'b011;
tempa<=1'b0;
end
elseif(clk)
begin
if(!
tempa)//A方向灯控制
begin
tempa<=1'b1;
case(statea)
0:
beginnuma<=agreen;lampa<=3'b011;statea<=1;end
1:
beginnuma<=ayellow;lampa<=3'b101;statea<=2;end
2:
beginnuma<=ared;lampa<=3'b110;statea<=0;end
default:
lampa<=3'b110;
endcase
end
else
begin//倒计时
if(numa>1)
if(numa[3:
0]==0)
begin
numa[3:
0]<=4'h9;
numa[7:
4]<=numa[7:
4]-4'h1;
end
else
numa[3:
0]<=numa[3:
0]-4'h1;
if(numa==2)
tempa<=1'b0;
end
end
end
always@(posedgeclk_lkornegedgerst)
begin
if(!
rst)
begin
lampb<=3'b110;
stateb<=3'h0;
tempb<=1'b0;
end
elseif(clk)
begin
if(!
tempb)//B方向灯控制
begin
tempb<=1'b1;
case(stateb)
0:
beginnumb<=bred;lampb<=3'b110;stateb<=1;end
1:
beginnumb<=bgreen;lampb<=3'b011;stateb<=2;end
2:
beginnumb<=byellow;lampb<=3'b101;stateb<=0;end
default:
lampb<=3'b110;
endcase
end
else
begin//倒计时
if(numb>1)
if(numb[3:
0]==0)
begin
numb[3:
0]<=4'h9;
numb[7:
4]<=numb[7:
4]-4'h1;
end
else
numb[3:
0]<=numb[3:
0]-4'h1;
if(numb==2)
tempb<=1'b0;
end
end
end
endmodule
②数码管显示控制模块
moduletraffic_test(clk_lk,clk,rst,acount,bcount,seg,dig);
inputclk_lk;
inputrst;
outputclk;
input[7:
0]acount;
input[7:
0]bcount;
output[7:
0]seg;
output[7:
0]dig;
reg[7:
0]seg;
reg[7:
0]dig;
reg[25:
0]clk_cnt;
reg[16:
0]count;
reg[1:
0]cnt;
reg[3:
0]disp_dat;
always@(posedgeclk_lk)
begin
if(clk)
clk_cnt<=26'h1;
else
clk_cnt<=clk_cnt+26'h1;
end
assignclk=(clk_cnt>=26'd48000000);
always@(posedgeclk_lk)
begin
count<=count+1'b1;
end
assigndiv_clk=&count;
always@(posedgeclk_lk)
begin
if(div_clk)
cnt<=cnt+1'b1;
end
always@(posedgeclk_lk)
begin
if(div_clk)
begin
case(cnt)
2'd0:
disp_dat<=acount[7:
4];//选择数码管
2'd1:
disp_dat<=acount[3:
0];
2'd2:
disp_dat<=bcount[7:
4];
2'd3:
disp_dat<=bcount[3:
0];
endcase
case(cnt)
2'd0:
dig<=8'b11111111;//扫描数码管
2'd1:
dig<=8'b10111111;
2'd2:
dig<=8'b11111111;
2'd3:
dig<=8'b11111110;
endcase
end
end
always@(disp_dat)
begin
case(disp_dat)//显示值
4'h0:
seg=8'hc0;//0
4'h1:
seg=8'hf9;//1
4'h2:
seg=8'ha4;//2
4'h3:
seg=8'hb0;//3
4'h4:
seg=8'h99;//4
4'h5:
seg=8'h92;//5
4'h6:
seg=8'h82;//6
4'h7:
seg=8'hf8;//7
4'h8:
seg=8'h80;//8
4'h9:
seg=8'h90;//9
endcase
end
endmodule
③顶层模块
moduletraffic_top(clk_lk,rst,seg,dig,lampa,lampb);
inputclk_lk;
inputrst;
output[2:
0]lampa,lampb;
output[7:
0]seg,dig;
wireclk;
wire[7:
0]acount,bcount;
traffictraffic(
.clk_lk(clk_lk),
.rst(rst),
.clk(clk),
.lampa(lampa),
.lampb(lampb),
.acount(acount),
.bcount(bcount)
);
traffic_testtraffic_test(
.clk_lk(clk_lk),
.clk(clk),
.rst(rst),
.acount(acount),
.bcount(bcount),
.seg(seg),
.dig(dig)
);
endmodule
<5>仿真与调试
1、将程序下载到试验箱,LED灯亮灭符合设计要求,次干道数码管显示正常,符合要求,但主干道数码管部分数据显示混乱,表明程序可能存在错误。
2、经反复调试程序,LED灯显示正常,主、次干道数码管显示正常,符合设计要求。
2、实验板部分
<1>电路板芯片管脚
<2>其他设计要求等与实验箱相同
<3>程序的编写
module
Traffic(clk_lk,rst,lampa,lampb);
inputclk_lk,rst;//产生系统时钟,复位信号,1s时钟信号
output[2:
0]lampa,lampb;//led灯(红黄绿)
reg[2:
0]lampa,lampb;
reg[7:
0]numa,numb;
regtempa,tempb;
reg[2:
0]statea,stateb;//led灯控制
reg[25:
0]clk_cnt;
reg[16:
0]count;
wireclk;
parameterared=8'h4,ayellow=8'h2,agreen=8'h4,
bred=8'h6,byellow=8'h2,bgreen=8'h2;//初始值
always@(posedgeclk_lk)
begin
if(clk)
clk_cnt<=26'h1;
else
clk_cnt<=clk_cnt+26'h1;
end
assignclk=(clk_cnt>=26'd48000000);
always@(posedgeclk_lkornegedgerst)
begin
if(!
rst)
begin
statea<=3'h0;
lampa<=3'b011;
tempa<=1'b0;
end
elseif(clk)
begin
if(!
tempa)//A方向灯控制
begin
tempa<=1'b1;
case(statea)
0:
beginnuma<=agreen;lampa<=3'b011;statea<=1;end
1:
beginnuma<=ayellow;lampa<=3'b101;statea<=2;end
2:
beginnuma<=ared;lampa<=3'b110;statea<=0;end
default:
lampa<=3'b110;
endcase
end
else
begin
if(numa>=1)
if(numa[3:
0]==0)
begin
numa[3:
0]<=4'h9;
numa[7:
4]<=numa[7:
4]-4'h1;
end
else
numa[3:
0]<=numa[3:
0]-4'h1;
if(numa==1)
tempa<=1'b0;
end
end
end
always@(posedgeclk_lkornegedgerst)
begin
if(!
rst)
begin
lampb<=3'b110;
stateb<=3'h0;
tempb<=1'b0;
end
elseif(clk)
begin
if(!
tempb)//B方向灯控制
begin
tempb<=1'b1;
case(stateb)
0:
beginnumb<=bred;lampb<=3'b110;stateb<=1;end
1:
beginnumb<=bgreen;lampb<=3'b011;stateb<=2;end
2:
beginnumb<=byellow;lampb<=3'b101;stateb<=0;end
default:
lampb<=3'b110;
endcase
end
else
begin//倒计时
if(numb>=1)
if(numb[3:
0]==0)
begin
numb[3:
0]<=4'h9;
numb[7:
4]<=numb[7:
4]-4'h1;
end
else
numb[3:
0]<=numb[3:
0]-4'h1;
if(numb==1)
tempb<=1'b0;
end
end
end
endmodule
<4>仿真及调试
1、先将程序在试验箱运行,LED灯亮灭正常,数码管显示正常,符合设计要求。
2、将分频器改成if(clk_cnt==24'd12000000),编译,综合,;然后分配管脚,先在实验室FPGA上硬件调试无误后再把管脚改成对应EPM7064AEL144_7管脚。
<5>设计中出现的问题及优化与改进
设计过程中程序编译好以后在实验箱上能够正常并完整的完成整个设计要求,但是在下载到器件的芯片上时由于芯片容量过小,造成芯片无法完全容纳程序,于是我们这一组的实验采用两个同步计数器在一个时钟频率下实现,减小倒计时循环周期,并删减部分不重要的程序,如数码管显示等,保留较为核心的交通灯指示部分,能够下载到器件的芯片上。
将绿黄红三灯显示总时间由56s减少到10s,此时程序仍过大,无法下载到芯片。
将数码管显示部分的程序去除,此时可以下载到芯片,但灯显示错误,两灯常亮,不会自动变更。
三、任务完成情况及个人心得体会
任务完成情况:
这次课程设计,我们组选择了交通灯控制器这个题目。
最终完成结果为,在实验箱上一切功能正常,符合设计要求。
然而在实验板上始终不成功。
个人心得体会:
通过这次课程设计,我学到了许多。
从拿到题目开始,在我们组成员的共同努力下,我们一起查资料修改程序,一点一点完善程序。
最开始,程序运行错误百出,到之后程序可以顺利编译,但在实验箱上效果不理想,再到后来程序可以在实验箱上得到比较理想的结果,大家都付出了许多。
在这个过程中,我对VerilogHDL语言有了更深的理解,更熟悉Quartus软件的操作与应用。
通过对程序的不断修改,我们慢慢的学会如何去解决问题。
最初我们遇到问题总是想向老师求助,但老师鼓励我们自己去试着解决。
慢慢的我们发现其实很多问题都是我们认真思考之后可以解决的。
课程设计让我学会了许多,比如如何将以前在课堂学到的知识运用到实际中去等等。
希望以后还有这样的实践机会。
四、指导老师评价
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 交通灯