一、设计要求
设计并实现一个简单的十字路口交通灯控制电路。以4个红色指示灯、4个绿色指示灯和4个黄色指示灯模拟路口东西南北4个方向的红绿黄交通灯。控制这些灯,使它们安下列规律亮灭。
1、东西方向绿灯亮,南北方向红灯亮。东西方向通车,时间30秒;
2、东西方向黄灯闪烁,南北方向红灯亮,时间2秒。
3、东西方向红灯亮,南北方向绿灯亮。南北方向通车,时间30秒;
4、东西方向红灯亮,南北方向黄灯闪烁,时间2秒。
5、返回1,继续运行。
二、设计方案
设计一个有五个状态的状态机,其中一个为初始状态。如下图:
在状态S1~S4中,计数器在每个时钟上升沿加一。
三、电路原理图
文章来源:https://www.toymoban.com/news/detail-779323.html
- 对上图局部放大处理:
四、代码实现
1. Verilog代码:
module traffic_light(clk,rst_n,light_east,light_west,light_north,light_south);
input clk,rst_n;
output [2:0]light_east,light_north,light_south,light_west;
reg[2:0] light_east,light_north,light_south,light_west;
parameter
S0=0,
S1=1,
S2=2,
S3=3,
S4=4;
reg [2:0]state;
reg [5:0]cnt;
always @(posedge clk or negedge rst_n )
begin
if(!rst_n)
begin
{light_east,light_north,light_south,light_west}=12'b0;
cnt <= 0;
state <= S0;
end
else
begin
case (state)
S0: begin
{light_east,light_north,light_south,light_west}=12'b1;
state <= S1;
end
S1:
if(cnt==30) begin
state <= S2;
cnt <= 0;
end
else begin
cnt <= cnt + 1'b1;
{light_east,light_west,light_north,light_south}=12'b100_100_001_001;
state <= S1;
end
S2:
if(cnt==2) begin
state <= S3;
cnt <= 0;
end
else begin
cnt <= cnt + 1'b1;
{light_east,light_west,light_north,light_south}=12'b010_010_001_001;
state <= S2;
end
S3:
if(cnt==30) begin
state <= S4;
cnt <= 0;
end
else begin
cnt <= cnt + 1'b1;
{light_east,light_west,light_north,light_south}=12'b001_001_100_100;
state <= S3;
end
S4:
if(cnt==2) begin
state <= S1;
cnt <= 0;
end
else
begin
cnt <= cnt + 1'b1;
{light_east,light_west,light_north,light_south}=12'b001_001_010_010;
state <= S4;
end
endcase
end
end
endmodule
2. Testbench代码
`timescale 1 ps/ 1 ps
module traffic_light_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg rst_n;
// wires
wire [2:0] light_east;
wire [2:0] light_north;
wire [2:0] light_south;
wire [2:0] light_west;
// assign statements (if any)
traffic_light i1 (
// port map - connection between master ports and signals/registers
.clk(clk),
.light_east(light_east),
.light_north(light_north),
.light_south(light_south),
.light_west(light_west),
.rst_n(rst_n)
);
initial
begin
clk=0;
rst_n=0;
#20 rst_n=1;
#1000 $stop;
$display("Running testbench");
end
always
begin
#1 clk=~clk;
// --> end
end
endmodule
五、仿真结果
light_east, light_south, light_west, light_north分别为东、南、西、北的信号灯,高位至低位依次为绿灯、黄灯、红灯。
左边下面四个对应的变量名分别为light_east, light_north, light_south, light_west。
文章来源地址https://www.toymoban.com/news/detail-779323.html
到了这里,关于基于Verilog的十字路口交通灯控制电路设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!