FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 本文介绍了FPGA设计交通红绿灯控制器与小轿车尾灯控制器模块


【实验要求】 
实验内容与原理说明(包括框图、逻辑表达式和真值表)。
实验模块程序代码(设计模块Design Block)和激励代码(激励模块Test Bench)。
仿真波形图。
综合得到的门级电路图,所用器件的型号以及设计模块所占用该型器件的资源情况。
实验结果分析及思考。
每一次报告用Word文档提交,文件名:姓名_班级_第几次实验_学号。
【实验软件工具】
QuartusII;
ModelSim SE.
【实验一】设计一个交通红绿灯控制器模块,实现主干道和支路之间红绿黄灯的信号转换

  1. 实验内容与原理说明

本实验实现一个交通信号灯的控制模块,实现主干道和支路之间的红绿黄灯的信号转换。假设LIGHT1为主路信号灯,LIGHT2为支路信号灯,每一个信号灯循环周期为50s。20s,H为绿灯,F为红灯。5s,H为黄灯,F为红灯。20s,H为红灯,F为绿灯。5s,H为红灯,F为黄灯。

通过分析交通灯控制电路的要求可知,系统主要由传感器、时钟脉冲产生器

定时器、控制器及译码器构成,传感器S在有车辆通过时发出一个高电平信号。

可知交通灯的系统框图如下:
image.png

可以得到其ASM图如下:

image.png

根据交通灯控制单元的ASM图, ASM图中的状态框与状态图中的状态相对应,判断框中的条件是状态转换的输入条件,条件输出框与控制单元状态转换的输出相对应。状态图是描述状态之间的转换,例如在S,状态,如果条件TL·S=1时,系统状态转移到ST,同时输出状态转换信号S1。如果TL·S=0,则系统保持在S0状态。

当交通灯控制电路处于不同工作状态时,交通信号灯按一定的规律与之对应,各状态与信号灯的关系如表5.4.2所示。表中用1表示灯亮,用0表示灯灭。

可以得到信号灯与控制器状态编码表如下:

image.png

  2. 实验模块程序代码和激励代码
(1)设计模块代码
//定义状态
`define S0 2'b00//主绿支红
`define S1 2'b01//主黄支红
`define S2 2'b11//主红支绿
`define S3 2'b10//主红支黄
//定义trafficLight控制程序
module trafficLight(CLK,S,rst,HR,HG,HY,FR,FG,FY,timeH,timeL);
input CLK,S,rst;
output[3:0] timeH;
output[3:0] timeL;
reg[3:0] timeH;
reg[3:0] timeL;
output reg HR,HG,HY,FR,FG,FY;
wire TL,TS,TY;
reg ST;
reg[1:0] CState,NState;
//时序模块的描述
always@(posedge CLK or negedge rst) begin

if(~rst)  
    {timeH,timeL}<=8'h00;  
else if(ST)  
    {timeH,timeL}<=8'h00;  
else if((timeH==5)&(timeL==9)) begin  
    {timeH,timeL}<={timeH,timeL};  
end  
else if(timeL==9) begin  
    timeH<=timeH+1;  
    timeL<=0;  
end  
else begin  
    timeH<=timeH;  
    timeL<=timeL+1;  
end  

end

assign TY=(timeH==0)&(timeL==4);
assign TS=(timeH==2)&(timeL==9);
assign TL=(timeH==5)&(timeL==9);
//定义三种输出时间输出标志

//描述状态机状态转换
always@(posedge CLK or negedge rst) begin

if(~rst)  
    CState<=`S0;  
else  
    CState<=NState;  

end

//分别对四种状态进行描述
always@(S or CState or TL or TS or TY) begin

case(CState)  
    `S0:begin  
        NState=(TL&&S)?`S1:`S0;  
        ST=(TL&&S)?1:0;  
    end  
    `S1:begin  
        NState=(TY)?`S2:`S1;  
        ST=(TY)?1:0;  
    end  
    `S2:begin  
        NState=(TS||~S)?`S3:`S2;  
        ST=(TS||~S)?1:0;  
    end  
    `S3:begin  
        NState=(TY)?`S0:`S3;  
        ST=(TY)?1:0;  
    end  
endcase  

end

//将状态转换译码
always@(CState) begin

case(CState)  
    `S0:begin  
        {HG,HY,HR}=3'b100;  
        {FG,FY,FR}=3'b001;  
    end  
    `S1:begin  
        {HG,HY,HR}=3'b010;  
        {FG,FY,FR}=3'b001;  
    end  
    `S2:begin  
        {HG,HY,HR}=3'b001;  
        {FG,FY,FR}=3'b100;  
    end  
    `S3:begin  
        {HG,HY,HR}=3'b001;  
        {FG,FY,FR}=3'b010;  
    end  
endcase  

end
endmodule
(2)激励模块代码
// Verilog Test Bench template for design : trafficLight
//
// Simulation tool : ModelSim (Verilog)
//
`timescale 1 ps/ 1 ps
module trafficLight_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg CLK;
reg S;
reg rst;
// wires
wire HG;
wire HR;
wire HY;
wire FG;
wire FR;
wire FY;
wire [3:0] timeH;
wire [3:0] timeL;

// assign statements (if any)
trafficLight i1 (
// port map - connection between master ports and signals/registers

.CLK(CLK),  
.HG(HG),  
.HR(HR),  
.HY(HY),  
.FG(FG),  
.FR(FR),  
.FY(FY),  
.S(S),  
.rst(rst),  
.timeH(timeH),  
.timeL(timeL)  

);
initial
begin
rst<=0;S<=0;CLK<=0;

10 rst<=1;

100 S<=1;

3000 $stop;

end

always #5 CLK<=~CLK;

endmodule

  1. 波形仿真图

image.png

4.门级电路图

image.png

设计模块所占用器件的资源情况如下所示:

image.png

【实验二】设计一个小轿车尾灯控制器模块(以书中的例子)

  1. 实验内容与原理说明

汽车尾灯发出的信号主要是给后面行驶汽车的司机看的,通常汽车驾驶室有刹车开关(HAZ)、左转弯开关(LEFT)和右转弯开关(RIGHT),司机通过操作这

3个开关给出车辆的行驶状态。假设在汽车尾部左、右两侧各有3个指示灯,分别用LA、LB、LC、RA、RB、RC表示,如图5.4.1所示。这些灯的亮、灭规律如下:

1)汽车正常行驶时,尾部两侧的6个灯全部熄灭。

2)刹车时,汽车尾灯工作在告警状态,6个灯按一定频率闪烁。

3)左转弯时,左侧3个灯轮流顺序点亮,其规律如图5.4.2a所示,右侧灯全灭。

4)右转弯时,右侧3个灯轮流顺序点亮,其规律如图5.4.2b所示,左侧灯全灭。

假设电路的输入时钟信号为CP,CP的频率对应于汽车尾灯所要求的闪烁频率。试根据上述要求设计出一个时钟同步的状态机来控制汽车的尾灯。

选择Moore状态机设计该电路,则尾灯的亮、灭直接由状态译码就可以得到。由设计要求可知:汽车左转弯时,右边的灯不亮而左边的灯依次循环点亮,即0个、1个、2个或3个灯亮,分别用L、L、L、L表示,状态机在4个状态中循环。同理,汽车右转弯时,状态机也会在4个状态中循环,即左边灯不亮而右边的灯有0个、1个、2个或3个灯亮,分别用R、R、R、R,表示。由于L和R,都表示6个灯不亮,所以合起来用IDLE表示。

状态机一旦左循环或者右循环开始后,如果刹车信号HAZ有效,状态机不会立即响应,而是必须等到左(或右)循环完成后才会进入告警状态。经过改进且具有这一特性的状态图如下图所示。

