Verilog 代码翻译:交通灯控制模块
模块名为 control,包含以下输入和输出信号:
输入信号:
- CLOCK_50:板载 50MHz 时钟
- Q_KEY:按键信号
- guang1:南北方向流量传感器接口
- guang2:东西方向流量传感器接口
- KEY[9:1]:按键输入信号
输出信号:
- data[15:0]:用于数码管的数据输出
- liul[15:0]:用于数码管的流量输出
- led[5:0]:LED 灯的输出信号
其中,reg[7:0] 类型的信号 nabeiliu 和 dongxiliu 分别用于存储南北方向和东西方向的流量;reg 类型的信号 F1 和 F2 用于检测南北方向流量传感器的引脚变化;reg 类型的信号 F3 和 F4 用于检测东西方向流量传感器的引脚变化;reg[25:0] 类型的信号 cnt、cnt1 和 cnt2 用于计数;reg 类型的信号 uu1 和 uu2 用于标记流量传感器的引脚变化;reg 类型的信号 t_buf1 和 t_buf2 用于存储流量传感器的计数值;reg 类型的信号 moshi 用于存储当前的工作模式;reg[2:0] 类型的信号 state 用于存储当前的交通灯状态。
代码如下:
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
原文地址: https://www.cveoy.top/t/topic/jny9 著作权归作者所有。请勿转载和采集!