您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > FPGA汽车尾灯课程设计
设计题目学院专业班级队员姓名学号联系方式指导老师2014年12月13日课程设计题目一:汽车车尾灯摘要本次设计的目的就是通过实践深入了解电子电路的设计技术并掌握VerilogHDL硬件描述语言的设计方法和思想。以计算机组成原理为指导,通过学习VerilogHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识和基本单元电路的综合设计应用。通过对实用汽车尾灯控制器的设计和数字钟的设计,巩固和综合运用所学知识,提高IC设计能力,提高分析、解决计算机技术实际问题的独立工作能力。1.设计任务与要求随着社会的发展,科学技术也在不断的进步,状态机的应用越来越广泛。现代交通越来越拥挤,安全问题日益突出,在这种情况下汽车尾灯控制器的设计成为解决交通安全问题一种好的途径。在本课程设计根据状态机原理实现了汽车尾灯常用控制。汽车尾灯控制器应满足以下基本要求:1.汽车正常使用时指示灯不亮2.汽车右转时,右侧的三盏灯亮3.汽车左转时,左侧的三盏灯亮4.汽车刹车时,左右两侧的指示灯同时闪烁汽车尾灯和汽车运行状态控制表开关控制汽车运行状态左转尾灯右转尾灯1S0SD4D5D6D1D2D300正常运行灯灭灯灭01右转弯灯灭按D1D2D3顺序循环点亮10左转弯按D4D5D6顺序循环点亮灯灭11临时刹车所有尾灯随时钟CP同时闪烁2.设计思路汽车尾灯控制器的原理框图如图1-1所示,包括一个主控制器模块,LED闪烁定时器模块,按键扫描定时器模块,一个置数寄存器模块几个部分。LED闪烁定时器将高频的时钟信号分频,控制LED灯闪烁的频率。扫描定时器将高频的时钟信号分频,控制主控制器读取按键数据的频率。置数寄存器用来准备LED将要输出的数据,控制LED灯的亮灭。其中主控制器是核心部分,负责其他几个模块功能实现,———————————————————————————————————————1)分频器实现程序 思路:闪烁定时器与扫描定时器都是相同的分频方法。模块输入一个CLK上升沿后执行一次。板子输入CLK=50Mhz,temp计数N次后,f_out取反一次,故f_out取反2次才是一个完整的边沿波形。因此f_out的周期T=(1/50Mhz)*N*2,频率为f=1/[(1/50Mhz)*N*2],若f_out输出1hz,则计数个数N=25000,000。主控制器时钟闪烁定时器扫描定时器左转灯右转灯置数寄存器按键接口图1-1汽车尾灯控制器原理框图程序:always@(posedgeclk)beginif(a_tmp1==N)beginf_out=~f_out;a_tmp=0;endelsea_tmp=a_tmp+1;endStart计数clk个数temp=0输出口f_out=0Temp=N?fout=~fouttemp=0YesTemp++No图1-2分频器流程2)按键扫描实现程序 思路:根据要求:left=1,right=0则设置成左三灯依次点亮,left=0,right=1则设置成右三灯依次点亮,left=1,right=1则设置成所有灯点亮,left=0,right=0则设置成所有灯熄灭,按键扫描模块输入的是1hz的频率,left,right是按键输入引脚,如流程图1-3所示,按键扫描是并行执行的。K是后面LED置数的入口标志,代表LED进入不同的显示模式。kl,kr,ke则代表点亮哪个LED灯。kl=0代表点亮左边第一个LED灯,kl=2代表点亮左边第三个LED灯,kr=0代表点亮右边第一个LED灯,ke=0则代表六盏灯全灭,ke=1代表六盏灯全亮。每进行一次按键扫描,则会进行如下设置:1.确定点亮左边的灯还是右边的灯,是全灭还是全亮(K决定)2.若确定了点亮左或右的灯,则再确定具体点亮哪一盏。(kl,kr,ke决定)。因为输入1hz频率,所以灯是以1hz的频率闪动的。程序:always@(posedgef_1)beginif(left==1&&right==0)begink=0;if(kl==2)beginkl=0;endelsekl=kl+1;endif(right==1&&left==0)beginStart读取leftright键值left=0right=0left=1left=0left=1right=1right=0right=1K=0K=1K=2K=3k=1;if(kr==2)beginkr=0;endelsekr=kr+1;endnonoyesyeskl=2?kr=2?ke=~kekl=0kl++kr=0kr++end图1-3按键扫描流程3)LED亮灭控制实现程序 思路:LED控制程序输入的是100hz的频率,故led刷新的频率是按键扫描的100倍,比按键扫描快很多,因此led显示的值是由按键扫描的频率(较慢的频率)主导的。按键扫描用来设置灯显示参数,其频率是1hz,因此灯亮灭的频率也应该是1hz。按键扫描传入了入口参数K,表示进入哪种显示模式(左转弯0、右转弯1、紧急2,正常3),显示参数kl,kr,ke代表具体是亮哪一盏灯。kl,ke是bit参数,控制某一个灯的亮灭,ke是6bit的参数,控制所有的灯的亮灭。程序:always@(posedgef_100)begincase(k)0://leftbegincase(kl)0:beginL=8'b0000_1000;end1:beginL=8'b0001_0000;end2:beginL=8'b0010_0000;endendcaseend1://rightbegincase(kr)0:beginL=8'b0000_0100;end1:beginL=8'b0000_0010;end2:beginL=8'b0000_0001;endendcaseend2://emerbegincase(ke)0:beginL=8'b0011_1111;end1:beginL=8'b0000_0000;endendcaseend3://正常情况beginL=8'b0000_0000;endendcaseendStart读取K值K=0K=1K=2K=3熄灭六盏灯按kl的值点亮左三盏灯的某一盏按kr的值点亮右三盏灯的某一盏按ke的值点亮或熄灭六盏灯End图1-4LED控制流程3.时序仿真1)正常情况 分析:可以看到,当left和right代表的两个拨动开关没有拨上时,代表左尾灯和右尾灯的6盏LED灯没有输出,处于全灭状态。2)打左转灯 分析:当给left端口一个高电平信号,左尾灯D4D5D6循环输出高电平,即拨上left对应的拨动开关时,D4D5D6这3盏LED灯按顺序循环点亮。3)打右转灯 分析:当给right端口一个高电平信号,右尾灯D1D2D3循环输出高电平,即拨上right对应的拨动开关时,D1D2D3这3盏LED灯按顺序循环点亮。4)紧急刹车 分析:当left和right同时输入一个高电平信号时,6盏LED同时随时钟闪烁,此时为紧急刹车状态。以上功能仿真均符合程序预期。结果正确。4.实验验证管脚分配图 SW0PIN_N25右灯控制开关SW1PIN_N26左灯控制开关50MHZ时钟PIN_N2时钟信号输入Led0PIN_AE22右0灯Led1PIN_AF22右1灯Led2PIN_W19右2灯Led3PIN_V18左3灯Led4PIN_U18左4灯Led5PIN_U17左5灯 测试过程 1)左转弯控制模块及分析当只有SW1拨上时,LED4~LED6(3~5号灯)循环亮灯,LED1~LED3(0~2号灯)灭灯。结果如图1:2)右转弯控制模块及分析当只有SW0拨上时,LED1~LED3(0~2号灯)循环亮灯,LED4~LED6(3~5号灯)灭灯。结果如图2:3)临时刹车控制模块及分析当SW0和SW1同时拨上时,六个LED灯循环亮灭。结果如图3:经调试,程序正确运行,以上结果均达到预期!5.实验总结原来接到通知说这次课程设计时间比较紧张,只有3天时间。而且周三我们还有实验考试。因此我们选了很一个相对简单的题目:车尾灯控制器。它的逻辑很简单,只要检测相应的拨动开关是否被按下,由两个拨动开关控制六盏LED的亮灭。共分为四种情况,对应的情况为LED赋值,则可以实现状态控制表上的尾灯功能。老师建议我们尽量使用Verilog语言编程,藉此多学习一点新知识,让这个课程设计更有意义。因此,我们决定学习Verilog语言来实现我们的题目。我们通过查找相关的资料,熟悉Verilog语言的语法,很快把功能实现了。Verilog语言跟c语言有很多类似之处,但是Verilog描述的硬件是可以在同一时间同时运行的,属于并行结构而C程序是按行依次执行的,属于顺序结构,此外,Verilog因为是针对硬件描述的,语法规则比较严谨。但是,因为有C语言的基础,我们很快就上手了。我们在调试过程中还是遇到了一些问题,例如程序中一句判断语句使用elseif时仿真会先出现一串高电平,改成if以后就正常了。因为初次使用Verilog语言编程,每个小错误都会花费我们很多的时间来检查调试。最后终于把作品做出了,对我们来说是很大的鼓舞。我相信只要有方法,肯花心思,一定做出优秀的作品。通过这门课程,我们学到了Verilog语言的基础和FPGA的开发经验,这会成为我们以后做更大的项目开发的财富。最后,非常感谢杨健老师的指导。老师非常耐心的为我们解决问题,也为我们提供了一些新的思路,这对我们的帮助很大。附录:程序清单modulecarled(left,right,clk,L);inputclk,left,right;outputL;reg[5:0]L;integera_tmp1,a_tmp2;//分频的计数变量regf_1;//产生1HZ,用于倒计时regf_100;//产生100HZ,用于快速扫描//------------------分频模块--50MHzinput-------------------------------------------------//分频得到频率(1hz)always@(posedgeclk)//1hz//posedge:beginif(a_tmp1==25000000)//1hzbeginf_1=~f_1;a_tmp1=0;endelsea_tmp1=a_tmp1+1;end//分频得频率(100hz)always@(posedgeclk)//100hzbeginif(a_tmp2==250000)//5hzbeginf_100=~f_100;a_tmp2=0;endelsea_tmp2=a_tmp2+1;end//------------------控制模块---------------------------------------------------reg[2:0]a,b;//a左b右reg[2:0]k;//判断处于什么状态reg[2:0]kl;//左转时控制灯亮reg[2:0]kr;//右转时控制灯亮regke;//紧急刹车控制always@(posedgef_1)beginif(left==1&&right==0)//判断是否左转begink=0;if(kl==2)beginkl=0;endelsekl=kl+1;endif(right==1&&left==0)//判断是否右转begink=1;if(kr==2)beginkr=0;endelsekr=kr+1;endif(right==1&&left==1)//紧急刹车begink=2;ke=~ke;endif(right==0&&left==0)begink=3;endend//------------------显示模块---------------------------------------------------always@(posedgef_100)begincase(k)0://leftbegincase(kl)0:beginL=8'b0000_1000;end1:begin
本文标题:FPGA汽车尾灯课程设计
链接地址:https://www.777doc.com/doc-4579789 .html