Verilog代码翻译:交通灯控制模块
模块控制(Control)包括以下输入和输出: 输入:
- CLOCK_50:板载50MHz时钟
- Q_KEY:按键
- guang1:南北方向流量传感器接口
- guang2:东西方向流量传感器接口
- KEY[9:1]:按键值 输出:
- data[15:0]:LED数码管显示数据
- liul[15:0]:流量显示
- led[5:0]:LED灯显示
Control模块中包括以下变量和组合逻辑:
- nabeiliu[7:0]:南北方向流量计数器
- dongxiliu[7:0]:东西方向流量计数器
- F1、F2、F3、F4:辅助变量
- SCK_fallingedge1、SCK_risingedge1、SCK_fallingedge2、SCK_risingedge2:时钟检测辅助变量
- cnt2[25:0]、cnt1[25:0]、cnt[25:0]:计数器
- uu1、uu2:辅助变量
- t_buf1[7:0]、t_buf2[7:0]:辅助变量
- moshi[3:0]:工作模式,0表示正常模式,1表示调节时间模式,2表示东西方向通行模式,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
- 该代码实现了交通灯控制模块,包含南北、东西两个方向的流量检测和控制功能。
- 模块支持正常模式、时间调节模式、东西方向通行模式、南北方向通行模式、夜间模式、按流量通行模式等多种模式。
- 代码使用LED数码管和LED灯显示运行状态和流量信息,方便用户直观了解交通灯的工作情况。
- 该代码可以作为交通灯控制系统的基础,并可根据实际需求进行扩展。
- 代码中包含注释,方便理解代码的逻辑。
原文地址: https://www.cveoy.top/t/topic/jny7 著作权归作者所有。请勿转载和采集!