Verilog交通灯.docx
《Verilog交通灯.docx》由会员分享,可在线阅读,更多相关《Verilog交通灯.docx(12页珍藏版)》请在冰豆网上搜索。
![Verilog交通灯.docx](https://file1.bdocx.com/fileroot1/2022-12/8/e0209d5a-29ed-4d23-bf6d-73d82587aeef/e0209d5a-29ed-4d23-bf6d-73d82587aeef1.gif)
Verilog交通灯
摘 要
VerilogHDL作为一种规范的硬件描述语言,被广泛应用于电路的设计中。
它的设计描述可被不同的工具所支持,可用不同器件来实现。
利用VerilogHDL语言自顶向下的设计方法设计交通灯控制系统,使其实现道路交通的正常运转,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Quartus5.0完成综合、仿真。
此程序通过下载到FPGA芯片后,可应用于实际的交通灯控制系统中。
关键词:
VerilogHDL;硬件描述语言;状态;FPGA
Abstract
Asacommonlanguageforthedescriptionofhardware,VerilogHDLiswidelyappliedincircuitdesigning.Thedesigndescriptioncanbesupporttedbydifferenttoolsandimplementedbydifferentdevices.Inthispaper,theprocessofdesigningtrafficlightcontrollersystembytheVerilogHDLtopdowndesignmethodispresented,whichhasmadetheroadtrafficworkwell,thedesignofthissystemhasshownthereadability,portabilityandeasilyunderstandingofVerilogHDLasaharddescriptionlanguageCircuitsynthesisandsimulationareperformedbyQuartus5.0.TheprogramcanbeusedinthetrulytrafficlightcontrollersystembydownloadingtotheFPGAchip
Keywords:
VerilogHDL;hardwaredescriptionlanguage;state;FPGA
目录
一、概述.................................................4
二、任务功能.............................................5
三.系统设计.............................................5
1.工作原理..........................................5
2.系统设计方案......................................6
四、程序设计.............................................7
1.verilog源程序......................................7
2.设备选择...........................................11
3.引脚绑定...........................................12
五、仿真.................................................12
1.仿真波形...........................................12
2.硬件验证...........................................12
六、结束语...............................................13
七、参考文献.............................................14
一:
概述
HDL(HardwareDescriptionLanguage,硬件描述语言)是一种描述硬件所做工作的语言。
目前,电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,HDL在这种形势下显示出了巨大的优势,展望将来HDL在硬件设计领域的地位将与C和C++在软件设计领域地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法而成为主要的硬件描述工具。
VerilogHDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另一种是VHDL。
现在它们都已成为IEEE标准。
两者各有特点,但VerilogHDL拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。
Quartus简介:
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
二、任务功能
交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制。
在现代化的大城市中,十字交叉路口越来越多,在每个交叉路口都需要使用红绿灯进行交通指挥和管理,红、黄、绿灯的转换要有一个准确的时间间隔和转换顺序,这就需要有一个安全、自动的系统对红、黄、绿灯的转换进行管理,本系统就是基于此目的而开发的。
基本要求:
(1)设计一个交通红绿灯。
要求分主干道和支干道,每条道上安装红(主:
red1,支:
red2)绿(主:
green1,支:
green2)黄(主:
yellow1,支:
yellow2)三种颜色灯,由四种状态自动循环构成;
(2)在交通灯处在不同的状态时,设计一个计时器以倒计时方式显示计时,主干道上绿灯亮30S,支干道上绿灯亮20S。
每个干道上,在绿灯转为红灯时,要求黄灯先亮5S。
在完成基本要求的基础上,可进一步增加功能、提高性能,如绿灯亮的时间可调。
三、系统设计
1.工作原理:
城市十字交叉路口红绿灯控制系统主要负责控制主干道走向和从干道走向的红绿灯的状态和转换顺序,关键是各个状态之间的转换和进行适当的时间延时,正是基于以上考虑,采用如下设计:
S0:
当主干道走向的绿灯亮时,从干道走向的红灯亮,并保持30s
S1:
当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5s
S2:
当主干道走向的红灯亮时,从干道走向的绿灯亮,并保持20s
S3:
当主干道走向的黄灯亮时,从干道走向的黄灯亮,并保持5s
在S3结束后又回到
(1)状态,并周期重复进行。
状态图如下:
30秒
S1
S0
5秒
5秒
S2
S3
20秒
2.系统设计方案:
根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图所示:
四、程序设计
1.verilog源程序:
moduletraffic(en,clk,rst,num1,num2,light1,light2,out1,out2,out3,out4,in1,in2);
inputen,clk,rst,in1,in2;//en为使能端。
in1,in2控制绿灯和红灯亮时间
output[7:
0]num1,num2;
output[2:
0]light1,light2;
output[6:
0]out1,out2,out3,out4;//输出四个数码管
reg[6:
0]out1,out2,out3,out4;
regtim1,tim2;
reg[1:
0]state1,state2;
reg[2:
0]light1,light2;
reg[7:
0]num1,num2;
reg[7:
0]red1,red2,green1,green2,yellow1,yellow2;
parameters0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;//四个循环状态
reg[25:
0]count;regdiv;
always@(en)
if(en)
begin//设置计数初值
if(!
in1)begingreen1<=8'b00110000;red2<=8'b00110000;end//30H,即30秒
elsebegingreen1<=8'b01100000;red2<=8'b01100000;end//60s
if(!
in2)beginred1<=8'b00100000;green2<=8'b00100000;end//20s
elsebeginred1<=8'b01000000;green2<=8'b01000000;end//40s
yellow1<=8'b00000101;yellow2<=8'b00000101;//05s
end
always@(posedgeclk)//分频
if(count==25000000)begindiv<=1;count<=count+1;end
elseif(count==50000000)begindiv<=0;count<=0;end
elsecount<=count+1;
always@(posedgediv)
begin
if(rst)//复位情况控制
begin
light1<=3'b001;
num1<=green1;
end
elseif(en)
begin//使能有效开始控制计数
if(!
tim1)//开始控制
begin//主干道交通灯点亮控制
tim1<=1;
case(state1)//状态机
s0:
beginnum1<=green1;light1<=3'b001;state1<=s1;end
s1:
beginnum1<=yellow1;light1<=3'b010;state1<=s2;end
s2:
beginnum1<=red1;light1<=3'b100;state1<=s3;end
s3:
beginnum1<=yellow1;light1<=3'b010;state1<=s0;end
default:
light1<=3'b100;
endcase
end
else
begin//倒数计时
if(num1>0)
if(num1[3:
0]==0)
begin
num1[3:
0]<=4'b1001;
num1[7:
4]<=num1[7:
4]-1;//十位减1
end
elsenum1[3:
0]<=num1[3:
0]-1;//个位减1
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always@(posedgediv)//从干道
begin
if(rst)//复位情况控制
begin
light2<=3'b100;
num2<=red2;
end
elseif(en)
begin
if(!
tim2)
begin
tim2<=1;
case(state1)
s0:
beginnum2<=red2;light2<=3'b100;state2<=s1;end
s1:
beginnum2<=yellow1;light2<=3'b010;state2<=s2;end
s2:
beginnum2<=green2;light2<=3'b001;state2<=s3;end
s3:
beginnum2<=yellow2;light2<=3'b010;state2<=s0;end
default:
light2<=3'b100;
endcase
end
else
begin//倒数计时
if(num2>0)
if(num2[3:
0]==0)
begin
num2[3:
0]<=4'b1001;
num2[7:
4]<=num2[7:
4]-1;
end
elsenum2[3:
0]<=num2[3:
0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always@(posedgeclk)
begin//数码管译码显示
case(num1[3:
0])
4'b0000:
out1<=~7'b0111111;//0,3F
4'b0001:
out1<=~7'b0000110;//1,06
4'b0010:
out1<=~7'b1011011;//2,5B
4'b0011:
out1<=~7'b1001111;//3,4F
4'b0100:
out1<=~7'b1100110;//4,66
4'b0101:
out1<=~7'b1101101;//5,6D
4'b0110:
out1<=~7'b1111101;//6,7D
4'b0111:
out1<=~7'b0000111;//7,07
4'b1000:
out1<=~7'b1111111;//8,7F
4'b1001:
out1<=~7'b1101111;//9,6F
default:
out1<=~7'b0111111;//0,3F
endcase
end
always@(posedgeclk)
begin//数码管译码显示
case(num1[7:
4])
4'b0000:
out2<=~7'b0111111;//0,3F
4'b0001:
out2<=~7'b0000110;//1,06
4'b0010:
out2<=~7'b1011011;//2,5B
4'b0011:
out2<=~7'b1001111;//3,4F
4'b0100:
out2<=~7'b1100110;//4,66
4'b0101:
out2<=~7'b1101101;//5,6D
4'b0110:
out2<=~7'b1111101;//6,7D
4'b0111:
out2<=~7'b0000111;//7,07
4'b1000:
out2<=~7'b1111111;//8,7F
4'b1001:
out2<=~7'b1101111;//9,6F
default:
out2<=~7'b0111111;//0,3F
endcase
end
always@(posedgeclk)
begin//数码管译码显示
case(num2[3:
0])
4'b0000:
out3<=~7'b0111111;//0,3F
4'b0001:
out3<=~7'b0000110;//1,06
4'b0010:
out3<=~7'b1011011;//2,5B
4'b0011:
out3<=~7'b1001111;//3,4F
4'b0100:
out3<=~7'b1100110;//4,66
4'b0101:
out3<=~7'b1101101;//5,6D
4'b0110:
out3<=~7'b1111101;//6,7D
4'b0111:
out3<=~7'b0000111;//7,07
4'b1000:
out3<=~7'b1111111;//8,7F
4'b1001:
out3<=~7'b1101111;//9,6F
default:
out3<=~7'b0111111;//0,3F
endcase
end
always@(posedgeclk)
begin//数码管译码显示
case(num2[7:
4])
4'b0000:
out4<=~7'b0111111;//0,3F
4'b0001:
out4<=~7'b0000110;//1,06
4'b0010:
out4<=~7'b1011011;//2,5B
4'b0011:
out4<=~7'b1001111;//3,4F
4'b0100:
out4<=~7'b1100110;//4,66
4'b0101:
out4<=~7'b1101101;//5,6D
4'b0110:
out4<=~7'b1111101;//6,7D
4'b0111:
out4<=~7'b0000111;//7,07
4'b1000:
out4<=~7'b1111111;//8,7F
4'b1001:
out4<=~7'b1101111;//9,6F
default:
out4<=~7'b0111111;//0,3F
endcase
end
endmodule
2.设备选择:
3.引脚绑定
五、仿真
1.仿真波形:
2.硬件验证:
将verilog源程序文件下载到DE2开发板进行硬件验证,完成检测和调试。
截图如下:
六、结束语
硬件描述语言课程设计就要结束了,这次课程设计历时近一个多星期,通过这个星期的学习,发现了自己的很多不足,发现了很多知识上的漏洞。
同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
交通灯设计过程中遇到了多处困难,比如怎样使四种亮灯状态循环进行,经过思考选择了状态机实现。
还有每个状态的延时模块设计最为复杂,运用多个if--else语句时经常无法得到理想结果,检查发现是没有正确配对,要使用begin--end构成模块。
由于要显示倒计时,必须用到译码转换电路,对数码管显示也做了复习。
通过实验,我深刻体会到多个always语句并行执行的含义。
另外还有分频电路的实现和引脚的绑定。
还有一点是那就是细心认真。
此次设计我由于编程的时候没有做到足够的细心,导致一串代码弄混了。
但是密密麻麻的英文字母混在一起,我始终没有发现。
最终在调试的时候,就出现了问题。
只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。
这也让我真正的明白了,科学的严谨性,它不允许出半点差错,否则后果会是比较麻烦的。
这次课程设计让我学到了很多,不仅是巩固了先前学的verilog的理论知识,而且也培养了我的动手能力,更加熟悉了Quartus的使用和EDA的设计流程,更令我的创造性思维得到拓展。
七、参考文献
[1]夏宇闻.Verilog数字系统设计[M].北京:
北京航空航天大学出版社,2008
[2]康华光.电子技术基础(数字部分)[M].北京:
高等教育出版社,2006
[3]徐志军,徐光辉.CPLD/FPGA的开发与应用[M].北京:
电子工业出版社,2002
[4]张明.VerilogHDL实用教程[M].成都:
电子科技大学出版社,1999
[5]HydeDC.BucknellHandbookonVerilogHDLComputerScienceDepartment,BucknellUniversityLewisburg,1995