Verilog 实验报告
第四次 交通灯
班级:集电 0802 班
姓名: 张鹏
学号:序号: 16
一、规范
(1) 具有开关功能:当 reset=0 时 红绿灯关闭,使主支干道六个灯全灭;
(2) 具有四个功能:当 reset=1 且 func=2’b00 时,主干道和支路正常计数;
且 func=2 ’ b01 时,支干道一直绿灯,主干道一直红
灯;
且 func=2 ’ b10 时,主干道一直绿灯,支干道一直红
灯;
且 func=2 ’b11 时,主干道和支干道一直黄灯闪;(3) 计数器频率:运行频率 2Hz 计数器;
(4) 信号灯种类:红、黄、绿;
(5) 信号灯计执行时间关系:主干道:绿灯常亮
+绿灯闪 +黄灯 =支干道:红灯常亮;
此设计中:
主干道:绿灯常亮 =57s,T绿灯闪 =3s,T黄灯亮 =3s
支干道:绿灯常亮 =15s,T绿灯闪 =3s,T黄灯亮 =3s
(6) 信号灯到计时功能:信号灯预置后,开始执行
2Hz 计数器;
(7) 信号灯跳转功能:当各信号灯计时至 T 时在下一个时钟信号上升沿到来时自动转
为下一状态;
(8) 信号灯各状态跳转关系:绿 -黄-红-绿;
二、输入输出定义
reset,clk, func[1:0] ,green[1:0],red[1:0],yellow[1:0]
信号名
宽度
输入/输出
管脚
描述
reset
1
input
L13
红绿灯总开关
clk
1
input
C9
freq:50MHz
func
2
input
N17/H18
控制红绿灯功能
green[1]
1
output
D11
主绿
green[0]
1
output
E11
支绿
red[1]
1
output
F11
主红
red[0]
1
output
F12
支红
yellow[1]
1
output
C11
主黄
yellow[0]
1
output
E12
支黄
三、模块设计
状态转移图:
四、测试代码
module frequency_divider_small(reset,clk,out); // 重写一个小分频模块测试交通灯主
模块功能
input reset,clk;
output out;
reg [1:0] temp;
reg out;
always @ (posedge clk or negedge reset)
if (!reset)
temp<=2'b00;
else
temp<=(temp==2'b11)?2'b00:temp+2'b01;
always @ (temp)
out=(temp==2'b11);
endmodule
module test_traffic_light;
reg reset,clk;
reg [1:0] func;
wire [1:0] green;
wire [1:0] red;
wire [1:0] yellow;
traffic_light
simulation(.reset(reset),.clk(clk),.func(func),.green(green),.red(red),.yellow( yellow));
always #10 clk=~clk;
initial
begin
reset=0;
clk=1;
func=2'b00;
#20 reset=1;
#21000 func=2'b01;
#10000 func=2'b10;
#10000 func=2'b11;
end
endmodule
波形:
五、源代码
module frequency_divider(reset,clk,out);// 分频模块,把 50MHz时钟分成半秒计时器 input reset,clk;
output out;
reg [5:0] mol1,mol2;
reg [6:0] mol3,mol4;
reg out1,out2,out3,out;
always @ (posedge clk or negedge reset)// 把分成 40*40*125*125
if(!reset)
mol1<=6'd0;
else
mol1<=(mol1==6'd39)?6'd0:mol1+6'd1;
always @ (posedge clk or negedge reset)
if(!reset)
mol2<=6'd0;
else if(out1)
mol2<=(mol2==6'd39)?6'd0:mol2+6'd1;
always @ (posedge clk or negedge reset)
if(!reset)
mol3<=7'd0;
else if(out2)
mol3<=(mol3==7'd124)?7'd0:mol3+7'd1;
always @ (posedge clk or negedge reset)
if(!reset)
mol4<=7'd0;
else if(out3)
mol4<=(mol4==7'd124)?7'd0:mol4+7'd1;
always @ (mol1 or mol2 or mol3 or mol4)
begin
out1=(mol1==6'd39);
out2=((mol2==6'd39)&&out1);
out3=((mol3==7'd124)&&out2);
out=((mol4==7'd124)&&out3);
end
endmodule
module traffic_light(reset,clk,func,green,red,yellow);// 交通灯主模块
input reset,clk;
input [1:0] func;
output [1:0] green,red,yellow;
reg [1:0] green,red,yellow;
reg [2:0] state;
reg [6:0] cnt;
wire in;
parameter greentime1=6'd57;// 主干道绿灯时间
parameter greentime0=6'd27;// 支干道绿灯时间
parameter yellowtime=3'd3;// 黄灯时间,绿灯闪时间
frequency_divider fenpin(.reset(reset),.clk(clk),.out(in));// 调用分频模块
always @ (posedge clk or negedge reset)
begin
cnt<=7'd0;
state<=3'd1;
green<=2'b00;
red<=2'b00;
yellow<=2'b00;
end
else
if(in)// 分频器结果当主模块始能
if(func==2'b00)// 选择不同功能控制开关
if(cnt==7'd0)
case(state)// 选择不同状态
3'd1:begin
cnt<=greentime1<<1;
state<=3'd2;
green<=2'b10;
red<=2'b01;
yellow<=2'b00;
end
3'd2:begin
cnt<=yellowtime<<1;
state<=3'd3;
end
3'd3:begin
cnt<=yellowtime<<1;
state<=3'd4;
green<=2'b00;
red<=2'b01;
yellow<=2'b10;
end
3'd4:begin
cnt<=greentime1<<1;
state<=3'd5;
green<=2'b01;
red<=2'b10;
yellow<=2'b00;
end
3'd5:begin
cnt<=yellowtime<<1;
state<=3'd6;
end
3'd6:begin
cnt<=yellowtime<<1;
state<=3'd1;
green<=2'b00;
red<=2'b10;
yellow<=2'b01;
end
endcase
else
begin
cnt<=cnt-7'd1;//
倒计数,计数结束进入下一状态
case(state)
3'd3:green[1]<=cnt[0];//
3'd6:green[0]<=cnt[0];//
主干道绿灯闪
支干道绿灯闪
endcase
end
else if(func==2'b10)//
主干道常绿,支干道常红
begin
cnt<=0;
state<=3'd1;
green<=2'b10;
red<=2'b01;
yellow<=2'b00;
end
else if(func==2'b01)//
主干道常红,支干道常绿
begin
cnt<=0;
state<=3'd1;
green<=2'b01;
red<=2'b10;
yellow<=2'b00;
end
else if(func==2'b11)//
主干道,支干道黄灯一直闪
begin
cnt<=0;
state<=3'd1;
green<=2'b00;
red<=2'b00;
yellow[1]<=~yellow[1];
yellow[0]<=~yellow[1];
end
endmodule
相关热词搜索: 实验报告 交通灯 实验 报告 Verilog实验报告交通灯x