验证中...
10月20日,北京【人工智能】源创会火热报名中,点击报名收获 AI 训练指南
语言: 其他
分类: 其他
最后更新于 2018-01-14 13:12
先实现一个路口的控制模块,该模块包括复位状态、正常工作状态、紧急状态和信号灯测试状态,然后再用该模块构成一个十字路口的控制系统。
原始数据 复制代码
/*******************************************************单个路口************************************************************/
module traffic_con(clk,reset_n,prim_flag,red_time,green_time,yellow_time,wait_time,ryg_light,emergency,test);
parameter on=1'b1,off=1'b0;
input clk,reset_n;
input prim_flag;
input[7:0] red_time,green_time,yellow_time;
input emergency,test;
output reg[7:0] wait_time;
output reg[2:0] ryg_light;
reg cnt;
reg[7:0] ticks,n;
reg[1:0] s,state;
always@(posedge clk) //clk上升沿触发
begin
if(~reset_n) //复位处理
begin
state<=2'b10;
ryg_light<={off,off,off}; //所有灯灭
cnt<=1'b0;
s<=2'b00;
ticks<=8'b0;
n<=0;
if(prim_flag)
s<=2'b00;
else
s<=2'b10;
ticks<=8'b0;
n<=1;
end
else if(emergency) //紧急状态处理
begin
state<=2'b00;
ryg_light<={on,on,off}; //红、黄灯同时亮
end
else if(test) //测试状态处理
begin
state<=2'b01;
if(~cnt)
ryg_light<={on,on,on}; //灯全亮
else
ryg_light<={off,off,off}; //灯全灭
end
else //正常工作状态处理
begin
state<=2'b11;
case(s) //当前子状态信号灯处理
2'b00:ryg_light<={off,off,on}; //绿灯亮
2'b01:ryg_light<={off,on,off}; //黄灯亮
2'b10:ryg_light<={on,off,off}; //红灯亮
endcase
end
wait_time<=(state==2'b11)?ticks-n+1:8'h88; //计算倒计时时间
end
always@(s or state) //子状态发生变化时计时时间处理
if(state==2'b11)
case(s)
2'b00:ticks=green_time;
2'b01:ticks=yellow_time;
2'b10:ticks=red_time;
endcase
always@(posedge clk) //cnt是为了实现闪烁处理功能
cnt<=~cnt;
always@(posedge clk)
if(state==2'b11)
begin
if(n==ticks)
begin //子状态切换处理
if(s==2'b10)
s<=2'b00;
else
s<=s+1;
n<=1;
end
else
n<=n+1; //当前时钟计数
end
endmodule
/**********************************************单个路口的Testbench激励文件*****************************************************/
`timescale 10ns/1ns;
module traffic_con_tb;
reg clk,reset_n,prim_flag,emergency,test;
reg[7:0] red_time,green_time,yellow_time;
wire[7:0] wait_time;
wire[2:0] ryg_light;
traffic_con my_tra_con(clk,reset_n,prim_flag,red_time,green_time,yellow_time,wait_time,ryg_light,emergency,test);
initial
begin
clk=0;
emergency=0;
test=0;
red_time=9;
green_time=6;
yellow_time=2;
end
always
begin
#5 clk=1'b1;
#5 clk=1'b0;
end
initial
begin
reset_n=0;
prim_flag=1;
#20 reset_n=1;
#600 $finish;
end
endmodule
/**************************************************************双向路口*******************************************/
module traffic_top(clk,reset_n,prim_red_time,prim_green_time,prim_yellow_time,prim_wait_time,
seco_wait_time,prim_ryg_light,seco_ryg_light,emergency,test);
input clk,reset_n;
input[7:0] prim_red_time,prim_green_time,prim_yellow_time;
input emergency,test;
output[7:0] prim_wait_time,seco_wait_time;
output[2:0] prim_ryg_light,seco_ryg_light;
wire[7:0] seco_red_time,seco_green_time;
assign seco_red_time=prim_green_time+prim_yellow_time; //计算次干道红灯时间
assign seco_green_time=prim_red_time-prim_yellow_time; //计算次干道绿灯时间
traffic_con primary_light(clk,reset_n,1'b1,prim_red_time,prim_green_time,prim_yellow_time,
prim_wait_time,prim_ryg_light,emergency,test);//主干道
traffic_con secondary_light(clk,reset_n,1'b0,seco_red_time,seco_green_time,prim_yellow_time,
seco_wait_time,seco_ryg_light,emergency,test);//次干道
endmodule
/*****************************************************************双向路口的Testbench激励文件****************************************/
`timescale 10ns/1ns;
module traffic_top_tb;
reg clk,reset_n;
reg[7:0] prim_red_time,prim_green_time,prim_yellow_time;
reg emergency,test;
wire[7:0] prim_wait_time,seco_wait_time;
wire[2:0] prim_ryg_light,seco_ryg_light;
traffic_top my_tra_top(clk,reset_n,prim_red_time,prim_green_time,prim_yellow_time,prim_wait_time,
seco_wait_time,prim_ryg_light,seco_ryg_light,emergency,test);
initial
begin
clk=0;
emergency=0;
test=0;
prim_red_time=6;
prim_green_time=9;
prim_yellow_time=2;
end
always
begin
#5 clk=1'b1;
#5 clk=1'b0;
end
initial
begin
reset_n=0;
#20 reset_n=1;
#600 $finish;
end
endmodule

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助