模块具有三个输⼊:时钟,重置,和汽车状态、以及六个输出分别控制左右(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
发布评论