数字电路与逻辑设计用Verilog编程用FPGA实现汽车尾灯控制系统实验报告学院:信息与通信工程学院专业:电子信息工程班级: 2015211103组员:*** 2015210077张楷 2015210078一.实验要求根据汽车行驶状态自动控制汽车尾灯1.直行:尾灯不亮2.右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮3.左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮4.临时停车或故障:两侧尾灯同时闪烁5.倒车显示二.用FPGA实现方式设计1.用三色LED代表左右汽车尾灯,为了便于区分,左尾灯选择靠左的三色LED且显示为蓝色,右尾灯选择靠右的三色LED且显示为红色。
两灯同时闪烁表示停车或倒车。
2.用八个单色LED以流水灯的方式显示汽车的行驶状态,向前滚动表示汽车前行,向后滚动表示汽车到车,只有前四个LED 亮表示左转,只有后四个LED亮表示右转。
3.用四个拨码开关分别表示前行、左转、右转、故障(倒车),器输入组合1000表示前行,0100表示左转、0010表示右转、0001表示故障(倒车);三.设计思路分析1.使用不同的进程来分别处理时钟分频及各个状态下的灯光效果2.用三色LED代表左右汽车尾灯3.用拨码开关控制汽车行驶状态4.用单色LED显示汽车行驶状态5.使用状态机的思想来设计,通过过状态来决定灯光效果,通过外部输入来改变状态。
四.波形仿真五.管脚分配1.输入管脚分配:2.输出管脚分配:六.实验总结体会:(1)本次实验,我们采用模块化的设计方法,将整体分成不同功能的模块,如计时模块、分频模块、显示控制模块、LED灯显示模块,然后分模块编写程序(由小组人员分工完成),之后再将模块之间用变量连接起来,从而实现汽车尾灯显示要求。
(2)在实现本次设计的过程中,使我们了解了汽车尾灯的基本原理,从而让我们觉得,首次将我们的专业知识与生活联系起来,增强了我们对本课程的学习兴趣。
(3)在本次实验的实现过程中,通过调用case语句、always语句,是我们进一步加深了对case、always语句的认识,并且能够将其运用到其他设计中,使我们进一步熟练了这种设计方法和verilog程序设计语言。
七.实现代码1.汽车尾灯控制系统module tail_lamp(input sys_clk, //系统时钟input sys_rst_n, //系统复位input [3:0] state_in, //拨码开关输入output reg [2:0] led_left, //左侧尾灯[msb~lsb] = [R,G,B]output reg [2:0] led_right, //右侧尾灯[msb~lsb] = [R,G,B]output reg [7:0] led_out //流水灯输出);parameter CNT_NUM = 6_000_000; //计数器实现分频的分频系数localparam STOP = 4'b0000;localparam GO = 4'b0001;localparam LEFT = 4'b0010;localparam RIGHT = 4'b0100;localparam BACK = 4'b1000;wire [2:0] tail_on; //尾灯点亮状态wire [2:0] tail_off; //尾灯熄灭状态wire [2:0] tail_shin; //尾灯闪烁状态wire [7:0] _left; //左转时单色LED的状态wire [7:0] _rignt; //右转时单色LED的状态wire [7:0] _stop; //停止时单色LED的状态reg [23:0] cnt; //计数器,reg [3:0] current_state;//当前状态reg [3:0] next_state; //下一个状态reg clk_1hz; //1Hz分频信号reg [7:0] _go; //前进时单色LED的状态reg [7:0] _back; //倒车时单色LED的状态/*计数器实现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;elsecnt <= cnt + 1'b1;/*根据计数器的周期实现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;elseclk_1hz <= clk_1hz;/*尾灯的三种状态,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] /*车辆前进时,流水灯向上流水*/always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)_go <= 8'h7f;else if(cnt == CNT_NUM-1)_go <= {_go[0],_go[7:1]};else_go <= _go;/*车辆倒车时,流水灯向下流水*/always@(posedge sys_clk or negedge sys_rst_n)if(!sys_rst_n)_back <= 8'hfe;else if(cnt == CNT_NUM-1)_back <= {_back[6:0],_back[7]};else_back <= _back;/*车辆左转、右转、停止时,流水灯的状态*/ assign _left = 8'hf0;assign _rignt = 8'h0f;assign _stop = 8'h00;/*将次态赋值给当前状态*/always@(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n)current_state <= STOP;elsecurrent_state <= next_state;/*车辆次态完全由人为通过拨码开关控制*/always@(*)next_state = state_in;/*车辆处于不同状态时,尾灯及流水灯的输出*/ always@(current_state or sys_rst_n)if(!sys_rst_n) beginled_left = tail_shin;led_right = tail_shin;led_out = _stop ;endelsecase(current_state)STOP : begin led_left = tail_shin; led_right = tail_shin; led_out = _stop ; endGO : begin led_left = tail_off ; led_right = tail_off ; led_out = _go ; endLEFT : begin led_left = tail_shin; led_right = tail_off ; led_out = _left ; endRIGHT : begin led_left = tail_off ; led_right = tail_shin; led_out = _rignt; endBACK : begin led_left = tail_on ; led_right = tail_on ; led_out = _back ; enddefault : begin led_left = tail_shin; led_right = tail_shin; led_out = _stop ; endendcaseendmodule2.仿真代码`timescale 1ns / 1psmodule tail_lamp_tb;parameter CNT_NUM = 10; //方便仿真,定义新的分频系数,例化时使用/*系统时钟信号的产生*/reg sys_clk;initialsys_clk = 1'b0;alwayssys_clk = #10 ~sys_clk;/*系统复位信号的产生,低电平复位*/reg sys_rst_n;initialbeginsys_rst_n = 1'b0;#20;sys_rst_n = 1'b1;end/*拨码开关信号的产生*/reg [3:0] state_in;initialbeginstate_in = 4'b0000; // 停止#20;state_in = 4'b0001; // 前进#20;state_in = 4'b0010; // 左转#20;state_in = 4'b0100; // 右转#20;state_in = 4'b0000; // 停止#20;state_in = 4'b1000; // 倒车#20;state_in = 4'b0000; // 停止#20;$stop; // 结束仿真endwire [2:0]led_left,led_right; wire [7:0]led_out;/*例化设计文件*/tail_lamp #(.CNT_NUM (CNT_NUM ))u1(.sys_clk (sys_clk ), // 系统时钟.sys_rst_n (sys_rst_n ), // 系统复位.state_in (state_in ), // 拨码开关输入.led_left (led_left ), // 左侧尾灯[msb~lsb] = [R,G,B].led_right (led_right ), // 右侧尾灯 [msb~lsb] = [R,G,B].led_out (led_out ) // 流水灯输出);endmodule。