汽车尾灯控制系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* Function: 在小脚丫STEP-MXO2上用状态机实现模拟汽车尾灯控制。

1),用三色LED代表左右汽车尾灯

2),用拨码开关控制汽车行驶状态

3),用单色LED显示汽车行驶状态

尾灯控制:

1),直行:尾灯不亮,单色LED向上流水滚动

2),右转:右侧尾灯按秒闪烁,左侧不亮,单色LED亮其中4个灯

3),左转:左侧尾灯按秒闪烁,右侧不亮,单色LED亮另外4个灯

4),停车:两侧尾灯同时闪烁,单色LED保持全亮

5),倒车:两侧尾灯常亮,单色LED向下流水滚动

拨码开关状态:

STOP: state_in == 4'b0000 停车

GO: state_in == 4'b0001 直行

LEFT: state_in == 4'b0010 左转

RIGHT: state_in == 4'b0100 右转

BACK: state_in == 4'b1000 倒车

其他拨码开关输入状态同STOP执行相同操作

*/

module tail_lamp

(

input sys_clk, //系统时钟,外部时钟信号的最开始的输入,还需要经历分频才可以被状态机、计数器使用

input sys_rst_n, //系统复位,当输入为低电平逻辑‘0’时,所有的模块都产生复位,系统回复到初始状态input [3:0] state_in, //拨码开关输入,四位拨码开关的输入,实际上我们只使用四个状态,另其中仅有一位为高电平,即可实现四个状态的变化

output reg [2:0] led_left, //左侧尾灯[msb~lsb] = [R,G,B],三位的输出信号,控制可控颜色led灯的闪亮和颜色的变化

output reg [2:0] led_right, //右侧尾灯[msb~lsb] = [R,G,B],三位的输出信号,控制可控颜色led灯的闪亮和颜色的变化

output reg [7:0] led_out //流水灯输出,八位的信号输出,可以利用状态机实现

);

parameter CNT_NUM = 6_000_000; //计数器实现分频的分频系数,经历分频系数为6000000的分频,可以使信号变为周期为1s,频率为1Hz的信号

reg [23:0] cnt; //计数器,定义24位的变量作为计数器

reg [3:0] current_state;//当前状态,定义4位的变量为当前信号

reg [3:0] next_state; //下一个状态,定义4位的变量作为下一状态信号,与current_state当前状态相关

reg clk_1hz; //1Hz分频信号,clk外部时钟信号经过分频系数为6000000的分频器输出的信号,频率为1Hz

reg [7:0] _go; //前进时单色LED的状态,定义8位的信号作为前进时候的状态信号

reg [7:0] _back; //倒车时单色LED的状态,定义8位的信号作为后退时候的状态信号

/*计数器实现0.5秒的周期*/

always@(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

cnt <= 1'b0;

else if(cnt >= CNT_NUM-1)

cnt <= 1'b0;

else

cnt <= cnt + 1'b1;

/*当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该计数模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,计数器cnt置为全零状态;如果复位信号为高电平的时候,复位信号不产生效果,则计数器cnt正常计数。当cnt计数数字达到24位全1状态时,计数达到最大值,于是重新开始一轮计数,把计数器信号cnt回复至全零状态。*/

/*根据计数器的周期实现1Hz信号分频*/

always@(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

clk_1hz <= 1'b0;

else if(cnt == CNT_NUM-1)

clk_1hz <= ~clk_1hz;

else

clk_1hz <= clk_1hz;

/*当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该分频模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,分频输出信号输出为低电平全零信号;如果复位信号为高电平的时候,复位信号不产生效果,则分频器按照上一级计数器输出的结果正常输出。当cnt 计数信号达到最大值的时候,分频器输出信号电平翻转,取非运算,达到分频系数为6000000的分频效果,输出信号。*/

localparam STOP = 4'b0000;

localparam GO = 4'b0001;

localparam LEFT = 4'b0010;

localparam RIGHT = 4'b0100;

localparam BACK = 4'b1000;

/*定义拨码开关的四位输入信号对于stop、go、left、right、back的五种状态,为下面代码的实现做准备。

wire [2:0] tail_on; //尾灯点亮状态,三位的信号,对应下面代码状态记得状态

wire [2:0] tail_off; //尾灯熄灭状态, 三位的信号,对应下面代码状态记得状态

wire [2:0] tail_shin; //尾灯闪烁状态, 三位的信号,对应下面代码状态记得状态

wire [7:0] _left; //左转时单色LED的状态,八位的信号。对应左转时单色的led的流水状态wire [7:0] _rignt; //右转时单色LED的状态,八位的信号。对应左转时单色的led的流水状态wire [7:0] _stop; //停止时单色LED的状态,八位的信号。对应左转时单色的led的流水状态

/*尾灯的三种状态,RGB灯只使用红色*/

assign tail_on = 3'b011; //[msb~lsb] = [R,G,B]

assign tail_off = 3'b111; //[msb~lsb] = [R,G,B]

assign tail_shin = {clk_1hz,2'b11}; //[msb~lsb] = [R,G,B]

//把尾灯的三种状态对应状态记得不同代码。011对应尾灯点亮,111对应尾灯灭。

/*车辆前进时,流水灯向上流水*/

always@(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

_go <= 8'h7f;

相关文档
最新文档