Verilog HDL 模拟 汽车尾灯自动控制系统

Posted hhh江月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog HDL 模拟 汽车尾灯自动控制系统相关的知识,希望对你有一定的参考价值。

Verilog HDL 模拟 汽车尾灯自动控制系统

一、要求介绍:

设计一个汽车尾灯自动控制系统

要求:根据汽车行驶状态自动控制汽车尾灯
直行:尾灯不亮
右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮
左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮
临时停车或故障:两侧尾灯同时闪烁
倒车显示(可选)

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

二、代码实现

1、主模块的代码

module car(rst, clk, start, left, right, error, back, 
led11, led12, led13, led21, led22, led23);

	input rst; 
	// reset.
	input clk;
	// clock.
	
	input start;
	// strat the car.
	input left;
	// go left.
	input right;
	// go right.
	input error;
	// if error.
	input back;
	// go back.
	
	output reg led11;
	output reg led12;
	output reg led13;
	output reg led21;
	output reg led22;
	output reg led23;
	// lights.
	
	wire clkout1;
	wire clkout2;
	
	time_split #(.N(6000000),
						.WIDTH(23)) t1 (
					.clk(clk),
					.rst_n(rst),
					.clkout(clkout1));
					// time_split 1.
					// 2 Hz.
	
	time_split #(.N(3000000),
						.WIDTH(23)) t2 (
					.clk(clk),
					.rst_n(rst),
					.clkout(clkout2));
					// time_split 2.	
					// 4 Hz.
	
	always@(posedge clk)
	begin
		if(start)
		// the car has started.
		begin
		if(~left && ~right && ~error && back)
		// no other operators.
		begin		
				led11 <= 1;
				led12 <= 1;
				led13 <= 1;
				led21 <= 1;
				led22 <= 1;
				led23 <= 1;
				// all the lights are closed.
			end
			
			// four situations.
			else
			begin
				if(left)
				// turn left.
				begin
					led11 <= 1;
					led12 <= clkout1;// turn left.
					// 2 Hz.
					led13 <= 1;
					led21 <= 1;
					led22 <= 1;
					led23 <= 1;
				end
				
				if(right)
				// turn right.
				begin
					led11 <= 1;
					led12 <= 1;
					led13 <= 1;
					led21 <= 1;
					led22 <= clkout1;// turn right.
					// 2 Hz.
					led23 <= 1;
				end
				
				if(error)
				// if there is an error or stop the car.
				begin
					led11 <= clkout2;
					// if there is an error or stop the car.
					// 4 Hz.
					led12 <= 1;
					led13 <= 1;
					led21 <= clkout2;
					// if there is an error or stop the car.
					// 4 Hz.
					led22 <= 1;
					led23 <= 1;
				end
				
				if(~back)
				// if go back
				begin
					led11 <= 1;
					led12 <= 1;
					led13 <= clkout1;// if go back
					// 2 Hz.
					led21 <= 1;
					led22 <= 1;
					led23 <= clkout1;// if go back
					// 2 Hz.
				end
				
			end
		end
		
		else
		// do not start.
		begin
			led11 <= 1;
			led12 <= 1;
			led13 <= 1;
			led21 <= 1;
			led22 <= 1;
			led23 <= 1;
			// all the lights are closed.
		end
	end
	
endmodule

2、时钟分频模块

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : divide.v
// Module name  : divide
// Author       : STEP
// Description  : clock divider
// Web          : www.stepfpga.com
// 
// --------------------------------------------------------------------
// Code Revision History : 
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2017/03/02   |Initial ver
// --------------------------------------------------------------------
// Module Function:任意整数时钟分频
 
module time_split (	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,否则计数会溢出
//	
	
	
	parameter N=12000000;
	parameter WIDTH=24;
 
	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     

然后,我们进行管脚的分配:


接下来就是进行编译:


最后进行烧录:

三、效果展示

我们还是采用视频的方法来进行效果的展示与呈现:

(如果你喜欢的话就去点个赞吧)

https://www.bilibili.com/video/BV1JL411778U?spm_id_from=333.999.0.0

Verilog HDL 模拟 汽车尾灯自动控制系统

最后,谢谢大家的支持了啦。

喜欢的话就点个赞吧。

以上是关于Verilog HDL 模拟 汽车尾灯自动控制系统的主要内容,如果未能解决你的问题,请参考以下文章

基于Protues数电汽车尾灯控制电路系统-毕设课设

verilog hdl中啥是综合?啥是模拟?

1-1 Verilog HDL简介

用3-8线译码器74LS138D触发器74LS74设计汽车尾灯控制电路

verilog HDL 实现十六路彩灯的控制 谢谢大神

原创如何使用DE2的1602LCD --之一(quartus)(verilog)(digital logic)