基于Verilog的汽车尾灯控制器的实现

首先进行模块的定义

模块具有三个输入:时钟,重置,和汽车状态、以及六个输出分别控制左右(l,r)三色LED的红绿蓝三个阴极

   module       car_rear_light
   (      input    clk,
          input    rst,
          input    [   3   :   0   ]car_status,
          output       reg   [   0   :   0   ]l_light_r,          //左侧红灯
          output       reg   [   0   :   0   ]r_light_r,          //右侧红灯
          output       reg   [   0   :   0   ]l_light_g,          //左侧绿灯
          output       reg   [   0   :   0   ]r_light_g,          //右侧绿灯 
          output       reg   [   0   :   0   ]l_light_b,          //左侧蓝灯
          output       reg   [   0   :   0   ]r_light_b           //右侧蓝灯
   );  

因为左右转向灯和双闪均为黄色,所以将左右两个三色LED的红、绿阴极统一安排给l_light、r_light两个变量控制
红+绿 <= 污黄

   reg   [   0   :   0   ]l_light;
   reg   [   0   :   0   ]r_light;

   always   @(   posedge    clk)
   begin
       l_light_r    =    l_light;
       l_light_g    =    l_light;
       r_light_r    =    r_light;
       r_light_g    =    r_light;
   end  

下面进行1Hz的分频

分频模块重新定义参数,分频系数为12M,将板载12MHz的晶振分为1Hz的时钟。

   wire    clk_1Hz;

   divide     #(.WIDTH(   32   ),.N(   12_000_000   ))     u1    (         //分频12MHz到1Hz
       .clk    (clk),
       .rst_n  (rst),
       .clkout (clk_1Hz)   
   );  

最后是逻辑部分的描述


汽车状态由拨码开关控制:
0001 —— 直行,不闪灯
0010 —— 左转,闪左灯
0100 —— 右转,闪右灯
1000 —— 故障,双闪
1111 —— 倒车,两灯白色常亮

   always   @(   posedge    clk_1Hz)
   begin
          case   (car_status)
              4'b0001   :                                   //直行
              begin
               l_light    <=       1   ;
               r_light    <=       1   ;
               l_light_b    <=       1   ;
               r_light_b    <=       1   ;
              end
              4'b0010   :                                   //左转
              begin
               l_light    <=       ~   l_light;
               r_light    <=       1   ;
               l_light_b    <=       1   ;
               r_light_b    <=       1   ;
              end
              4'b0100   :                                   //右转
              begin
               l_light    <=       1   ;
               r_light    <=       ~   r_light;
               l_light_b    <=       1   ;
               r_light_b    <=       1   ;
              end
              4'b1000   :                                   //双闪
              begin
               l_light    <=       ~   l_light;
               r_light    <=       ~   r_light;
               l_light_b    <=       1   ;
               r_light_b    <=       1   ;
              end
                4'b1111   :                                 //倒车
                begin
               l_light    <=       0   ;
               r_light    <=       0   ;
               l_light_b    <=       0   ;
               r_light_b    <=       0   ;
                end
              default   :
              begin
               l_light    <=       1   ;
               r_light    <=       1   ;
               l_light_b    <=       1   ;
               r_light_b    <=       1   ;
                   
              end
          endcase
   end  
02-09 21:54