eda交通灯设计和实现Word文件下载.docx
《eda交通灯设计和实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《eda交通灯设计和实现Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
本模块实现交通灯控制器的逻辑功能。
//*********************************************************
//**交通灯控制器
moduletraffic(clock,rst_n,clken,lampa,lampb,acount,bcount);
inputclock;
//系统时钟50MHz
inputrst_n;
//同步复位信号,低电平有效
inputclken;
//时钟使能信号:
1Hz。
output[2:
0]lampa;
//控制A方向三盏灯的亮灭;
其中lampa[2:
0]分
//别控制A方向的绿灯、黄灯、红灯(低电平灯亮)
0]lampb;
//控制B方向三盏灯的亮灭;
其中lampb[2:
//别控制B方向的绿灯、黄灯、红灯(低电平灯亮)
output[7:
0]acount;
//用于A方向灯的时间显示,8位BCD码输出
0]bcount;
//用于B方向灯的时间显示,8位BCD码输出
reg[2:
0]lampa,lampb;
reg[7:
0]numa,numb;
//时间计数器
regtempa,tempb;
//防重进入标志
0]StateA,StateB;
//A、B方向灯控制状态机的状态
//设置各种灯的计数器的预置数
parameterared=8'
h30,//30秒
ayellow=8'
h5,//5秒
agreen=8'
h15,//15秒
bred=8'
h20,//20秒
byellow=8'
bgreen=8'
h25;
//25秒
assignacount=numa;
assignbcount=numb;
//控制A方向的三种灯
always@(posedgeclockornegedgerst_n)
begin
if(!
rst_n)
StateA<
=3'
h0;
lampa<
b011;
tempa<
=1'
b0;
end
elseif(clken)
tempa)
b1;
case(StateA)//控制亮灯的顺序
0:
beginnuma<
=agreen;
lampa<
StateA<
=1;
end
1:
=ayellow;
b101;
=2;
2:
=ared;
b110;
=0;
default:
endcase
else
begin//倒计时
if(numa>
1)
if(numa[3:
0]==0)
numa[3:
0]<
=4'
h9;
numa[7:
4]<
=numa[7:
4]-4'
h1;
=numa[3:
0]-4'
if(numa==2)
tempa<
=1'
lampb<
=3'
StateB<
tempb<
elseif(clken)
tempb)
case(StateB)//控制亮灯的顺序
beginnumb<
=bred;
lampb<
StateB<
=1;
=bgreen;
=2;
=byellow;
=0;
if(numb>
if(numb[3:
numb[3:
numb[7:
=numb[7:
=numb[3:
if(numb==2)
tempb<
endmodule
2)显示控制程序,文件名为traffic.v
本模块实现交通灯倒计时的显示并产生1HZ的时钟使能信号。
//**交通灯控制器显示模块
//**功能:
显示交通灯时间,并产生1Hz时钟使能信号,
moduletraffic_test(clock,clken,rst_n,acount,bcount,seg,dig);
//系统时钟(50MHz)
outputclken;
input[7:
0]seg;
//数码管段码输出
0]dig;
//数码管位码输出
//I/O寄存器
0]seg;
0]dig;
//内部寄存器
reg[25:
0]clk_cnt;
reg[16:
0]count;
//时钟分频计数器
reg[1:
0]cnt;
//数码管扫描计数器
reg[3:
0]disp_dat;
//数码管扫描显存
wirediv_clk;
//分频时钟
//产生1Hz时钟使能信号
always@(posedgeclock)
if(clken)
clk_cnt<
=26'
=clk_cnt+26'
assignclken=(clk_cnt>
d49999999);
//时钟分频进程,用于数码管扫描显示
count<
=count+1'
assigndiv_clk=&
count;
//数码管扫描显示部分
if(div_clk)
cnt<
=cnt+1'
case(cnt)//选择扫描显示数据
2'
d0:
disp_dat<
=acount[7:
4];
//第一个数码管
d1:
=acount[3:
0];
//第二个数码管
d2:
=bcount[7:
//第五个数码管
d3:
=bcount[3:
//第六个数码管
case(cnt)//选择数码管显示位
dig<
=8'
b01111111;
//选择第一个数码管显示
b10111111;
//选择第二个数码管显示
b11110111;
//选择第五个数码管显示
b11111011;
//选择第六个数码管显示
always@(disp_dat)
case(disp_dat)//七段译码
4'
h0:
seg=8'
hc0;
//显示0
h1:
hf9;
//显示1
h2:
ha4;
//显示2
h3:
hb0;
//显示3
h4:
h99;
//显示4
h5:
h92;
//显示5
h6:
h82;
//显示6
h7:
hf8;
//显示7
h8:
h80;
//显示8
h9:
h90;
//显示9
ha:
h88;
//显示a
hb:
h83;
//显示b
hc:
hc6;
//显示c
hd:
ha1;
//显示d
he:
h86;
//显示e
hf:
h8e;
//显示f
2)顶层模块,文件名为traffic-top.v
本模块将traffic.v及traffic-test.v进行封装。
//**交通灯控制器顶层程序
moduletraffic_top(clock,rst_n,seg,dig,lampa,lampb);
//系统时钟(48MHz)
//复位信号,低电平有效
//A方向红绿灯
//B文向红绿灯
//内部线网
wireclken;
wire[7:
//交通灯控制模块
traffictraffic(
.clock(clock),
.rst_n(rst_n),
.clken(clken),
.lampa(lampa),
.lampb(lampb),
.acount(acount),
.bcount(bcount)
);
//显示模块
traffic_testtraffic_test(
.bcount(bcount),
.seg(seg),
.dig(dig)
Endmodule
二仿真波形
三照片等文件
四方框图
五参考资料