Verilog 代码翻译:控制交通灯系统
模块名称为 control,包含以下输入输出端口:
输入端口:
- CLOCK_50: 板载 50MHz 时钟
- Q_KEY: 按键输入
- guang1: 南北方向流量传感器接口
- guang2: 东西方向流量传感器接口
- KEY: 按键输入,9 位 输出端口:
- data: 数码管显示数据,16 位
- liul: 流量显示数据,16 位
- led: LED 灯状态,6 位
内部变量:
- nabeiliu: 南北方向车流量计数器,8 位
- dongxiliu: 东西方向车流量计数器,8 位
- F1, F2: 流量传感器检测引脚的状态,1 位
- SCK_fallingedge1, SCK_risingedge1, SCK_fallingedge2, SCK_risingedge2: 时钟上升沿和下降沿检测信号,1 位
- cnt2, cnt1, cnt: 计数器,26 位
- uu1, uu2: 流量传感器检测引脚的上升沿标志位,1 位
- t_buf1, t_buf2: 时间缓存器,8 位
- moshi: 调控模式,4 位
- state: 红绿灯状态,3 位
module control (
input CLOCK_50, // 板载 50MHz 时钟
input Q_KEY,
input guang1, // 南北方向流量传感器接口
input guang2, // 东西方向流量传感器接口
input [9:1] KEY,
output reg[15:0] data,
output reg[15:0] liul,
output reg[5:0] led
);
reg[7:0] nabeiliu;
reg[7:0] dongxiliu;
reg F1,F2;
always @(posedge CLOCK_50 or negedge Q_KEY)
if(!Q_KEY)
begin
F1<=1'b1;
F2<=1'b1;
end
else
begin
F1<=guang1;// 需要检测的引脚
F2<=F1;
end
assign SCK_fallingedge1 = F2 && !F1;// 检测时钟的下降沿
assign SCK_risingedge1 = F1 && !F2;// 检测时钟的上升沿
reg F3,F4;
reg aa,bb;
always @(posedge CLOCK_50 or negedge Q_KEY)
if(!Q_KEY)
begin
F3<=1'b1;
F4<=1'b1;
end
else
begin
F3<=guang2;// 需要检测的引脚
F4<=F3;
end
assign SCK_fallingedge2 = F4 && !F3;// 检测时钟的下降沿
assign SCK_risingedge2 = F3 && !F4;// 检测时钟的上升沿
reg [25:0] cnt2;// 计数子
reg [25:0] cnt1;// 计数子
reg [25:0] cnt; // 计数子
reg uu1;
reg uu2;
reg [7:0] t_buf1;
reg [7:0] t_buf2;
reg [3:0] moshi;
reg[2:0] state;
reg [6:0] shijiandx,shijiannb;
reg ff;
reg [7:0] sec;
reg [6:0] ttdx,ttnb;
//++++++++++++++++++++++++++++++++++++++
// 获取键值 开始
//++++++++++++++++++++++++++++++++++++++
wire [9:1] key_val; // 键值
key_debounce u0(
.i_clk (CLOCK_50),
.i_rst_n (Q_KEY),
.i_key (KEY),
.o_key_val (key_val) // 按下为 0,松开为 1
);
always @ (posedge CLOCK_50, negedge Q_KEY)
if (!Q_KEY)
begin
nabeiliu<=0;
dongxiliu<=0;
cnt1 <= 0;
cnt <= 0;
// led<= 6'b011_101;// 东西方向: 红绿黄 南北方向:红绿黄
sec=0;
moshi=0;
shijiandx=20;
shijiannb=20;
cnt2=0;
sec=0;
end
else
begin
case (1'b0)
key_val[1] :
begin
moshi=1;// 调节时间
if(shijiannb<99)shijiannb=shijiannb+1;
sec=0;
end
key_val[2] :
begin
moshi=1;// 调节时间
if(shijiannb>1)shijiannb=shijiannb-1;
sec=0;
end
key_val[3] :
begin
moshi=1;// 调节时间
if(shijiandx<99)shijiandx=shijiandx+1;
sec=0;
end
key_val[4] :
begin
moshi=1;// 调节时间
if(shijiandx>1)shijiandx=shijiandx-1;
sec=0;
end
key_val[5] :
begin
moshi=2;// 东西方向通行, 南北禁止
sec=0;
end
key_val[6] :
begin
moshi=3;
sec=0;
end
key_val[7] :
begin
moshi=4;
sec=0;
end
key_val[8] :
begin
moshi=5;shijiannb=20;shijiandx=20;
sec=0;
end
key_val[9] :
begin
moshi=0;
sec=0;
end
endcase
if(SCK_fallingedge1 == 1)
begin
uu1=1;
end
if(SCK_fallingedge2 == 1)
begin
uu2=1;
end
if (cnt1 == 9_999_999)
begin
cnt1 <= 0;
if(guang1==1&&uu1==1)
begin
uu1<=0;
nabeiliu<=nabeiliu+1;
end
if(guang2==1&&uu2==1)
begin
uu2<=0;
dongxiliu<=dongxiliu+1;
end
end
else
cnt1 <= cnt1 + 1'b1;
if(moshi==0)
begin
if (cnt == 49_999_999) // 1s
begin
cnt <= 0;
if(sec==(shijiannb+shijiandx+11))sec=0;
else sec=sec+1;
if(sec<=shijiannb)// 南北通行; 东西禁止
begin
state=0;
ttnb=shijiannb-sec;
ttdx=shijiannb-sec+5;
end
else if(sec>shijiannb&&sec<=(shijiannb+5))// 南北黄灯 5S; 东西禁止
begin
state=1;
ttnb=shijiannb-sec+5;
ttdx=shijiannb-sec+5;
end
else if(sec>(shijiannb+5)&&sec<=(shijiannb+shijiandx+1+5))// 东西通行; 南北禁止
begin
state=2;
ttnb=(shijiannb+shijiandx+1)-sec+10;
ttdx=(shijiannb+shijiandx+1)-sec+5;
end
else if(sec>(shijiannb+shijiandx+6))// 东西黄灯 5S; 南北禁止
begin
state=3;
ttnb=(shijiannb+shijiandx+11)-sec;
ttdx=(shijiannb+shijiandx+11)-sec;
end
end
else
cnt <= cnt + 1'b1;
if(state==0)
begin
led<= 6'b011_101;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(state==1)
begin
led<= 6'b011_110;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(state==2)
begin
led<= 6'b101_011;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(state==3)
begin
led<= 6'b110_011;// 东西方向: 红绿黄 南北方向:红绿黄
end
data[3:0] =ttnb/10;
data[7:4] =ttnb%10;
data[11:8] =ttdx/10;
data[15:12] =ttdx%10;
end
else if(moshi==1)// 调节时间
begin
led<= 6'b111_111;
data[3:0] =shijiannb/10;
data[7:4] =shijiannb%10;
data[11:8] =shijiandx/10;
data[15:12] =shijiandx%10;
end
else if(moshi==2)// 东西方向通行, 南北禁止
begin
data[3:0] =10;
data[7:4] =10;
data[11:8] =10;
data[15:12] =10;
led<= 6'b101_011;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(moshi==3)// 南北方向通行, 东西禁止
begin
data[3:0] =10;
data[7:4] =10;
data[11:8] =10;
data[15:12] =10;
led<= 6'b011_101;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(moshi==4)// 夜间模式
begin
if (cnt2 == 24_999_999) // 0.5s
begin
cnt2 = 0;
if(ff==0)ff=1;
else ff=0;
end
else cnt2=cnt2+1;
if(ff==0) led<= 6'b110_110;// 东西方向: 红绿黄 南北方向:红绿黄
else led<= 6'b111_111;// 东西方向: 红绿黄 南北方向:红绿黄
data[3:0] =10;
data[7:4] =10;
data[11:8] =10;
data[15:12] =10;
end
else if(moshi==5)// 按流量通行模式
begin
if (cnt == 49_999_999) // 1s
begin
cnt <= 0;
if(sec==(shijiannb+shijiandx+11))
begin
sec=0;
if((nabeiliu>=(dongxiliu+10))&&(nabeiliu<(dongxiliu+20)))
begin
shijiannb=40;shijiandx=20;
end
else if((nabeiliu>=(dongxiliu+20)))
begin
shijiannb=60;shijiandx=20;
end
else if((dongxiliu>=(nabeiliu+10))&&(dongxiliu<(nabeiliu+20)))
begin
shijiannb=20;shijiandx=40;
end
else if((dongxiliu>=(nabeiliu+20)))
begin
shijiannb=20;shijiandx=60;
end
else
begin
shijiannb=20;shijiandx=20;
end
dongxiliu<=0; nabeiliu<=0;
end
else sec=sec+1;
if(sec<=shijiannb)// 南北通行; 东西禁止
begin
state=0;
ttnb=shijiannb-sec;
ttdx=shijiannb-sec+5;
end
else if(sec>shijiannb&&sec<=(shijiannb+5))// 南北黄灯 5S; 东西禁止
begin
state=1;
ttnb=shijiannb-sec+5;
ttdx=shijiannb-sec+5;
end
else if(sec>(shijiannb+5)&&sec<=(shijiannb+shijiandx+1+5))// 东西通行; 南北禁止
begin
state=2;
ttnb=(shijiannb+shijiandx+1)-sec+10;
ttdx=(shijiannb+shijiandx+1)-sec+5;
end
else if(sec>(shijiannb+shijiandx+6))// 东西黄灯 5S; 南北禁止
begin
state=3;
ttnb=(shijiannb+shijiandx+11)-sec;
ttdx=(shijiannb+shijiandx+11)-sec;
end
end
else
cnt <= cnt + 1'b1;
if(state==0)
begin
led<= 6'b011_101;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(state==1)
begin
led<= 6'b011_110;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(state==2)
begin
led<= 6'b101_011;// 东西方向: 红绿黄 南北方向:红绿黄
end
else if(state==3)
begin
led<= 6'b110_011;// 东西方向: 红绿黄 南北方向:红绿黄
end
data[3:0] =ttnb/10;
data[7:4] =ttnb%10;
data[11:8] =ttdx/10;
data[15:12] =ttdx%10;
end
end
always @ (posedge CLOCK_50)
begin
if(moshi==5)
begin
liul[3:0] <= nabeiliu/10; // 南北方向流量 十位
liul[7:4] <= nabeiliu%10;// 南北方向流量 个位
liul[11:8] <= dongxiliu/10;// 东西方向流量 十位
liul[15:12] <= dongxiliu%10; // 东西方向流量 个位
end
else
begin
liul[3:0] <= moshi;
liul[7:4] <= 10;
liul[11:8] <= 10;
liul[15:12] <= 10;
end
end
endmodule
该代码实现了一个控制交通灯系统的模块,主要功能包括:
- 流量检测: 使用两个流量传感器 (guang1 和 guang2) 检测南北和东西方向的车辆流量,并使用计数器记录流量。
- 时间控制: 使用计数器和时间变量 (shijiandx 和 shijiannb) 控制红绿灯的切换时间,可以手动调节时间。
- 红绿灯控制: 根据不同的控制模式 (moshi) 和时间,控制红绿灯的状态 (state),并使用 LED 灯 (led) 显示状态。
- 显示数据: 使用数码管 (data) 显示剩余时间和流量数据 (liul)。
代码中使用了一些关键的信号和变量,例如:
- SCK_fallingedge1 和 SCK_risingedge1: 用于检测流量传感器 1 的时钟下降沿和上升沿。
- SCK_fallingedge2 和 SCK_risingedge2: 用于检测流量传感器 2 的时钟下降沿和上升沿。
- cnt1 和 cnt: 用于计数流量和时间。
- uu1 和 uu2: 用于记录流量传感器检测到的上升沿。
- moshi: 用于选择不同的控制模式,例如手动调节时间、东西方向通行、南北方向通行、夜间模式和按流量通行模式。
- state: 用于记录红绿灯的状态,0 表示南北通行,1 表示南北黄灯,2 表示东西通行,3 表示东西黄灯。
- data: 用于显示剩余时间和流量数据。
- liul: 用于显示流量数据。
- led: 用于控制红绿灯的显示状态。
该代码提供了控制交通灯系统的一个基本框架,可以根据实际情况进行修改和扩展,例如添加更多控制模式、增加显示内容等等。
原文地址: https://www.cveoy.top/t/topic/ofbj 著作权归作者所有。请勿转载和采集!