image.png

由于电路的输出信号较多,不便于写在状态图中,所以单独列出输出逻辑真值表,如下表所示。

image.png

 2. 实验模块程序代码和激励代码
(1)设计模块代码
`define IDEL 3'b001//均不亮
`define LR3 3'b100//均亮
`define L1 3'b011//左侧亮一个灯
`define L2 3'b010//左侧亮两个灯
`define L3 3'b000//左侧亮三个灯
`define L1 3'b011//左侧亮一个灯
`define R1 3'b101//右侧亮一个灯
`define R3 3'b110//右侧亮两个灯
`define R2 3'b111//右侧亮三个灯
module carLight(RST,CLK,LEFT,RIGHT,HAZ,RA,RB,RC,LA,LB,LC);
input RST,CLK,LEFT,RIGHT,HAZ;
output reg RA,RB,RC,LA,LB,LC;
reg[2:0] CState,NState;
always@(posedge CLK or negedge RST) begin

if(~RST)  
    CState<=`IDEL;  
else  
    CState<=NState;  

end
always@(CState or LEFT or RIGHT or HAZ) begin

case(CState)  
    `IDEL:begin  
        if(LEFT&RIGHT|HAZ)  
            NState=`LR3;  
        else if(LEFT&(~HAZ)&(~RIGHT))  
            NState=`L1;  
        else if((~LEFT)&(~HAZ)&RIGHT)  
            NState=`R1;  
        else  
            NState=`IDEL;  
    end  
    `L1:begin  
        if(~(LEFT|HAZ))  
            NState=`IDEL;  
        else if(LEFT&(~HAZ)&(~RIGHT))  
            NState=`L2;  
        else   
            NState=`LR3;  
    end  
    `L2:begin  
        if(~(LEFT|HAZ))  
            NState=`IDEL;  
        else if(LEFT&(~HAZ)&(~RIGHT))  
            NState=`L3;  
        else   
            NState=`LR3;  
    end  
    `L3:begin  
        if((~LEFT)&(~HAZ)|(~RIGHT)&(~HAZ))  
            NState=`IDEL;  
        else  
            NState=`LR3;  
    end  
    `R1:begin  
        if(~(RIGHT|HAZ))  
            NState=`IDEL;  
        else if(RIGHT&(~HAZ)&(~LEFT))  
            NState=`R2;  
        else   
            NState=`LR3;  
    end  
    `R2:begin  
        if(~(RIGHT|HAZ))  
            NState=`IDEL;  
        else if(RIGHT&(~HAZ)&(~LEFT))  
            NState=`R3;  
        else   
            NState=`LR3;  
    end  
    `R3:begin  
        if((~LEFT)&(~HAZ)|(~RIGHT)&(~HAZ))  
            NState=`IDEL;  
        else  
            NState=`LR3;  
    end  
    `LR3:begin  
        if((~LEFT)&(~HAZ)|(~RIGHT)&(~HAZ))  
            NState=`IDEL;  
        else  
            NState=`LR3;  
    end  
endcase  

end

//状态译码过程
always@(CState) begin

case(CState)  
    `IDEL:begin  
        {LC,LB,LA,RA,RB,RC}=6'b000_000;  
    end  
    `L1:begin  
        {LC,LB,LA,RA,RB,RC}=6'b001_000;  
    end  
    `L2:begin  
        {LC,LB,LA,RA,RB,RC}=6'b011_000;  
    end  
    `L3:begin  
        {LC,LB,LA,RA,RB,RC}=6'b111_000;  
    end  
    `R1:begin  
        {LC,LB,LA,RA,RB,RC}=6'b000_100;  
    end  
    `R2:begin  
        {LC,LB,LA,RA,RB,RC}=6'b000_110;  
    end  
    `R3:begin  
        {LC,LB,LA,RA,RB,RC}=6'b000_111;  
    end  
    `LR3:begin  
        {LC,LB,LA,RA,RB,RC}=6'b111_111;  
    end  
