Anda di halaman 1dari 8

Project title: Traffic signals at intersection

with emergency control.


Introduction:-
At this type of intersection only one among the four signals is green while others are
either red or yellow. Each signal goes green sequentially and the process is repeated
continuously. Any signal can be forced to green in case of emergency.

In my code, the output is taken on four 7 segment displays. “r” will represent Red, “y”
will represent Yellow, “g” will represent Green and “b” will represent both Green-Yellow. I have
designed 20 seconds process in which each green will on for 5 seconds, each red will on for 4
seconds and each yellow will on for 1 second.
Signal3 Signal2 Signal1 Signal0 Time Output
(sec)
R R R G 4 rrrg
R R Y YG 5 rryb
R R G R 9 rrgr
R Y YG R 10 rybr
R G R R 14 rgrr
Y YG R R 15 ybrr
G R R R 19 grrr
YG R R Y 20 brry

Block diagram:-
Main module:-
module traffic_signals(LED,an,forced,ready,clock_20ns,start);

output [6:0]LED;
output [3:0]an;
input ready,clock_20ns,start;
input [3:0]forced;
wire clock_1s,clock_4ms;
wire [3:0]data,signal3,signal2,signal1,signal0,m;

timer #(25,25000000) clk_1s(clock_1s, ,clock_20ns,start);


controller ctrl(signal3,signal2,signal1,signal0,forced,ready,clock_1s,start);
timer #(17,100000) clk_4ms(clock_4ms, ,clock_20ns,start);
timer #(2,4) mux_select( ,m,clock_4ms,start);
mux mux_an(an,4'b0111,4'b1011,4'b1101,4'b1110,m);
mux mux_data(data,signal3,signal2,signal1,signal0,m);
LED_multiplex seven_seg(LED,data);

endmodule

Timer module:-
module timer(clock_1s,count,clock_20ns,start);

parameter n = 25;
parameter N = 25000000;
output reg clock_1s = 0;
output reg [n-1:0]count = 0;
input clock_20ns,start;

always @ (posedge clock_20ns)


begin
if(start == 1)
begin
count = count + 1;
if(count == N/2)
begin
clock_1s = ~clock_1s;
end
if(count == N)
begin
count = 0;
end
end
end
endmodule

Controller module:-
module controller(signal3,signal2,signal1,signal0,forced,ready,clock_1s,start);

output reg [3:0]signal3,signal2,signal1,signal0;


reg [4:0]count = 0; // five bit counter to store value 20
input [3:0]forced; // forced input for emergency
input ready,clock_1s,start;

always @ (posedge clock_1s)


begin
if(start == 1)
begin
if(ready == 1)
begin
if(forced == 4'b0000) // when ready then first yellow0
begin yellow1 yellow2 yellow3
signal3 = 4'b0010;
signal2 = 4'b0010;
signal1 = 4'b0010;
signal0 = 4'b0010;
end
if(forced == 4'b0001) // forced0 = green0 red1 red2 red3
begin
signal3 = 4'b0100;
signal2 = 4'b0100;
signal1 = 4'b0100;
signal0 = 4'b0001;
end
if(forced == 4'b0010) // forced1 = red1 green1 red2 red3
begin
signal3 = 4'b0100;
signal2 = 4'b0100;
signal1 = 4'b0001;
signal0 = 4'b0100;
end
if(forced == 4'b0100) // forced2 = red1 red2 green2 red3
begin
signal3 = 4'b0100;
signal2 = 4'b0001;
signal1 = 4'b0100;
signal0 = 4'b0100;
end
if(forced == 4'b1000) // forced3 = red1 red2 red3 green3
begin
signal3 = 4'b0001;
signal2 = 4'b0100;
signal1 = 4'b0100;
signal0 = 4'b0100;
end
end
if(ready == 0) // when no forced
begin
count = count + 1; // increment counter by 1
if(count <= 4)
begin
signal3 = 4'b0100;
signal2 = 4'b0100;
signal1 = 4'b0100;
signal0 = 4'b0001; // green0 red1 red2 red3
end
if(count > 4 && count <= 5)
begin
signal3 = 4'b0100;
signal2 = 4'b0100;
signal1 = 4'b0010;
signal0 = 4'b0011; // green0 yellow0 yellow1 red2 red3
end
if(count > 5 && count <= 9)
begin
signal3 = 4'b0100;
signal2 = 4'b0100;
signal1 = 4'b0001;
signal0 = 4'b0100; // red0 green1 red2 red3
end
if(count > 9 && count <=10)
begin
signal3 = 4'b0100;
signal2 = 4'b0010;
signal1 = 4'b0011;
signal0 = 4'b0100; // red0 green1 yellow1 yellow2 red3
end
if(count > 10 && count <= 14)
begin
signal3 = 4'b0100;
signal2 = 4'b0001;
signal1 = 4'b0100;
signal0 = 4'b0100; // red0 red1 green2 red3
end

if(count > 14 && count <= 15)


begin
signal3 = 4'b0010;
signal2 = 4'b0011;
signal1 = 4'b0100;
signal0 = 4'b0100; // red0 red1 green2 yellow2 yellow3
end
if(count > 15 && count <= 19)
begin
signal3 = 4'b0001;
signal2 = 4'b0100;
signal1 = 4'b0100;
signal0 = 4'b0100; // red0 red1 red2 green3
end
if(count > 19 && count <= 20)
begin
signal3 = 4'b0011;
signal2 = 4'b0100;
signal1 = 4'b0100;
signal0 = 4'b0010; // yellow0 red1 red2 yellow3 green3
count = 0; // reset counter
end
end
end
end
endmodule

Multiplexer module:-
module mux(an,signal3,signal2,signal1,signal0,m);

output reg [3:0]an;


input [3:0]signal3,signal2,signal1,signal0;
input [1:0]m;

always @(*)
begin
case(m[1:0])
2'b00:
an = signal0;
2'b01:
an = signal1;
2'b10:
an = signal2;
2'b11:
an = signal3;
endcase
end

endmodule

LED module:-
module LED_multiplex(LED,data);

output [6:0]LED;
input [3:0]data;

reg [6:0]temp = 0;

always @ (data)
begin
if(data == 4'b0100) // Red
begin
temp = 7'b0011001; // r
end
if(data == 4'b0010) // Yellow
begin
temp = 7'b1000100; // y
end
if(data == 4'b0011) // Yellow and green
begin
temp = 7'b1100000; // b
end
if(data == 4'b0001) // Green
begin
temp = 7'b0000100; // g
end
end

assign LED = temp;

endmodule

UCF file:-
NET "clock_20ns" LOC = B8;

# PlanAhead Generated physical constraints

NET "LED[0]" LOC = H14;


NET "LED[1]" LOC = J17;
NET "LED[2]" LOC = G14;
NET "LED[3]" LOC = D16;
NET "LED[4]" LOC = D17;
NET "LED[5]" LOC = F18;
NET "LED[6]" LOC = L18;

NET "an[0]" LOC = F17;


NET "an[1]" LOC = H17;
NET "an[2]" LOC = C18;
NET "an[3]" LOC = F15;

NET "forced[0]" LOC = L14;


NET "forced[1]" LOC = L13;
NET "forced[2]" LOC = N17;
NET "forced[3]" LOC = R17;

NET "ready" LOC = H18;


NET "start" LOC = G18;

Anda mungkin juga menyukai