|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
问题:设计并实现一十字路口的红、绿、黄三色交通灯控制与显示电路,即每个路口设置一组红、黄、绿交通灯,按图1所示情况变化,以保证车辆、行人通行安全。 系统工作时,东西方向绿灯亮时,南北方向红灯亮,该信号灯点亮时间可自由设定(设定范围为00~99s),同时点亮时间进行倒计时显示;当时间减为00时,东西方向绿灯熄灭,黄灯同时点亮,并维持数秒,南北方向仍为红灯亮;当倒计时显示减为00时,东西方向红灯亮,南北方向绿灯亮,点亮时间仍可自由设定;当倒计时显示减为00时,南北方向绿灯熄灭,黄灯同时点亮,并维持数秒,东西方向仍为红灯亮。当倒计时显示减为00时,系统状态进入下一个周期,以后周而复始的循环。 特殊状态如紧急车辆随时通行功能受一开关控制,无急车时,信号灯按正常时序控制。有急车来时,将特殊状态开关按下,不管原来信号灯的状态如何,一律强制让两个方向的红灯同时点亮,禁止其它车辆通行,同时计时停止;特殊状态结束后,恢复原来状态继续运行。 控制电路在任何时候可根据实际情况修改信号灯点亮时间。 交通灯控制电路发出警报,说明各路口交通灯同时熄灭或点亮的情况不符合预定要求。
三、设计任务与要求
正常情况下,十字路口的红、绿、黄三色信号交通灯有如图1所示4种情况,假设东西方向的绿灯点亮时间为Te ,同时也是南北方向的禁行时间;南北方向的绿灯点亮时间为Ts ,同时也是东西方向的禁行时间;此外,东西、南北方向的黄灯点亮时间均为Ty 。
1.参考图1,定义交通灯的状态,确定状态表;
2.根据实际交通灯转换过程,设计交通灯的状态转换图;
3.按交通灯的功能要求,设计系统的电路模块图。
我写的程序如下:请高手帮忙指点,谢谢!!!!!!
/*
blue 00_11_11
yellow 11_00_11
blue 11_11_00
0 bu liang
1 liang
*/
module traffic(led_l,led_r,clk,seg_reg1,seg_reg2,inter_key,key1,key2);
input clk,inter_key,key1,key2;
output [6:0] seg_reg1,seg_reg2;
output [5:0] led_l,led_r;
reg [6:0] dispdat1,dispdat2,seg_reg1,seg_reg2;
reg [6:0] reg_dispdat1,reg_dispdat2;
reg [25:0] count;
reg [1:0] led_yellow_l;
reg [1:0] led_blue_l;
reg [1:0] led_red_l;
reg [5:0] led_reg_l;
reg [1:0] led_yellow_r;
reg [1:0] led_blue_r;
reg [1:0] led_red_r;
reg [5:0] led_reg_r;
reg [3:0] flag_shuma0,flag_shuma1;
reg [5:0] flag_led_l,flag_led_r;
reg flag;
reg [1:0] flag_rgy_status;
reg sec;
reg [1:0] rgy_status;
reg [7:0] rgy_time_l,rgy_time_s,rgy_time,rgy_time_init;
initial
begin
flag_rgy_status=2'd0;
rgy_time_init=8'h30; //set status 0 initial time,long time.
rgy_time_l=rgy_time_init;
rgy_time_s=8'h21;
led_reg_l=6'b000000;
led_reg_r=6'b000000;
flag=1'b0;
end
////////////////////////output 2HZ clk/////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
always @(posedge clk)
begin
/*
if(flag==1'b1)
begin
//rgy_time_l=8'h0;
end
else*/
begin
count=count+1;
if(count==26'd800_0000) //should be 2500_0000
begin
count=0;
sec=~sec; //2 HZ
end
end
end
///////////////////////////////status 0,long time/////////////////////////////////////////////////
always @(posedge sec)
begin
if(rgy_status==2'd0)
begin
if(rgy_time_l==8'h0) //status 1
begin
rgy_status=2'd1;
//rgy_time_l=8'h30;
rgy_time_s=8'h21; //set status 1 time,short time
//led_red=led_reg[3:0];
end
else
begin
led_reg_l=6'b110000; //blue
led_reg_r=6'b000011; //red
rgy_time_l=rgy_time_l-1'b1; //status 0,long time.
if(rgy_time_l[3:0]>9)
rgy_time_l[3:0]=9;
end
flag_shuma0=rgy_time_l[3:0];
flag_shuma1=rgy_time_l[7:4];
end
////////////////////////////////////status 1,short time/////////////////////////////////////////////
if(rgy_status==2'd1)
begin
if(rgy_time_s==8'h0) //status 2
begin
rgy_status=2'd2;
rgy_time_l=rgy_time_init; //set status 2 time,long time.
end
else
begin
led_reg_l=6'b001100; //yellow
led_reg_r=6'b000011; //red
rgy_time_s=rgy_time_s-1; //status 1,short time
if(rgy_time_s[3:0]>9)
rgy_time_s[3:0]=9;
end
flag_shuma0=rgy_time_s[3:0];
flag_shuma1=rgy_time_s[7:4];
end
////////////////////////////////////status 2,long time//////////////////////////////////////
if(rgy_status==2'd2)
begin
if(rgy_time_l==8'h0) //status 3
begin
rgy_status=2'd3;
rgy_time_s=8'h21; //set status 3 time,short time.
rgy_time_l=rgy_time_init;
end
else
begin
led_reg_l=6'b000011; //red
led_reg_r=6'b110000; //blue
rgy_time_l=rgy_time_l-1; //status 2,long time.
if(rgy_time_l[3:0]>9)
rgy_time_l[3:0]=9;
end
flag_shuma0=rgy_time_l[3:0];
flag_shuma1=rgy_time_l[7:4];
end
//////////////////////////////////status 3///////////////////////////////////////////
if(rgy_status==2'd3)
begin
if(rgy_time_s==8'h0)
begin
rgy_status=2'd0; //return to status 0
rgy_time_l=rgy_time_init; //set status 0 time,long time.
//rgy_time_s=8'h21;
end
else
begin
led_reg_l=6'b000011; //red
led_reg_r=6'b001100; //yellow
rgy_time_s=rgy_time_s-1; //status 3,short time
if(rgy_time_s[3:0]>9)
rgy_time_s[3:0]=9;
end
flag_shuma0=rgy_time_s[3:0];
flag_shuma1=rgy_time_s[7:4];
end
end
////////////////////////////xian shi ji shi///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////key sscan(red------->red)/////////////////////////////////////////////
always
begin
dispdat1=flag_shuma0; //zhi shi zhong sui zhe sec bian hua
dispdat2=flag_shuma1; //zhi shi zhong sui zhe sec bian hua
if(inter_key==0) //jin ji kai guan 0 wei an xia
begin
flag_led_l=led_reg_l;
flag_led_r=led_reg_r;
reg_dispdat1=dispdat1;
reg_dispdat2=dispdat2;
end
else //jin ji kai guan 1 an xia
begin
//dispdat1=4'h10; //close led slow
//dispdat2=4'h10; //close led high
flag_led_l=6'b000011;
flag_led_r=6'b000011;
flag=1'b1;
if(key1!=0) //not push the key1
begin
end
else //push the key1
begin
//reg_dispdat1=reg_dispdat1+1;
rgy_time_init[3:0]=rgy_time_init[3:0]+1'b1;
if(rgy_time_init[3:0]>4'h9)
rgy_time_init[3:0]=4'h0;
reg_dispdat1=rgy_time_init[3:0];
end
if(key2!=0) //not push the key1
begin
end
else //push the key1
begin
//reg_dispdat2=reg_dispdat2+1;
rgy_time_init[7:4]=rgy_time_init[7:4]+1'b1;
if(rgy_time_init[7:4]>4'h9)
rgy_time_init[7:4]=4'h0;
reg_dispdat2=rgy_time_init[7:4];
end
end
end
/////////////////////////////////////////////////////////////////////////////////////
///////////////////////////led display///////////////////////////////////////
always @(reg_dispdat1)
begin
case(reg_dispdat1)
4'h0:seg_reg1=7'b1000000;//0
4'h1:seg_reg1=7'b1111001;//1
4'h2:seg_reg1=7'b0100100;//2
4'h3:seg_reg1=7'b0110000;//3
4'h4:seg_reg1=7'b0011001;//4
4'h5:seg_reg1=7'b0010010;//5
4'h6:seg_reg1=7'b0000010;//6
4'h7:seg_reg1=7'b1111000;//7
4'h8:seg_reg1=7'b0000000;//8
4'h9:seg_reg1=7'b0010000;//9
4'h10:seg_reg1=7'b1111111;//not display
endcase
end
//////////////////////////////////////////////////////////////////////////////////////////
always @(reg_dispdat2)
begin
case(reg_dispdat2)
4'h0:seg_reg2=7'b1000000;//0
4'h1:seg_reg2=7'b1111001;//1
4'h2:seg_reg2=7'b0100100;//2
4'h3:seg_reg2=7'b0110000;//3
4'h4:seg_reg2=7'b0011001;//4
4'h5:seg_reg2=7'b0010010;//5
4'h6:seg_reg2=7'b0000010;//6
4'h7:seg_reg2=7'b1111000;//7
4'h8:seg_reg2=7'b0000000;//8
4'h9:seg_reg2=7'b0010000;//9
4'h10:seg_reg2=7'b1111111;//not display
endcase
end
assign led_l=flag_led_l;
assign led_r=flag_led_r;
endmodule
|
|