EDA工具:Modelsim and Vivado
##一、產(chǎn)品要求:
該控制器用于主干道和支道公路交叉口,優(yōu)先保證主干道通行,平時處于"主干道綠燈,支道紅燈"狀態(tài),支道有車輛要穿過主干道時,信號燈改為"主干道紅燈,支道綠燈",支道無車輛時,信號燈返回"主干道綠燈,支道紅燈"狀態(tài)。如果支道始終有車,按普通信號燈處理。主干道和支道每次通行時間不得短于30s,兩個狀態(tài)交換之間有"主黃,支紅"和"主紅,支黃"的中間狀態(tài),持續(xù)時間均為4s。支道是否來車用開關(guān)代替,交通信號燈用LED代替。
##二、代碼設(shè)計:
module traffic_ctrl(
input sys_clk,
input sys_rst_n,
input bypass_car,
output reg main_light,
output reg bypass_light
);
//wire sys_rst_n;
//assign sys_rst_n = 1'b1;
parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b11;
parameter S3 = 2'b10;
/**************************實際測試數(shù)據(jù)*********************************************************/
//parameter CLK_CNT = 32'B1100_1010_1010_0111_1110_0010_0000_0000;//68s
//parameter YELLOW_CNT = 25'B1_0111_1101_0111_1000_0100_0000;
/**************************縮小1000000倍后的用于仿真測試數(shù)據(jù)**************************************/
parameter CLK_CNT = 35'd3400;
parameter YELLOW_CNT = 25'd25;
reg [31:0]clk_cnt;
reg [24:0]yellow_cnt;
wire red;
reg yellow;
wire green;
assign red = 1'b1;
assign green = 1'b0;
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n||!bypass_car)
yellow_cnt <= 25'b0;
else if(yellow_cnt == YELLOW_CNT - 1)begin
yellow <= ~yellow;
yellow_cnt <= 25'b0;
end
else
yellow_cnt <= yellow_cnt + 1'b1;
end
//計數(shù)模塊
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n||!bypass_car)
clk_cnt <= 32'b0;
else if(clk_cnt==CLK_CNT-1)
clk_cnt <= 32'b0;
else
clk_cnt <= clk_cnt + 1'b1;
end
reg [1:0]curr_st;
reg [1:0]next_st;
//狀態(tài)機之一段
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n||!bypass_car)
curr_st = S0;
// else if((clk_cnt==(30*50_000_000-1))|| /*
// (clk_cnt==(34*50_000_000-1))|| 實際時間
// (clk_cnt==(64*50_000_000-1))||
// (clk_cnt==(68*50_000_000-1)) ) */
/**************************縮小1000000倍后的仿真測試**************************************/
else if((clk_cnt==(30*50_-1))||
(clk_cnt==(34*50_-1))||
(clk_cnt==(64*50_-1))||
(clk_cnt==(68*50_-1)) )
curr_st <= next_st;
else
curr_st <= curr_st;
end
//狀態(tài)機之二段
always@(*)begin
case(curr_st)
S0 : next_st = S1;
S1 : next_st = S2;
S2 : next_st = S3;
S3 : next_st = S0;
default :;
endcase
end
//狀態(tài)機之第三段
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
main_light <= green;
bypass_light <= red;
end
else begin
case(curr_st)
S0: begin
main_light <= green;
bypass_light <= red;
end
S1: begin
main_light <= yellow;
bypass_light <= red;
end
S2: begin
main_light <= red;
bypass_light <= green;
end
S3: begin
main_light <= green;
bypass_light <= yellow;
end
default:;
endcase
end
end
endmodule
##三、測試代碼設(shè)計:
`timescale 1ns/1ps
module tb_traffic_light();
reg sys_clk;
reg sys_rst_n;
reg bypass_car;
wire main_light;
wire bypass_light;
initial begin
sys_clk = 1'b1;
sys_rst_n = 1'b0;
bypass_car = 1'b0;
end
initial begin
#20 sys_rst_n = 1'b1;
#1000 bypass_car = 1'b1;
end
always #10 sys_clk = ~sys_clk;
traffic_ctrl u_traffic_ctrl(
.sys_clk (sys_clk ) ,
.sys_rst_n (sys_rst_n ) ,
.bypass_car (bypass_car ) ,
.main_light ( main_light ) ,
.bypass_light ( bypass_light )
);
endmodule
##四、仿真測試結(jié)果
由于仿真工具的仿真時間的考慮,本次仿真是在縮小1000_000倍的前提下進行的仿真,入下(前提采用了兩個led作為測試 燈亮表示紅燈 燈滅表示綠燈 黃燈表示led燈閃爍 )
為什么黃燈會變成不定態(tài)(原因:可能因為led燈反轉(zhuǎn)太快 導(dǎo)致的 在實際情況下不存在此情況如視頻中演示)
在bypass_car=1(i.g. 旁路有車)前提下
一區(qū):相隔30000ns后進行的
二區(qū):相隔4000ns后進行的
三區(qū):相隔30000ns后進行的
四區(qū):相隔4000ns后進行的
五區(qū):返回到主車道綠燈,旁車道紅燈
##五、上板驗證結(jié)果
Led1燈表示主干道 led3表示枝干道文章來源:http://www.zghlxwxcb.cn/news/detail-432259.html
交通信號燈文章來源地址http://www.zghlxwxcb.cn/news/detail-432259.html
到了這里,關(guān)于基于FPGA的交通燈設(shè)計與實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!