⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 带左拐的交通灯设计与25进制的加法计数器
💻
字号:
module tcl4(lampa,lampb,numah,numal,numbh,numbl,en,clk); /*模块说明*/

/*端口声明*/
output [3:0] lampa,lampb;/*分别控制A,B方向*/
output [3:0] numah,numal,numbh,numbl;
input  en,clk;

/*数据类型说明*/
parameter green=4'b1000,yellow=4'b0100,
          left =4'b0010,red=4'b0001;/*定义符号常量*/
reg [3:0] lampa,lampb;
reg [3:0] aredh,ayellowh,agreenh,alefth,
       bredh,byellowh,bgreenh,blefth,
          aredl,ayellowl,agreenl,aleftl,
       bredl,byellowl,bgreenl,bleftl;   /*存储预置值*/
         /*当前计数器值*/
reg      timeout_a,timeout_b;        /*计时到*/
reg [2:0] state_a,state_b;        /*当前状态*/ 
reg [3:0] numah,numal,numbh,numbl;

/*逻辑功能说明*/
always @ (en)
 if(!en)   /*为低时,复位*/
   begin    /*计数器预置值*/
     aredh<=4'd5;aredl<=4'd5;
     ayellowh<=4'd0;ayellowl<=4'h5;
     agreenh<=4'd4; agreenl<=4'd0; 
     alefth<=4'd1;aleftl<=4'd5;

     bredh<=4'd6;bredl<=4'd5;
     byellowh <=4'd0;byellowl<=4'd5;
     bgreenh<=4'd3;bgreenl<=4'd0; 
     blefth<=4'd1;bleftl <=4'd5;
       
       
   end

always @ (posedge clk)
 begin

   if(en)    /*en有效*/
     begin
        if(!timeout_a)   /*计时到*/
         begin
           timeout_a<=1'b1;
        case(state_a) /*绿一黄一左一黄一红*/
            3'd0:begin numah<=agreenh;numal<=agreenl;lampa<=green;
        state_a<=3'd1;   /*绿灯*/
              end
            3'd1:begin numah<=ayellowh;numal<=ayellowl;lampa<=yellow;
                    state_a<=3'd2;   /*黄灯*/
              end
            3'd2:begin numah<=alefth;numal<=aleftl;lampa<=left;
                    state_a<=3'd3;   /*左拐灯*/
             end
            3'd3:begin numah<=ayellowh;numal<=ayellowl;lampa<=yellow;
                    state_a<=3'd4;   /*黄灯*/
              end
            3'd4:begin numah<=aredh;numal<=aredl;lampa<=red;
                    state_a<=3'd0;   /*红灯*/
              end
            default:       lampa<=red;
            endcase
        end /*end if(!timeout_a) */

        else begin   /*减计数*/
                if(numah>=1)
                   if(numal==0) /*BCD计数*/
                     begin numal<=4'b1001; /*低位为0*/
                           numah<=numah-1'b1;
                           

                     end
                   else numal<=numal-1'b1;
                 else if ((numah==0)&&(numal>0))numal<=numal-1'b1;
                      
                 else if((numal==0)&&(numah==0)) timeout_a<=1'b0; /*计时到*/
             end /*end else */
   end  /*end if(en)*/

   else begin    /*关闭控制器*/
        lampa<=red; state_a<=1'b0; timeout_a<=1'b0;
        end

 end      /*end always */

always @ (posedge clk)  /*控制B方向*/
  begin
         if(en) begin   /*en有效*/
       if(!timeout_b) begin /*计时到*/
          timeout_b<=1'b1;
          case(state_b)  /*红一绿一黄一左一黄*/
          3'd0:begin 
                numbh<=bredh;numbl<=bredl;lampb<=red;state_b<=3'd1;
             end
          3'd1:begin 
                numbh<=bgreenh;numbl<=bgreenl;lampb<=green;state_b<=3'd2;
       end
      3'd2:begin 
    numbh<=byellowh;numbl<=byellowl;lampb<=yellow;state_b<=3'd3;
       end
       3'd3:begin 
    numbh<=blefth;numbl<=bleftl;lampb<=left;state_b<=3'd4;
       end
       3'd4:begin 
    numbh<=byellowh;numbl<=byellowl;lampb<=yellow;state_b<=3'd0;
        end
          default: lampb<=red;
          endcase
     end   /*end if(!timeout_b) */

     else begin
        if(numbh>=1)
             if(numbl==0) begin
   numbl<=4'b1001;
   numbh<=numbh-1'b1;
             end
             else numbl<=numbl-1'b1;
              
         else if((numbh==0)&&(numbl>0)) numbl<=numbl-1'b1;
         else if((numbl==0)&&(numbh==0)) timeout_b<=1'b0;  /*计时到*/
     end /*end else */
    end  /*end if(en) */

    else begin
 lampb<=red;timeout_b<=1'b0;state_b<=1'b0;
    end
 end /*end always*/

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -