Verilog 代码翻译及功能解释
模块控制(control)( 输入时钟_50,//板载50MHz时钟 输入q_key, 输入guang1,//南北方向流量传感器接口 输入guang2,//东西方向流量传感器接口 输入[9:1]键, 输出寄存器[15:0]数据, 输出寄存器[15:0]流量, 输出寄存器[5:0]LED );
寄存器[7:0] nabeiliu; 寄存器[7:0] dongxiliu;
寄存器f1,f2; 始终@(posedge时钟_50或负边缘q_key) 如果(!q_key) 开始 f1<=1'b1; f2<=1'b1; 结束 否则 开始 f1<=guang1;//需要检测的引脚 f2<=f1; 结束 分配SCK_fallingedge1=F2&!F1;//检测时钟的下降沿 分配SCK_risingedge1=F1&!F2;//检测时钟的上升沿
寄存器f3,f4; 寄存器aa,bb; 始终@(posedge时钟_50或负边缘q_key) 如果(!q_key) 开始 f3<=1'b1; f4<=1'b1; 结束 否则 开始 f3<=guang2;//需要检测的引脚 f4<=f3; 结束 分配SCK_fallingedge2=F4&!F3;//检测时钟的下降沿 分配SCK_risingedge2=F3&!F4;//检测时钟的上升沿
寄存器[25:0] cnt2;// 计数子 寄存器[25:0] cnt1;// 计数子 寄存器[25:0] cnt; // 计数子 寄存器 uu1; 寄存器 uu2; 寄存器[7:0] t_buf1; 寄存器[7:0] t_buf2; 寄存器[3:0] moshi; 寄存器[2:0] state; 寄存器[6:0] shijiandx,shijiannb; 寄存器 ff; 寄存器[7:0] sec; 寄存器[6:0] ttdx,ttnb; //++++++++++++++++++++++++++++++++++++++ // 获取键值 开始 //++++++++++++++++++++++++++++++++++++++ 线[9:1] key_val; // 键值
key_debounce u0( .i_clk (时钟_50), .i_rst_n (q_key), .i_key (键), .o_key_val (key_val) // 按下为0,松开为1 );
始终@ (posedge 时钟_50, negedge q_key) 如果 (!Q_KEY) 开始 nabeiliu<=0; dongxiliu<=0; cnt1 <= 0; cnt <= 0;
// led<= 6'b011_101;//东西方向:红绿黄 南北方向:红绿黄
sec=0;
moshi=0;
shijiandx=20;
shijiannb=20;
cnt2=0;
sec=0;
结束
否则 开始
case (1'b0)
key_val[1] :
开始
moshi=1;//调节时间
if(shijiannb<99)shijiannb=shijiannb+1;
sec=0;
结束
key_val[2] :
开始
moshi=1;//调节时间
if(shijiannb>1)shijiannb=shijiannb-1;
sec=0;
结束
key_val[3] :
开始
moshi=1;//调节时间
if(shijiandx<99)shijiandx=shijiandx+1;
sec=0;
结束
key_val[4] :
开始
moshi=1;//调节时间
if(shijiandx>1)shijiandx=shijiandx-1;
sec=0;
结束
key_val[5] :
开始
moshi=2;//东西方向通行,南北禁止
sec=0;
结束
key_val[6] :
开始
moshi=3;
sec=0;
结束
key_val[7] :
开始
moshi=4;
sec=0;
结束
key_val[8] :
开始
moshi=5;shijiannb=20;shijiandx=20;
sec=0;
结束
key_val[9] :
开始
moshi=0;
sec=0;
结束
endcase
if(SCK_fallingedge1 == 1)
开始
uu1=1;
结束
if(SCK_fallingedge2 == 1)
开始
uu2=1;
结束
if (cnt1 == 9_999_999)
开始
cnt1 <= 0;
if(guang1==1&&uu1==1)
开始
uu1<=0;
nabeiliu<=nabeiliu+1;
结束
if(guang2==1&&uu2==1)
开始
uu2<=0;
dongxiliu<=dongxiliu+1;
结束
结束
else
cnt1 <= cnt1 + 1'b1;
if(moshi==0)
开始
if (cnt == 49_999_999) //1s
开始
cnt <= 0;
if(sec==(shijiannb+shijiandx+11))sec=0;
else sec=sec+1;
if(sec<=shijiannb)//南北通行;东西禁止
开始
state=0;
ttnb=shijiannb-sec;
ttdx=shijiannb-sec+5;
结束
else if(sec>shijiannb&&sec<=(shijiannb+5))//南北黄灯5S;东西禁止
开始
state=1;
ttnb=shijiannb-sec+5;
ttdx=shijiannb-sec+5;
结束
else if(sec>(shijiannb+5)&&sec<=(shijiannb+shijiandx+1+5))//东西通行;南北禁止
开始
state=2;
ttnb=(shijiannb+shijiandx+1)-sec+10;
ttdx=(shijiannb+shijiandx+1)-sec+5;
结束
else if(sec>(shijiannb+shijiandx+6))//东西黄灯5S;南北禁止
开始
state=3;
ttnb=(shijiannb+shijiandx+11)-sec;
ttdx=(shijiannb+shijiandx+11)-sec;
结束
结束
else
cnt <= cnt + 1'b1;
if(state==0)
开始
led<= 6'b011_101;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(state==1)
开始
led<= 6'b011_110;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(state==2)
开始
led<= 6'b101_011;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(state==3)
开始
led<= 6'b110_011;//东西方向:红绿黄 南北方向:红绿黄
结束
data[3:0] =ttnb/10;
data[7:4] =ttnb%10;
data[11:8] =ttdx/10;
data[15:12] =ttdx%10;
结束
else if(moshi==1)//调节时间
开始
led<= 6'b111_111;
data[3:0] =shijiannb/10;
data[7:4] =shijiannb%10;
data[11:8] =shijiandx/10;
data[15:12] =shijiandx%10;
结束
else if(moshi==2)//东西方向通行,南北禁止
开始
data[3:0] =10;
data[7:4] =10;
data[11:8] =10;
data[15:12] =10;
led<= 6'b101_011;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(moshi==3)//南北方向通行,东西禁止
开始
data[3:0] =10;
data[7:4] =10;
data[11:8] =10;
data[15:12] =10;
led<= 6'b011_101;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(moshi==4)//夜间模式
开始
if (cnt2 == 24_999_999) //0.5s
开始
cnt2 = 0;
if(ff==0)ff=1;
else ff=0;
结束
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;
结束
else if(moshi==5)//按流量通行模式
开始
if (cnt == 49_999_999) //1s
开始
cnt <= 0;
if(sec==(shijiannb+shijiandx+11))
开始
sec=0;
if((nabeiliu>=(dongxiliu+10))&&(nabeiliu<(dongxiliu+20)))
开始
shijiannb=40;shijiandx=20;
结束
else if((nabeiliu>=(dongxiliu+20)))
开始
shijiannb=60;shijiandx=20;
结束
else if((dongxiliu>=(nabeiliu+10))&&(dongxiliu<(nabeiliu+20)))
开始
shijiannb=20;shijiandx=40;
结束
else if((dongxiliu>=(nabeiliu+20)))
开始
shijiannb=20;shijiandx=60;
结束
else
开始
shijiannb=20;shijiandx=20;
结束
dongxiliu<=0; nabeiliu<=0;
end
else sec=sec+1;
if(sec<=shijiannb)//南北通行;东西禁止
开始
state=0;
ttnb=shijiannb-sec;
ttdx=shijiannb-sec+5;
结束
else if(sec>shijiannb&&sec<=(shijiannb+5))//南北黄灯5S;东西禁止
开始
state=1;
ttnb=shijiannb-sec+5;
ttdx=shijiannb-sec+5;
结束
else if(sec>(shijiannb+5)&&sec<=(shijiannb+shijiandx+1+5))//东西通行;南北禁止
开始
state=2;
ttnb=(shijiannb+shijiandx+1)-sec+10;
ttdx=(shijiannb+shijiandx+1)-sec+5;
结束
else if(sec>(shijiannb+shijiandx+6))//东西黄灯5S;南北禁止
开始
state=3;
ttnb=(shijiannb+shijiandx+11)-sec;
ttdx=(shijiannb+shijiandx+11)-sec;
结束
结束
else
cnt <= cnt + 1'b1;
if(state==0)
开始
led<= 6'b011_101;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(state==1)
开始
led<= 6'b011_110;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(state==2)
开始
led<= 6'b101_011;//东西方向:红绿黄 南北方向:红绿黄
结束
else if(state==3)
开始
led<= 6'b110_011;//东西方向:红绿黄 南北方向:红绿黄
结束
data[3:0] =ttnb/10;
data[7:4] =ttnb%10;
data[11:8] =ttdx/10;
data[15:12] =ttdx%10;
结束
结束
始终@ (posedge 时钟_50) 开始
if(moshi==5)
开始
liul[3:0] <= nabeiliu/10; //南北方向流量 十位
liul[7:4] <= nabeiliu%10;//南北方向流量 个位
liul[11:8] <= dongxiliu/10;//东西方向流量 十位
liul[15:12] <= dongxiliu%10; //东西方向流量 个位
结束
else
开始
liul[3:0] <= moshi;
liul[7:4] <= 10;
liul[11:8] <= 10;
liul[15:12] <= 10;
结束
结束
endmodule
原文地址: https://www.cveoy.top/t/topic/ofbC 著作权归作者所有。请勿转载和采集!