基於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