模块名为 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
Verilog 代码翻译:交通灯控制模块

原文地址: https://www.cveoy.top/t/topic/jny9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录