项目名称:汽车尾灯控制器
设计任务与要求
-
基本功能:
- 设计一个能够控制汽车尾灯(6个灯,左、右各3个)的逻辑电路。
- 汽车尾灯的点亮模式应与汽车的行驶状态相对应。
-
具体要求:

- 正常行驶(直行):所有尾灯不亮。
- 左转:左侧3个尾灯从右向左循环点亮,即
001->010->100->001...,形成“流水灯”效果,当左转信号取消时,尾灯全灭。 - 右转:右侧3个尾灯从左向右循环点亮,即
100->010->001->100...,形成“流水灯”效果,当右转信号取消时,尾灯全灭。 - 刹车:所有6个尾灯同时恒亮,无论是否在转弯,只要刹车信号有效,所有灯都应亮。
- 紧急情况/双闪灯:所有6个尾灯同时以1Hz的频率闪烁,刹车信号优先级最高,其次是紧急双闪,再次是左/右转。
-
输入输出信号定义:
- 输入信号:
CLK:系统时钟脉冲信号(用于控制流水灯的闪烁速度,例如1Hz)。RST:系统复位信号,低电平有效,按下时,所有尾灯熄灭。L_TURN:左转控制信号,高电平有效。R_TURN:右转控制信号,高电平有效。BRAKE:刹车控制信号,高电平有效。EMERGENCY:紧急双闪控制信号,高电平有效。
- 输出信号:
L1, L2, L3:左侧3个尾灯的控制信号(1表示亮,0表示灭)。R1, R2, R3:右侧3个尾灯的控制信号(1表示亮,0表示灭)。
- 输入信号:
方案设计与论证
我们可以将整个系统划分为几个核心模块,采用模块化设计思想,使电路清晰、易于实现和调试。
-
核心控制器模块:
- 功能:根据输入的控制信号(
L_TURN,R_TURN,BRAKE,EMERGENCY),判断当前汽车的行驶状态,并输出相应的模式控制信号。 - 实现:这是一个典型的组合逻辑电路,可以使用优先编码器或简单的逻辑门来实现优先级判断,优先级顺序为:
BRAKE>EMERGENCY>L_TURN/R_TURN。 - 输出:该模块输出2位二进制模式控制信号
MODE[1:0]。MODE = 00:正常行驶/无操作MODE = 01:左转MODE = 10:右转MODE = 11:刹车/紧急
- 功能:根据输入的控制信号(
-
分频器模块:

- 功能:实验板提供的通常是高频时钟(如10MHz或50MHz),而尾灯流水灯和双闪灯的速度很慢(如1Hz),分频器用于将高频时钟分频得到一个适合的低频时钟(如1Hz)。
- 实现:使用计数器实现,将10MHz时钟分频为1Hz,需要计数
10^7次,即需要一个24位计数器(2^24 ≈ 16.7M)。
-
流水灯/闪烁控制模块:
- 功能:这是系统的核心时序逻辑部分,它接收
MODE信号、分频后的慢时钟CLK_SLOW和复位信号RST,生成最终的尾灯点亮模式。 - 实现:可以使用一个3位环形计数器或3位移位寄存器来实现循环点亮的功能。
- 当
MODE = 01(左转) 时,计数器在CLK_SLOW的驱动下,按001->010->100->001...循环,其输出直接驱动左侧尾灯。 - 当
MODE = 10(右转) 时,计数器按100->010->001->100...循环,其输出直接驱动右侧尾灯。 - 当
MODE = 11(刹车/紧急) 时,计数器停止工作,输出被强制为全1 (111),实现全亮或闪烁(如果配合门电路)。 - 当
MODE = 00时,计数器清零,输出为全0 (000)。
- 当
- 功能:这是系统的核心时序逻辑部分,它接收
-
输出驱动模块:
- 功能:根据
MODE信号和流水灯控制模块的输出,最终决定每个尾灯的亮灭状态。 - 实现:使用简单的逻辑门组合。
- 刹车优先:
BRAKE为1,则所有尾灯输出为1。 - 紧急闪烁:
EMERGENCY为1且BRAKE为0,则所有尾灯的输出为CLK_SLOW的信号(实现闪烁)。 - 左转/右转:
BRAKE和EMERGENCY都为0,则将流水灯控制器的相应输出直接送到尾灯。
- 刹车优先:
- 功能:根据
具体电路实现
下面我们使用Verilog HDL语言来描述上述模块,这是现代数字电路设计的标准方法,易于在FPGA/CPLD或仿真软件中实现。
顶层模块 tail_light_controller

module tail_light_controller (
input CLK, // 系统高频时钟
input RST, // 复位信号,低电平有效
input L_TURN, // 左转信号
input R_TURN, // 右转信号
input BRAKE, // 刹车信号
input EMERGENCY, // 紧急双闪信号
output reg [2:0] L_TAIL, // 左侧尾灯
output reg [2:0] R_TAIL // 右侧尾灯
);
// 内部信号定义
wire clk_1hz; // 1Hz慢时钟
wire [1:0] mode; // 模式控制信号
reg [2:0] left_pattern; // 左侧流水灯模式
reg [2:0] right_pattern; // 右侧流水灯模式
// --- 模块实例化 ---
// 1. 分频器模块:将高频CLK分频为1Hz的clk_1hz
clk_divider u_divider (
.clk_in(CLK),
.rst_n(RST),
.clk_out(clk_1hz)
);
// 2. 核心控制器模块:根据输入信号决定模式
mode_controller u_mode_controller (
.brake(BRAKE),
.emergency(EMERGENCY),
.l_turn(L_TURN),
.r_turn(R_TURN),
.mode(mode)
);
// 3. 流水灯控制模块:根据模式和慢时钟生成流水灯图案
pattern_generator u_pattern_generator (
.clk(clk_1hz),
.rst_n(RST),
.mode(mode),
.left_pattern(left_pattern),
.right_pattern(right_pattern)
);
// 4. 输出驱动逻辑:最终决定尾灯亮灭
always @(*) begin
if (!RST) begin
L_TAIL = 3'b000;
R_TAIL = 3'b000;
end else begin
// 优先级1: 刹车
if (BRAKE) begin
L_TAIL = 3'b111;
R_TAIL = 3'b111;
end
// 优先级2: 紧急双闪
else if (EMERGENCY) begin
// 注意:这里直接组合逻辑无法实现闪烁,需要寄存器打一拍
// 更好的做法是在pattern_generator内部处理,或在这里使用latch
// 为简化,我们假设pattern_generator已处理
L_TAIL = {3{clk_1hz}}; // clk_1zh为1时全1,为0时全0
R_TAIL = {3{clk_1hz}};
end
// 优先级3: 左转/右转
else begin
L_TAIL = left_pattern;
R_TAIL = right_pattern;
end
end
end
endmodule
分频器模块 clk_divider
// 这是一个简单的分频器,假设输入时钟为50MHz,输出1Hz
// 计数到 25,000,000 - 1
module clk_divider (
input clk_in,
input rst_n,
output reg clk_out
);
reg [24:0] counter; // 2^25 = 33,554,432 > 25,000,000
always @(posedge clk_in or negedge rst_n) begin
if (!rst_n) begin
counter <= 25'd0;
clk_out <= 1'b0;
end else if (counter == 25'd24_999_999) begin
counter <= 25'd0;
clk_out <= ~clk_out; // 翻转输出,得到占空比50%的1Hz方波
end else begin
counter <= counter + 1;
end
end
endmodule
模式控制器模块 mode_controller
module mode_controller (
input brake,
input emergency,
input l_turn,
input r_turn,
output reg [1:0] mode
);
always @(*) begin
// 优先级顺序: brake > emergency > turn
if (brake) begin
mode = 2'b11; // 刹车模式
end else if (emergency) begin
mode = 2'b11; // 紧急模式,与刹车共享同一模式码
end else if (l_turn) begin
mode = 2'b01; // 左转模式
end else if (r_turn) begin
mode = 2'b10; // 右转模式
end else begin
mode = 2'b00; // 正常模式
end
end
endmodule
流水灯控制模块 pattern_generator
module pattern_generator (
input clk, // 1Hz慢时钟
input rst_n, // 复位信号,低电平有效
input [1:0] mode, // 模式控制信号
output reg [2:0] left_pattern,
output reg [2:0] right_pattern
);
reg [1:0] state; // 用于控制流水灯的当前状态 (0, 1, 2)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= 2'b00;
left_pattern <= 3'b000;
right_pattern <= 3'b000;
end else begin
case (mode)
2'b00: // 正常模式
begin
state <= 2'b00;
left_pattern <= 3'b000;
right_pattern <= 3'b000;
end
2'b01: // 左转模式
begin
state <= state + 1;
case (state)
2'b00: left_pattern <= 3'b001;
2'b01: left_pattern <= 3'b010;
2'b10: left_pattern <= 3'b100;
default: left_pattern <= 3'b001;
endcase
right_pattern <= 3'b000; // 右侧不亮
end
2'b10: // 右转模式
begin
state <= state + 1;
case (state)
2'b00: right_pattern <= 3'b100;
2'b01: right_pattern <= 3'b010;
2'b10: right_pattern <= 3'b001;
default: right_pattern <= 3'b100;
endcase
left_pattern <= 3'b000; // 左侧不亮
end
2'b11: // 刹车/紧急模式
begin
// 状态保持不变,输出固定为全亮
left_pattern <= 3'b111;
right_pattern <= 3'b111;
end
default:
begin
state <= 2'b00;
left_pattern <= 3'b000;
right_pattern <= 3'b000;
end
endcase
end
end
endmodule
仿真与验证
- 仿真工具:使用 ModelSim, Vivado Simulator, Quartus Prime 等EDA工具。
- 测试用例:
- 复位测试:
RST拉低,观察所有输出是否为0。 - 正常行驶测试:所有输入为0,观察输出是否为0。
- 左转测试:
L_TURN拉高,观察L_TAIL是否按001->010->100循环,周期为3秒。R_TAIL保持为0。 - 右转测试:
R_TURN拉高,观察R_TAIL是否按100->010->001循环。L_TAIL保持为0。 - 刹车优先级测试:在左转状态下,拉高
BRAKE,观察所有灯是否立即变为全亮,并保持,取消BRAKE后,左转流水灯应恢复。 - 紧急闪烁测试:在正常状态下,拉高
EMERGENCY,观察所有灯是否以1Hz频率闪烁,拉高BRAKE,闪烁应停止,变为常亮。 - 组合测试:同时按下
L_TURN和EMERGENCY,观察是否闪烁(或常亮,取决于设计)。
- 复位测试:
扩展功能(可选,用于拿高分)
- 增加倒车灯:增加一个
REVERSE输入信号,当倒车时,中间的两个尾灯(或指定一个)常亮。 - 增加示廓灯/小灯:增加
DIM_LIGHT输入信号,在夜间行驶时,左右两侧最外侧的尾灯(L1, R1)微亮。 - 动态流水速度:增加一个输入信号来控制流水灯的快慢。
- 硬件实现:如果条件允许,将设计下载到FPGA开发板(如Altera DE2-115, Xilinx Basys3)上,用LED灯模拟尾灯,用拨码开关或按键模拟输入信号,进行实物验证。
本设计方案将汽车尾灯控制器分解为四个功能明确、层次清晰的模块:分频器、模式控制器、流水灯生成器和输出驱动逻辑,这种模块化设计不仅降低了复杂度,也使得每个模块可以独立设计、仿真和测试,大大提高了项目的成功率。
通过Verilog HDL进行描述,使得设计具有很好的可移植性和可重用性,你可以轻松地将此设计适配到不同的FPGA芯片或CPLD上,希望这份详细的指南能对你的数电课程设计有所帮助!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。