endcase  

end
endmodule

(2)激励模块代码
`timescale 1 ps/ 1 ps
module carLight_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg CLK;
reg HAZ;
reg LEFT;
reg RIGHT;
reg RST;
// wires
wire LA;
wire LB;
wire LC;
wire RA;
wire RB;
wire RC;

// assign statements (if any)
carLight i1 (
// port map - connection between master ports and signals/registers

.CLK(CLK),  
.HAZ(HAZ),  
.LA(LA),  
.LB(LB),  
.LC(LC),  
.LEFT(LEFT),  
.RA(RA),  
.RB(RB),  
.RC(RC),  
.RIGHT(RIGHT),  
.RST(RST)  

);
initial
begin
RST<=0;CLK<=0;LEFT<=0;RIGHT<=0;HAZ<=0;

10 RST<=1;

30 LEFT<=1;HAZ<=0;RIGHT<=0;

90 LEFT<=0;HAZ<=0;RIGHT<=0;

30 LEFT<=0;HAZ<=0;RIGHT<=1;

90 LEFT<=0;HAZ<=0;RIGHT<=0;

30 LEFT<=1;HAZ<=0;RIGHT<=0;

30 LEFT<=1;HAZ<=0;RIGHT<=1;

30 LEFT<=0;HAZ<=0;RIGHT<=0;

30 LEFT<=0;HAZ<=0;RIGHT<=1;

30 LEFT<=1;HAZ<=0;RIGHT<=1;

30 LEFT<=0;HAZ<=0;RIGHT<=0;

30 LEFT<=0;HAZ<=1;RIGHT<=0;

30 LEFT<=0;HAZ<=0;RIGHT<=0;

$stop;
end

always #5 CLK<=~CLK;

endmodule

  1. 波形仿真图

image.png

4.门级电路图

image.png

设计模块所占用器件的资源情况如下所示:

image.png

目录
相关文章
|
4天前
|
存储 算法 编译器
课程设计——基于FPGA的交通红绿灯控制系统(源代码)
课程设计——基于FPGA的交通红绿灯控制系统(源代码)
|
异构计算
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(上)
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(上)
709 0
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(上)
|
12月前
|
算法 异构计算
m基于FPGA的256QAM调制信号产生模块verilog实现,包含testbench
m基于FPGA的256QAM调制信号产生模块verilog实现,包含testbench
275 0
|
12月前
|
算法 异构计算
m基于FPGA的1024QAM调制信号产生模块verilog实现,包含testbench
m基于FPGA的1024QAM调制信号产生模块verilog实现,包含testbench
344 0
|
算法 异构计算
基于FPGA的控制参数在线实时调整的自适应PI控制器设计,包含testbench测试程序
基于FPGA的控制参数在线实时调整的自适应PI控制器设计,包含testbench测试程序
164 0
|
传感器 算法 异构计算
m基于FPGA的FOC控制器verilog实现,包括CLARK,PARK,PID及SVPWM,含testbench
m基于FPGA的FOC控制器verilog实现,包括CLARK,PARK,PID及SVPWM,含testbench
349 0
|
算法 异构计算
m基于FPGA的PID控制器实现,包含testbench测试程序,PID整定通过matlab使用RBF网络计算
m基于FPGA的PID控制器实现,包含testbench测试程序,PID整定通过matlab使用RBF网络计算
140 0
|
算法 异构计算
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
280 0
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
|
算法 异构计算
m基于FPGA的NBDP系统ARQ单元模块的verilog实现
m基于FPGA的NBDP系统ARQ单元模块的verilog实现
187 0
m基于FPGA的NBDP系统ARQ单元模块的verilog实现
|
算法 异构计算
m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序
m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序
347 0
m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序

热门文章

最新文章