相信很多学过FPGA的同学都接触过这个按理-交通灯控制,只是我的这个是基于Xilinx XC2S200的,别有一番风味。
我还是先说这个项目的过程吧:
1实验原理在此实验中,我们要做的就是基于状态机设计一个十字路**通灯控制器。其示意图如下:
A方向和B方向各设红、黄、绿三盏灯,三种灯按合理的顺序亮灭,以完成交通控制的功能。
利用实验台所提供的按键开关模拟南北方向和东西方向的车辆探测器(sensor1, sensor2),按下按键则表示该方向有车辆需要通过,利用实验台的发光二级管模拟两个方向上的红、绿、黄灯(red1, green1, yellow1; red2 green2 yellow2),由一片可编程逻辑芯片控制交通灯,该芯片运行的时钟(clk)由实验台提供,编程计时(clock)。当仅有一个方向上有车辆需要通过,则该方向上绿灯长亮,当两个方向上均有车辆通过的时候,交通灯切换指示。
2源代码1.Verilog源代码,TrafficLight.v
module traffic(clk,snCar,ewCar,
snRed,snYellow,snGreen,
ewRed,ewYellow,ewGreen);
input snCar, ewCar,clk;
output reg snRed;
output reg snYellow;
output reg snGreen;
output reg ewRed;
output reg ewYellow;
output reg ewGreen;
reg [5:0] state;
reg [15:0] timer1;
reg [7:0] timer2;
reg time1Up,time2Up;
reg enableTime1,enableTime2;
parameter TIME1NUM=2000, TIME2NUM=200;
parameter EWGREEN=5'b00000, EWGREENWAIT=5'b00001;
parameter EWYELLOW=5'b00010;
parameter SNGREEN=5'b00100, SNGREENWAIT=5'b01000;
parameter SNYELLOW=5'b10000;
always @(posedge clk)
if (enableTime1)
if (timer1==TIME1NUM) time1Up<=1;
else timer1<=timer1+1;
else
begin
timer1<=0;
time1Up<=0;
end
always @(posedge clk)
if (enableTime2)
if (timer2==TIME2NUM) time2Up<=1;
else timer2<=timer2+1;
else
begin
timer2<=0;
time2Up<=0;
end
always @(state)
case (state)
EWGREEN:
if (time1Up) state<=EWGREENWAIT;
EWGREENWAIT:
if (snCar) state<=EWYELLOW;
EWYELLOW:
if (time2Up) state<=SNGREEN;
SNGREEN:
if (time1Up) state<=SNGREENWAIT;
SNGREENWAIT:
if (ewCar) state<=SNYELLOW;
SNYELLOW:
if (time2Up) state<=EWGREEN;
default: state<=EWGREEN;
endcase |