资源描述
^`
数电课程设计
题
目
交通灯设计
学生姓名:
专 业: 电子信息工程
指导教师:
完成日期: 2016-6-30
摘 要
Verilog HDL作为一种规范的硬件描述语言,被广泛应用于电路的设计中。它的设计描述可被不同的工具所支持,可用不同器件来实现。利用Verilog HDL语言自顶向下的设计方法设计交通灯控制系统,使其实现道路交通的正常运转,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Quartus5.0完成综合、仿真。此程序通过下载到FPGA芯片后,可应用于实际的交通灯控制系统中。
关键词:Verilog HDL;硬件描述语言;状态;FPGA
Abstract
As a common language for the description of hardware, Verilog HDL is widely applied in circuit designing. The design description can be supportted by differenttools and implemented by different devices.In this paper, the process of design ing traffic light controller system by the Verilog HDL topdown design method is presented, which has made the road traffic work well, the design of t his system has shown the readability, portability and easily understanding of Verilog HDL as a hard description language Circuit synthesis and simulation are pe rformed by Quartus5.0. The program can be used in the truly traffic light controller system by downloading to the FPGA chip
Keywords:Verilog HDL; hardware description language; 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(Hardware Description Language,硬件描述语言)是一种描述硬件所做工作的语言。目前,电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,HDL在这种形势下显示出了巨大的优势,展望将来HDL在硬件设计领域的地位将与C和C++在软件设计领域地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法 而成为主要的硬件描述工具。
Verilog HDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另一种是VHDL。现在它们都已成为IEEE标准。两者各有特点,但Verilog HDL拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。
Quartus简介:
Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。 Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。 此外,Quartus II 通过和DSP Builder工具与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源程序:
module traffic(en,clk,rst,num1,num2,light1,light2,out1,out2,out3,out4,in1,in2);
input en,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;
reg tim1,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;
parameter s0=2b00,s1=2b01,s2=2b10,s3=2b11;//四个循环状态
reg[25:0]count;reg div;
always @(en )
if(en)
begin //设置计数初值
if (!in1)begin green1<=8b00110000;red2<=8b00110000; end//30H,即30秒
else begin green1<=8b01100000;red2<=8b01100000;end//60s
if (!in2)begin red1<=8b00100000;green2<=8b00100000; end//20s
else begin red1<=8b01000000;green2<=8b01000000; end//40s
yellow1<=8b00000101; yellow2<=8b00000101;//05s
end
always@(posedge clk)//分频
if (count==25000000) begin div<=1;count<=count+1;end
else if(count==50000000)begin div<=0;count<=0;end
else count<=count+1;
always @(posedge div)
begin
if(rst) //复位情况控制
begin
light1<=3b001;
num1<=green1;
end
else if(en)
begin //使能有效开始控制计数
if(!tim1) //开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)//状态机
s0:begin num1<=green1;light1<=3b001;state1<=s1;end
s1:begin num1<=yellow1;light1<=3b010;state1<=s2;end
s2:begin num1<=red1;light1<=3b100;state1<=s3;end
s3:begin num1<=yellow1;light1<=3b010;state1<=s0;end
default:light1<=3b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4b1001;
num1[7:4]<=num1[7:4]-1;//十位减1
end
else num1[3:0]<=num1[3:0]-1; //个位减1
if(num1==1) tim1<=0;
end
end
else
begin
light1<=3b010;
num1=2b00;
tim1<=0;
end
end
always @(posedge div ) //从干道
begin
if(rst) //复位情况控制
begin
light2<=3b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
s0:begin num2<=red2;light2<=3b100;state2<=s1;end
s1:begin num2<=yellow1;light2<=3b010;state2<=s2;end
s2:begin num2<=green2;light2<=3b001;state2<=s3;end
s3:begin num2<=yellow2;light2<=3b010;state2<=s0;end
default:light2<=3b100;
endcase
end
else
begin //倒数计时
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1) tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2b00;
light2<=3b010;
end
end
always @(posedge clk)
begin //数码管译码显示
case(num1[3:0])
4b0000: out1<=~7b0111111; //0 ,3F
4b0001: out1<=~7b0000110; //1 ,06
4b0010: out1<=~7b1011011; //2 ,5B
4b0011: out1<=~7b1001111; //3 ,4F
4b0100: out1<=~7b1100110; //4 ,66
4b0101: out1<=~7b1101101; //5 ,6D
4b0110: out1<=~7b1111101; //6 ,7D
4b0111: out1<=~7b0000111; //7 ,07
4b1000: out1<=~7b1111111; //8, 7F
4b1001: out1<=~7b1101111; //9, 6F
default: out1<=~7b0111111; //0 ,3F
endcase
end
always @(posedge clk)
begin //数码管译码显示
case(num1[7:4])
4b0000: out2<=~7b0111111; //0 ,3F
4b0001: out2<=~7b0000110; //1 ,06
4b0010: out2<=~7b1011011; //2 ,5B
4b0011: out2<=~7b1001111; //3 ,4F
4b0100: out2<=~7b1100110; //4 ,66
4b0101: out2<=~7b1101101; //5 ,6D
4b0110: out2<=~7b1111101; //6 ,7D
4b0111: out2<=~7b0000111; //7 ,07
4b1000: out2<=~7b1111111; //8, 7F
4b1001: out2<=~7b1101111; //9, 6F
default: out2<=~7b0111111; //0 ,3F
endcase
end
always @(posedge clk)
begin //数码管译码显示
case(num2[3:0])
4b0000: out3<=~7b0111111; //0 ,3F
4b0001: out3<=~7b0000110; //1 ,06
4b0010: out3<=~7b1011011; //2 ,5B
4b0011: out3<=~7b1001111; //3 ,4F
4b0100: out3<=~7b1100110; //4 ,66
4b0101: out3<=~7b1101101; //5 ,6D
4b0110: out3<=~7b1111101; //6 ,7D
4b0111: out3<=~7b0000111; //7 ,07
4b1000: out3<=~7b1111111; //8, 7F
4b1001: out3<=~7b1101111; //9, 6F
default: out3<=~7b0111111; //0 ,3F
endcase
end
always @(posedge clk)
begin //数码管译码显示
case(num2[7:4])
4b0000: out4<=~7b0111111; //0 ,3F
4b0001: out4<=~7b0000110; //1 ,06
4b0010: out4<=~7b1011011; //2 ,5B
4b0011: out4<=~7b1001111; //3 ,4F
4b0100: out4<=~7b1100110; //4 ,66
4b0101: out4<=~7b1101101; //5 ,6D
4b0110: out4<=~7b1111101; //6 ,7D
4b0111: out4<=~7b0000111; //7 ,07
4b1000: out4<=~7b1111111; //8, 7F
4b1001: out4<=~7b1101111; //9, 6F
default: out4<=~7b0111111; //0 ,3F
endcase
end
endmodule
2. 设备选择:
3.引脚绑定
五、仿真
1.仿真波形:
2.硬件验证:
将verilog源程序文件下载到DE2开发板进行硬件验证,完成检测和调试。截图如下:
六、结束语
七、参考文献
[1]夏宇闻.Verilog数字系统设计[M].北京: 北京航空航天大学出版社,2008
[2]康华光.电子技术基础(数字部分)[M].北京:高等教育出版社,2006
[3]徐志军,徐光辉.CPLD/FPGA的开发与应用[M].北京:电子工业出 版社,2002
[4]张明.Verilog HDL实用教程[M].成都:电子科技大学出版社,1999
[5]Hyde D C.Bucknell Handbook on VerilogHDLComputer Science Department, Bucknell University Lewisburg,1995
展开阅读全文
相关搜索