资源描述
汽车尾灯控制器
报告书写要求
1、 报告的撰写要求条理清晰、语言准确、表述简明。报告中段首空两个字符,中文字体为宋体五号,数字、字符、字母为Times New Roman五号,且单倍行距。
2、 报告中插图应与文字紧密配合,文图相符,技术内容正确。每个图都应配有图题(由图号和图名组成)。图题(宋体小五号)置于图下居中,其中图号按顺序编排,图名在图号之后空一格排写。图中若有分图时,分图号用(a)、(b)等置于分图之下。注:框图、流程图(矢量图)用专业画图软件。
3、 报告中插表应与文字紧密配合,文表相符,技术内容正确。表格不加左、右边线,上、下线需加粗(1.5磅),每个表应配有表题(由表号和表名组成)。表题(宋体小五号)置于表上居中,其中表号按顺序编排,表名在表号之后空一格排写。
4、 报告中公式原则上居中书写。注:公式编辑器编写。
5、 设计报告应按如下内容和顺序A4纸打印、左侧装订成册。
一、设计目的
1.掌握数字系统的设计方法;
2.掌握硬件描述语言——Verilog HDL;
3.掌握模块化设计方法;
4.掌握开发软件的使用方法。
二、设计要求
(1)汽车正常使用时指示灯不亮;
(2)汽车右转时,右侧的一盏灯亮;
(3)汽车左转时,左侧的一盏灯亮;
(4)汽车刹车时,左右两侧的指示灯同时亮;
(5)汽车夜间行驶时,左右两侧的指示灯同时一直亮,供照明使用。
(6)记录车行驶的里程并用8位显示电路显示。
(7)完成全部流程:设计规范文档、模块设计、代码输入、功能仿真、约束与综合、布局布线、下载验证等。
三、设计环境
计算机、QuatusII开发软件
四、设计内容(设计原理和方案、程序设计、仿真分析和适配)
4.1设计原理和方案
1、汽车尾灯控制器就是一个状态机的实例。当汽车正常行驶时所有指示灯都不亮;当汽车向右转弯时,汽车右侧的指示灯RD1亮;当汽车向左侧转弯时,汽车左侧的指示灯LD1亮;当汽车刹车时,汽车右侧的指示灯RD2和汽车左侧的指示灯LD2同时亮;当汽车在夜间行驶时,汽车右侧的指示灯RD2和汽车左侧的指示灯LD2同时一直亮。通过设置系统的输入信号:系统时钟信号clkin、clkin1,汽车左转弯控制信号left,汽车右转弯控制信号right,刹车信号brake,夜间行驶信号night和系统的输出信号:汽车左侧2盏指示灯LD1、LD2和汽车右侧2盏指示灯RD1、RD2.
4.1.1系统分析
(1)汽车正常使用时指示灯不亮;
(2)汽车右转时,右侧的一盏灯亮;
(3)汽车左转时,左侧的一盏灯亮;
(4)汽车刹车时,左右两侧的指示灯同时亮;
(5)汽车夜间行驶时,左右两侧的指示灯同时一直亮,供照明使用。
(6)记录车行驶的里程并用8位显示电路显示。
汽车行驶信号
里 程
计数器
BCD码扫描模块
主
控
模
块
显
示
左灯控制模块
右灯控制模块
时钟
系统整体设计框图
4.2程序设计及仿真
各组成模块原理及程序
汽车尾灯控制器由5个模块组成,分别为:时钟分频模块(1、2、3)、汽车尾灯主控模块(左边灯控制模块和右边灯控制模块)、里程计数器模块、BCD码扫描模块、数码管显示模块。
以下介绍各模块的详细设计:
4.2.1时钟分频模块1程序设计及仿真
时钟分频模块由Verilog程序来实现,下面是其Verilog代码:
module fenpin1(clkin,clkout);
input clkin;
output clkout;
parameter L=2;
reg clkout;
integer cnt; // ding yi zheng xing bian liang
always@(posedge clkin)
begin
if(cnt==L)
begin
cnt<=0;
clkout<=~clkout; //bo xing fan zhuan
end
else
cnt<=cnt+1;
end
endmodule
仿真:
分频模块1
4.2.2主控模块1程序设计及仿真
主控模块1由Verilog程序来实现,下面是其Verilog代码:
module zhukong1(clk,left,right,brake,night,LD1,RD1,LD2,RD2);
input clk,left,right,brake,night;
output LD1,RD1,LD2,RD2;
reg LD1,RD1,LD2,RD2;
always@(posedge clk)
begin
if(left)
begin
LD1=1;
RD1=0;
end
else if(right)
begin
LD1=0;
RD1=1;
end
else if(brake)
begin
LD2=1;
RD2=1;
end
else if(night)
begin
LD2=1;
RD2=1;
end
else
begin
LD1=0;
RD1=0;
LD2=0;
RD2=0;
end
end
endmodule
仿真:
主控模块1
4.2.3时钟分频模块2 (实现左转右转灯闪烁)程序设计及仿真
时钟分频模块2由Verilog程序来实现,下面是其Verilog代码:
module fenpin2(clkin1,clkout1);
input clkin1;
output clkout1;
parameter L=3;//(25000000/2)-1=6249999
reg clkout1;
integer cnt1; // ding yi zheng xing bian liang
always@(posedge clkin1)
begin
if(cnt1==L)
begin
cnt1<=0;
clkout1<=~clkout1; //bo xing fan zhuan
end
else
cnt1<=cnt1+1;
end
endmodule
仿真:
分频模块2
4.2.4主控模块2(控制左转右转灯的闪烁) 程序设计及仿真
主控模块2由Verilog程序来实现,下面是其Verilog代码:
module zhukong2(clk1,LD,RD,LDD1,RDD1);
input clk1,LD,RD;
output LDD1,RDD1;
reg LDD1,RDD1;
always@(posedge clk1)
begin
if(LD)
LDD1=~LDD1;
else if(RD)
RDD1=~RDD1;
end
endmodule
仿真:
主控模块2
4.2.5分频模块3(实现每十个脉冲里程数加一)程序设计及仿真
分频模块3由Verilog程序来实现,下面是其Verilog代码:
module fenpin3(clkin2,clkout2);
input clkin2;
output clkout2;
parameter L=8;
reg clkout2;
integer cnt2; // ding yi zheng xing bian liang
always@(posedge clkin2)
begin
if(cnt2==L)
begin
cnt2<=0;
clkout2<=~clkout2; //bo xing fan zhuan
end
else
cnt2<=cnt2+1;
end
endmodule
仿真:
分频模块3
4.2.6里程计数器模块程序设计及仿真
里程计数器模块由Verilog程序来实现,下面是其Verilog代码:
module lcjishuqi(clk,reset,D,D1,D2,D3,D4,D5,D6,D7);
input clk,reset;
output [3:0] D,D1,D2,D3,D4,D5,D6,D7;
reg[3:0]D,D1,D2,D3,D4,D5,D6,D7;
always@(posedge clk or posedge reset)
begin
if(reset) D7<=0;
else if(D7==9)
D7<=0;
else
D7<=D7+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D6<=0;
else if(D7==9)
if(D6==9)
D6<=0;
else
D6<=D6+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D5<=0;
else if(D7==9&&D6==9)
if(D5==9)
D5<=0;
else
D5<=D5+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D4<=0;
else if(D5==9&&D6==9&&D7==9)
if(D4==9)
D4<=0;
else
D4<=D4+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D3<=0;
else if(D5==9&&D6==9&&D7==9&&D4==9)
if(D3==9)
D3<=0;
else
D3<=D3+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D2<=0;
else if(D5==9&&D6==9&&D7==9&&D4==9&&D3==9)
if(D2==9)
D2<=0;
else
D2<=D2+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D1<=0;
else if(D5==9&&D6==9&&D7==9&&D4==9&&D3==9&&D2==9)
if(D1==9)
D1<=0;
else
D1<=D1+1;
end
always@(posedge clk or posedge reset)
begin
if(reset) D<=0;
else if(D5==9&&D6==9&&D7==9&&D4==9&&D3==9&&D2==9&&D1==9)
if(D==9)
D<=0;
else
D<=D+1;
end
endmodule
仿真:
里程计数器模块
4.2.7BCD码扫描模块程序设计及仿真
BCD码扫描模块由Verilog程序来实现,下面是其Verilog代码:
module bcd(clk1k,data_b,sel,dout);
input clk1k;
input[31:0]data_b;
output[7:0]sel;
output[3:0]dout;
reg[2:0]sel;
reg[3:0]dout;
always@(posedge clk1k)
begin
if(sel<7)
sel=sel+1;
else
sel<=0;
end
always@(sel)
begin
case(sel)
0:dout<=data_b[31:28];
1:dout<=data_b[27:24];
2:dout<=data_b[23:20];
3:dout<=data_b[19:16];
4:dout<=data_b[15:12];
5:dout<=data_b[11:8];
6:dout<=data_b[7:4];
7:dout<=data_b[3:0];
default:dout<=4'bx;
endcase
end
endmodule
仿真:
BCD扫描模块
4.2.8数码管显示模块(译码器)程序设计及仿真
数码管显示模块由Verilog程序来实现,下面是其Verilog代码:
module yima(din,dout);
input [3:0]din;
output [6:0]dout;
reg[6:0]dout;
always@(din)
begin
case(din)
0:dout=7'b1111110; //7E
1:dout=7'b0110000; //30
2:dout=7'b1101101; //6D
3:dout=7'b1111001; //79
4:dout=7'b0110011; //33
5:dout=7'b1011011; //5B
6:dout=7'b1011111; //5F
7:dout=7'b1110000; //70
8:dout=7'b1111111; //7F
9:dout=7'b1111011; //7B
10:dout=7'b1110111; //77
11:dout=7'b0011111; //1F
12:dout=7'b1001110; //4E
13:dout=7'b0111101; //3D
14:dout=7'b1001111; //4F
15:dout=7'b1000111; //47
default:dout=7'b0000000;
endcase
end
endmodule
仿真:
显示译码模块
4.2.9顶层设计及仿真
下面是其Verilog代码:
module wdkz(clkin,clkin1,left,right,brake,night,LD2,RD2,LDD1,RDD1);
input clkin,clkin1,left,right,brake,night;
output LD2,RD2,LDD1,RDD1;
wire clk,clk1,LD,RD;
fenpin1 u1(.clkin(clkin),.clkout(clk));
fenpin2 u2(.clkin1(clkin1),.clkout1(clk1));
zhukong1 A1(.clk(clk),.left(left),.right(right),.brake(brake),.night(night),.LD1(LD),.RD1(RD),.LD2(LD2),.RD2(RD2));
zhukong2 A2(.clk1(clk1),.LD(LD),.RD(RD),.LDD1(LDD1),.RDD1(RDD1));
endmodule
仿真:
顶层模块
4.3适配
五、小结
经过这么多天的努力,终于完成了本学期的硬件描述语言课程设计,过程虽是辛苦的,但从中我学到了很多东西。首先巩固了课上学习的理论知识,对于硬件描述语言的系统化整体化有了更深的认识。在编写程序的过程中遇到了很多困难经过反复修改不断修正最终才能得以执行。再次是经过搜集资料基本了解了Quartus软件的使用。整个设计过程最大的收获就是意识到理论知识扎实的重要性,实践是建立在理论之上的。
回顾此次硬件描述语言课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近两星期的日子里,可以说得是苦多于甜,但是学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,比如说不懂一些元器件的使用方法,对硬件描述语言掌握得不好,通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在王秀琴、夏洪洋老师的指导下,终于迎刃而解。
俗话说“好的开始是成功的一半”。说起课程设计,我认为最重要的就是做好设计的预习,认真的研究老师给的题目,选一个自己有兴趣的题目。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计就会事半功倍,如果没弄明白,就迷迷糊糊的去选题目做设计,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。
在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。通过题目选择和设计电路的过程中,加强了我思考问题的完整性.
展开阅读全文