数字系统设计技术实验报告
学生姓名:学号:
实验时间:实验地点:嵌入式系统实验室(一)指导老师:
2009年5月14日
一、实验名称:汽车尾灯控制系统设计 二、实验学时:6学时 三、实验目的
1)了解汽车尾灯的工作原理
2)进一步熟悉Verilog语言以及QuartusII开发环境 3)掌握由硬件语言控制LED灯的亮灭
四、实验步骤
根据实验要求作预习报告。 根据实验需求,进行程序的设计。 根据以前设计的经验,反复调试程序。
调试通过,下载到FPGA开发板上进行实践调试。 完成整个过程,写实验报告。
五、实验原理
1.系统设计要求: 用6个发光管模拟6个汽车尾灯(左右各3个),用3个开关作为汽车控制信号,分别为:左拐、右拐和刹车。 车匀速行驶时,6个汽车尾灯全灭;右拐时,车右边3个尾灯从左至右顺序亮灭;左拐时,车左边3个尾灯从右至左顺序亮灭;紧急时车6个尾灯一起明灭闪烁
2.系统设计方案:根据系统设计要求,采用自顶向下设计方法,顶层设计,它由主控模块、左边灯控制模块和右边灯控制模块三部分组成。
六、实验仪器
1.PC机
2. 数字系统设计实验开发板
七、实验结果
灯D1、D2、D3分别代表左方向的三个显示灯,D8、D7、D6分别代表右方向的三个显示灯。仿真开始时,启动控制左转向的开关,左方向灯则会以闪动频率为1Hz 三个灯交替进行变换;启动控制右转向的开关,右方的等则会以闪动频率为1Hz 三个灯交替进行变换;启动控制紧急刹车开关,两方的六个灯以闪动频率为1Hz一同进行交替变换;当恢复正常情况时,即除以上三种情况时,六盏灯则处于灭状态。
七、分析与设计思路
根据系统设计要求,采用自顶向下设计方法,顶层设计,程序主要由分频模块、控制模块(包括:主控制模块、左边灯控制模块和右边灯控制模块三部分组成。)、显示模块三个大模块构成整体框架
八、实验内容
1)汽车尾部左右两侧各有3只尾灯,用作汽车行驶状态的方向指示标志。 2) 当汽车正常向前行驶时,6只尾灯全部熄灭。
3) 当汽车要向左或向右转弯时,相应侧的3只尾灯依次由左至右闪亮。每个灯亮1s,每个周期为3s,另一侧的3只灯不亮。
4) 紧急刹车时,6只尾灯全部闪亮,闪动频率为1Hz
九、实验要求:
实验报告应包含实验目的、实验原理,分析与设计思路,实验程序,对应变量的管脚配置表,实验结果,实验总结。其中具体要求为: 1)程序实现模块化设计,写出设计思路,认真标注代码注释; 2)达到正确地运行结果;
3)实验中出现的问题进行详细总结
十、实验程序代码:
module car(left,right,emer,clk,L); input left,right,emer,clk; output L; reg[7:0] L;
integer a_tmp1,a_tmp2; //分频的计数变量 reg f_1; //产生1HZ,用于倒计时 reg f_100; //产生100HZ,用于快速扫描
//------------------分频模块--------------------------------------------------- //分频得到频率(1hz) always @ (posedge clk) //1hz begin if(a_tmp1==9999999) begin f_1=~f_1; a_tmp1<=0; end else a_tmp1<=a_tmp1+1;
end
//分频得频率(100hz)
always @ (posedge clk) //100hz begin if(a_tmp2==99999) begin f_100=~f_100; a_tmp2<=0; end else a_tmp2<=a_tmp2+1; end
//------------------控制模块--------------------------------------------------- reg[2:0] a,b;//a左b右
reg[2:0] k;//判断处于什么状态 reg[2:0] kl;//左转时控制灯亮 reg[2:0] kr;//右转时控制灯亮 reg ke;//紧急刹车控制
always @(posedge f_1) begin if(left==1) //判断是否左转 begin k<=0; if(kl==2) begin kl<=0; end else kl<=kl+1; end if(right==1) //判断是否右转 begin k<=1; if(kr==2) begin
kr<=0; end else kr<=kr+1; end if(emer==1) //紧急刹车 begin k<=2; ke=~ke; end else if(emer ==0 && right==0 && left==0) begin k<=3; end end
//------------------显示模块--------------------------------------------------- always @(posedge f_100) begin case(k) 0: //left begin case(kl) 1:begin L<=8'b0100_0000;end 2:begin L<=8'b0010_0000;end 0:begin L<=8'b0001_0000;end endcase end 1: //right begin case(kr) 1:begin L<=8'b1000_0000;end 2:begin L<=8'b0000_0001;end 0:begin L<=8'b0000_0010;end endcase end 2: //emer begin case(ke)
end 3: endcase end
endmodule
0:begin L<=8'b1111_0011;end 1:begin L<=8'b0000_0000;end endcase
//正常情况
begin L<=8'b0000_0000;end
十一、实验管教配置显示
十二、实验总结
1) 在实验过程中,我们接受了上次实验的教训,得出程序的编写应该先整体 后局部。于是先建立了一个整体的结构框架的基础上,将其进行调试,无误后再进行了各个细致部位的编写、调试、实现及优化。这样就避免了程序编完后出现的错误无从纠正的情况发生。
2)此次实验我们总结,明白程序语句中的阻塞赋值与非阻塞赋值在always块中,阻塞赋值语句可理解为赋值语句是顺序执行的,而非阻塞语句可理解为赋值语句是并发执行的。而在我们进行语句编译时,起初把语句定义为了阻塞语句,导致在仿真过程中产生的现象仅是执行紧急刹车此种状况,经过反复推敲和检查,在师兄和老师的指导下我们发现了这个错误并且将其改正后就实现了实验预想结果。
3)程序相对于第三次试验的简单一些,我们在上次实验的基础上结合此次的实验要求,进行了分析和编译,最终实现了实验目的所要达到的效果。
X