北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(1)设计一个汽车尾灯自动控制系统

北邮22信通一枚~

跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章

持续关注作者 迎接数电实验学习~

获取更多文章,请访问专栏:

北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客

 

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(1)设计一个汽车尾灯自动控制系统_第1张图片

目录

一.题目要求

二.代码部分

2.1  car_system.v

 2.2  divide.v

三.管脚分配

四.实现效果


一.题目要求

设计一个汽车尾灯自动控制系统,要求根据汽车行驶状态自动控制汽车尾灯:

直行:尾灯不亮;

右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮;

左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮;

临时停车或者故障:两侧尾灯同时闪烁;

注:用三色LED代码表左右汽车尾灯,用拨码开关控制汽车行驶状态没还可以考虑用七段数码管和单色LED显示汽车的状态。

二.代码部分

2.1  car_system.v

module car_system 
(
	input [3:0] sw,
	input clk,
	input rst_n,
	output reg [5:0] led
);

	wire clk_1HZ;
	divide #(.WIDTH(32),.N(12000000))divide_1
	(
		.clk(clk),
		.rst_n(rst_n),
		.clkout(clk_1HZ)
	);
	
	parameter [3:0]
	start = 4'b0000,
	forward = 4'b0000,
	turn_left = 4'b0001,
	turn_right = 4'b1000,
	temp_stop = 4'b1001,
	back = 4'b1111;
	
	reg [3:0]
	current_state,
	next_state;
	
	initial
		begin 
			current_state <= 4'b0000;
			next_state <= 4'b0000;
		end
	
	always @(posedge clk_1HZ or negedge rst_n)
		begin 
			if(~rst_n)
				begin current_state <= start;end
			else
				begin current_state <= next_state;end
		end
	always @ (current_state or sw)
		begin 
			case(current_state)
				start: 
					case(sw)
						forward : next_state = forward;
						turn_left : next_state = turn_left;
						turn_right : next_state = turn_right;
						temp_stop : next_state = temp_stop;
						back : next_state = back;
						default : next_state = start;
					endcase
				forward : next_state = start;
				turn_left : next_state = start;
				turn_right : next_state = start;
				temp_stop : next_state = start;
				back : next_state = start;
			endcase
		end
	always @ (current_state)
		begin 
			led = 6'b111111;
			case (current_state)
				start : led = 6'b111111;
				forward :led = 6'b111111;
				turn_left : led = 6'b000111;
				turn_right : led = 6'b111000;
				temp_stop : led = 6'b000000;
				back : led = 6'b101101;
				default : led = 6'b111111;
			endcase
		end
endmodule

 2.2  divide.v

module divide (	clk,rst_n,clkout);
 
        input 	clk,rst_n;                       //输入信号,其中clk连接到FPGA的C1脚,频率为12MHz
        output	clkout;                          //输出信号,可以连接到LED观察分频的时钟
 
        //parameter是verilog里常数语句
	parameter	WIDTH	= 3;             //计数器的位数,计数的最大值为 2**WIDTH-1
	parameter	N	= 5;             //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出
 
	reg 	[WIDTH-1:0]	cnt_p,cnt_n;     //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
	reg			clk_p,clk_n;     //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟
 
	//上升沿触发时计数器的控制
	always @ (posedge clk or negedge rst_n )         //posedge和negedge是verilog表示信号上升沿和下降沿
                                                         //当clk上升沿来临或者rst_n变低的时候执行一次always里的语句
		begin
			if(!rst_n)
				cnt_p<=0;
			else if (cnt_p==(N-1))
				cnt_p<=0;
			else cnt_p<=cnt_p+1;             //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器
		end
 
         //上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
         always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				clk_p<=0;
			else if (cnt_p<(N>>1))          //N>>1表示右移一位,相当于除以2去掉余数
				clk_p<=0;
			else 
				clk_p<=1;               //得到的分频时钟正周期比负周期多一个clk时钟
		end
 
        //下降沿触发时计数器的控制        	
	always @ (negedge clk or negedge rst_n)
		begin
			if(!rst_n)
				cnt_n<=0;
			else if (cnt_n==(N-1))
				cnt_n<=0;
			else cnt_n<=cnt_n+1;
		end
 
        //下降沿触发的分频时钟输出,和clk_p相差半个时钟
	always @ (negedge clk)
		begin
			if(!rst_n)
				clk_n<=0;
			else if (cnt_n<(N>>1))  
				clk_n<=0;
			else 
				clk_n<=1;                //得到的分频时钟正周期比负周期多一个clk时钟
		end
 
        assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;      //条件判断表达式
                                                                    //当N=1时,直接输出clk
                                                                    //当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p
                                                                    //当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
endmodule     

三.管脚分配

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(1)设计一个汽车尾灯自动控制系统_第2张图片

四.实现效果

实现效果
拨码开关 效果显示
初始状态 0000 LED全不亮
直行 0000 LED全不亮
左转 0001 LED左三个亮灭交替
右转 1000 LED右三个亮灭交替
临时停车 1001 LED左三个&&右三个 亮灭交替
倒车 1111 LED左一个&&右一个 亮灭交替

你可能感兴趣的:(北邮22级信通院数电实验,fpga开发)