/*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执行相同操作*/moduletail_lamp(inputsys_clk,//系统时钟,外部时钟信号的最开始的输入,还需要经历分频才可以被状态机、计数器使用inputsys_rst_n,//系统复位,当输入为低电平逻辑‘0’时,所有的模块都产生复位,系统回复到初始状态input[3:0]state_in,//拨码开关输入,四位拨码开关的输入,实际上我们只使用四个状态,另其中仅有一位为高电平,即可实现四个状态的变化outputreg[2:0]led_left,//左侧尾灯[msb~lsb]=[R,G,B],三位的输出信号,控制可控颜色led灯的闪亮和颜色的变化outputreg[2:0]led_right,//右侧尾灯[msb~lsb]=[R,G,B],三位的输出信号,控制可控颜色led灯的闪亮和颜色的变化outputreg[7:0]led_out//流水灯输出,八位的信号输出,可以利用状态机实现);parameterCNT_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当前状态相关regclk_1hz;//1Hz分频信号,clk外部时钟信号经过分频系数为6000000的分频器输出的信号,频率为1Hzreg[7:0]_go;//前进时单色LED的状态,定义8位的信号作为前进时候的状态信号reg[7:0]_back;//倒车时单色LED的状态,定义8位的信号作为后退时候的状态信号/*计数器实现0.5秒的周期*/always@(posedgesys_clkornegedgesys_rst_n)if(!sys_rst_n)cnt=1'b0;elseif(cnt=CNT_NUM-1)cnt=1'b0;elsecnt=cnt+1'b1;/*当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该计数模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,计数器cnt置为全零状态;如果复位信号为高电平的时候,复位信号不产生效果,则计数器cnt正常计数。当cnt计数数字达到24位全1状态时,计数达到最大值,于是重新开始一轮计数,把计数器信号cnt回复至全零状态。*//*根据计数器的周期实现1Hz信号分频*/always@(posedgesys_clkornegedgesys_rst_n)if(!sys_rst_n)clk_1hz=1'b0;elseif(cnt==CNT_NUM-1)clk_1hz=~clk_1hz;elseclk_1hz=clk_1hz;/*当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该分频模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,分频输出信号输出为低电平全零信号;如果复位信号为高电平的时候,复位信号不产生效果,则分频器按照上一级计数器输出的结果正常输出。当cnt计数信号达到最大值的时候,分频器输出信号电平翻转,取非运算,达到分频系数为6000000的分频效果,输出信号。*/localparamSTOP=4'b0000;localparamGO=4'b0001;localparamLEFT=4'b0010;localparamRIGHT=4'b0100;localparamBACK=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灯只使用红色*/assigntail_on=3'b011;//[msb~lsb]=[R,G,B]assigntail_off=3'b111;//[msb~lsb]=[R,G,B]assigntail_shin={clk_1hz,2'b11};//[msb~lsb]=[R,G,B]//把尾灯的三种状态对应状态记得不同代码。011对应尾灯点亮,111对应尾灯灭。/*车辆前进时,流水灯向上流水*/always@(posedgesys_clkornegedgesys_rst_n)if(!sys_rst_n)_go=8'h7f;elseif(cnt==CNT_NUM-1)_go={_go[0],_go[7:1]};else_go=_go;/*当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该控制前进的模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,前进的输出信号输出为8’h7f信号;如果复位信号为高电平的时候,复位信号不产生效果,则流水灯向上正常流水,显示为前进*//*车辆倒车时,流水灯向下流水*/always@(posedgesys_clkornegedgesys_rst_n)if(!sys_rst_n)_back=8'hfe;elseif(cnt==CNT_NUM-1)_back={_back[6:0],_back[7]};else_back=_back;/*与上一模块前进模块类似,当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该控制后退的模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,后退的输出信号输出为8’hfe信号;如果复位信号为高电平的时候,复位信号不产生效果,则流水灯向下正常流水,显示为后退*//*车辆左转、右转、停止时,流水灯的状态*/assign_left=8'hf0;assign_rignt=8'h0f;assign_stop=8'h00;/*同上文对前进、后退状态的定义,现定义左转状态为8'hf0,右转信号为8'h0f,停止信号为全零状态*//*将次态赋值给当前状态*/always@(posedgesys_clkornegedgesys_rst_n)if(!sys_rst_n)current_state=STOP;elsecurrent_state=next_state;/*当外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该状态机模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,状态机的输出信号输出为为全零信号表示停止信号;如果复位信号为高电平的时候,复位信号不产生效果,状态机正常运转,当前状态被替换为下一状态*//*车辆次态完全由人为通过拨码开关控制*/always@(*)next_state=state_in;/*车辆处于不同状态时,尾灯及流水灯的输出*/always@(current_stateorsys_rst_n)if(!sys_rst_n)beginled_left=tail_shin;led_right=tail_shin;led_out=_stop;endelsecase(current_state)STOP:beginled_left=tail_shin;led_right=tail_shin;led_out=_stop;endGO:beginled_left=tail_off;led_right=tail_off;led_out=_go;endLEFT:beginled_left=tail_shin;led_right=tail_off;led_out=_left;endRIGHT:beginled_left=tail_off;led_right=tail_shin;led_out=_rignt;endBACK:beginled_left=tail_on;led_right=tail_on;led_out=_back;enddefault:beginled_left=tail_shin;led_right=tail_shin;led_out=_stop;endendcaseendmodule/*当本模块作为实验输出的最后一个模块,要把上一部分的状态机信号连接到输出信号。外部输入时钟有下降沿变化变化、或者复位信号有变化的时候,该输出转换模块启动;如果输入的复位信号为低电平的时候,复位信号低电平有效,产生复位效果,后退的输出信号输出为停止stop信号;如果复位信号为高电平的时候,复位信号不产生效果,尾灯的输出对应各个状态机的状态,完成实验*///--------------------------------------------------------------------//Module:tail_lamp_tb//Author:Step//Description:汽车尾灯控制的测试文件//Web:://--------------------------------------------------------------------//Version:|Mod.Date:|ChangesMade://V1.0|2017/4/26|Initialver//--------------------------------------------------------------------`timescale1ns/1psmoduletail_lamp_tb;parameterCNT_NUM=10;//方便仿真,定义新的分频系数,例化时使用/*系统时钟信号的产生*/regsys_clk;initialsys_clk=1'b0;alwayssys_clk=#10~sys_clk;/*系统复位信号的产生,低电平复位*/regsys_rst_n;initialbeginsys_rst_n=1'b0;#20;sys_rst_n=1'b1;end/*拨码开关信号的产生*/reg[3:0]state_in;initialbeginstate_in=4'b0000;//停止#2000;state_in=4'b0001;//前进#2000;state_in=4'b0010;//左转