当前位置:文档之家› Verilog_HDL的交通灯控制器设计

Verilog_HDL的交通灯控制器设计

课程设计报告

2015-2016学年第2学期

课程设计名称:电子综合设计EDA课程设计

院(系):电子信息学院

专业:电子信息工程班级:电子1313 姓名: xx 学号: 1310034303xx

综合实验时间: 2016/7/11-2016/7/15 指导教师:钟旭

提交时间: 2016/7/15

上海电机学院课程设计任务书

目录

第一章设计原理 (4)

1.1设计要求 (4)

1.2设计思路和原理 (4)

1.3实现方法 (4)

第二章 Verilog HDL程序设计 (6)

2.1整体设计 (6)

2.2 具体设计 (7)

第三章仿真测试 (7)

3.1 波形仿真 (7)

第四章设计总结 (10)

第一章设计原理

1.1设计要求

设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示。[1]

1.2设计思路和原理

(1) 主、支干道用传感器检测车辆到来情况,实验电路用逻辑开关代替。

(2) 选择1HZ时钟脉冲作为系统时钟。

(3) 45s、25s、5s定时信号可用顺计时,也可用倒计时,计时起始信号由主控电路给出,每当计满所需时间,启、闭三色信号灯,并启动另一计时电路。

(4) 交通灯状态变化如表1及图1所示:

表1 交通灯状态图

图1 交通灯状态图

(5) 交通灯设计输入信号4个:CLK(时钟),EN(使能),EMERGENCY(紧急),BCHECK(检测) ;输出信号4个:LAMPA(主干道信号灯),LAMPB(支干道信号灯),ACOUNT(主干道计数器),BCOUNT(支干道计数器)。交通灯控制原理如图2所示。

图2 交通灯原理图

1.3实现方法

本次采用文本编辑法,即利用Verilog HDL 语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED 模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。[2]

第二章 Verilog HDL 程序设计

2.1整体设计

根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:

状状状状状状状状状状状状00

状状10

状状11状状01状状状状状状状状状状状状状状状

状状状状状状状状状状

状状状状状状状状状状状状状状状001100010

010001010

100010

图2 交通灯控制状态转化

说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。

为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:

图3 交通灯控制系统结构图

其中rst 为复位信号,clk 为时钟信号,hold 为特殊情况控制信号,输入hold 时两个方向红灯无条件亮起。

2.2 具体设计

根据整体设计要求,编写各个功能部分Verilog HDL程序,设置各输入输出变量说明如下

clk:为计数时钟;

qclk:为扫描显示时钟;

en:使能信号,为1 的话,则控制器开始工作;

rst:复位信号,为1的话,控制及技术回到初始状态;

hoid:特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;

light1:控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制主干道方向的

绿灯、黄灯和红灯;

light2:控制支干道方向四盏灯的亮灭;其中,light2[0] ~ light2[2],分别控制支干道方向的

绿灯、黄灯和红灯;

num1:用于主干道方向灯的时间显示,8 位,可驱动两个数码管;

num2:用于支干道方向灯的时间显示,8 位,可驱动两个数码管;

counter:用于数码管的译码输出;

st1,st2:数码管扫描信号。

详细设计步骤:

(1) 确定4个输入信号与4个输出信号,具体见图2;

(2) 将50MHZ时钟分频为1MHZ;

(3) 设计红黄绿3中信号灯切换的时间及顺序;

(4) 设计支路检测状态下的信号灯切换;

(5) 设计紧急(EMERGENCY)状态下信号灯的切换;

(6) 程序使用3always块[1],详细代码如下:

总体程序见程序清单所示

第三章仿真测试

3.1 波形仿真

在仿真软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示:

仿真截止时间:100us;

时钟:clk 1us,qclk 0.1us

3.1.1 正常工作时波形仿真图

图4没有紧急情况时主干道和支干道的信号灯的显示状态

图5没有紧急情况时主干道和支干道的信号灯的显示状态

图6没有紧急情况时主干道和支干道的信号灯的显示状态

图7没有紧急情况时主干道和支干道的信号灯的显示状态

图8 没有紧急情况时主干道和支干道的信号灯的显示状态

图9有紧急情况时主干道和支干道的信号灯的显示状态

波形仿真主要完成了控制与计数以及数码管显示的波形图。num1,num2分别表示主干道和支干道的倒计时,num1 = 00100000主干道计时20秒 num2 = 00100101支干道计时25秒;s1用来表示主干道最短通车时间是否已到,到了s1=1;s2用来表示支干道最长通车时间是

否已到,到了s2=1,控制输出量从高位到低位分别表示红,黄,绿为light1=001,light2=100,counter用于时钟计数。hold为紧急情况时主干道和支干道的信号灯为红灯。

图6 顶层文件图

结果分析:仿真结果符合设计要求,交通灯有规律的变化,显示倒计时;在检测支路无车辆和紧急情况下,交通灯可以做出相应调整。设计中使用FSM(三段式),此方式描述方法虽然代码结构复杂了一些,但是使FSM 做到了同步寄存器输出,有利于实现交通灯控制[2]。

第四章设计总结

这次课程设计,通过对交通等控制器设计,解决了之前课上存在的一些困惑,就是对测试程序的编写,调试,对于测试程序有了很大的提升。在程序编写和调试过程中从图书馆借阅了很多相关程序,并对原理和算法进行理解,收获很大。

对于课题,首先进行了单元模块的设计,将每一个单元模块设计完成后再经行仿真,仿真成功后就可以进行顶层文件的编写了,在顶层文件的编写过程中遇到了一些问题,特别是各模块之间的连接,以及信号的定义,总是有错误。有的时候信号的定义容易出现混淆,在反复的修改过后,顶层文件终于能够编译成功了。在波形仿真的过程中,同样遇到了困难,有的时候会出现仿真时间过长的问题,这个时候应该修改系统时钟的频率。在设计的过程中还应该多联系下实际情况,要了解实际情况下交通信号灯的工作情况,才能更好的完成此次

的课程设计。这次的课程设计使我巩固了以前学习到的知识,还使我掌握了以前没有掌握的知识,同时锻炼了自己的能力。

通过这次课程设计,并进一步熟练了对Xilinx ISE软件的操作。通过与同学探讨和请教老师,终于把问题都解决了,并加深了对交通灯原理和设计思路的了解。同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。最后参照每个模块把输入和输出引脚设定,运用我们所学的Verilog语言进行编程。总之,通过这次的设计,进一步了解了EDA 技术,收获很大,对软件编程,排错调试,相关仪器设备的使用技能等方面得到较全面的锻炼和提高。

程序清单

module sy(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2); input en,clk,qclk,rst,hold,rst1;

output st1,st2;

output[7:0] num1,num2;

output[6:0]counter;

output[2:0] light1,light2;

reg tim1,tim2,st1,st2;

reg[1:0]state1,state2,ste;

reg[2:0]light1,light2;

reg[3:0]num;

reg[6:0]counter;

reg[7:0] num1,num2;

reg[7:0] red1,red2,green1,green2,yellow1,yellow2;

always @(en )

if(!en)

begin //设置计数初值

green1<=8'b00110101;

red1<=8'b00100101;

yellow1<=8'b00000101;

green2<=8'b00100101;

red2<=8'b00110101;

yellow2<=8'b00000101;

end

always @(posedge clk )

begin

if(rst) //复位与特殊情况控制

begin

light1<=3'b001;

num1<=green1;

end

else if(hold)

begin

light1<=3'b100;

num1<=green1;

end

else if(en)

begin //使能有效开始控制计数

if(!tim1) //开始控制

begin //主干道交通灯点亮控制

tim1<=1;

case(state1)

2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end 2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end 2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end

2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;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;

end

else num1[3:0]<=num1[3:0]-1;

if(num1==1) tim1<=0;

end

end

else

begin

light1<=3'b010;

num1=2'b00;

tim1<=0;

end

end

always @(posedge clk )

begin

if(rst) //复位与特殊情况控制

begin

light2<=3'b100;

num2<=red2;

end

else if(hold)

begin

light2<=3'b100;

num2<=red2;

end

else if(en)

begin

if(!tim2)

begin

tim2<=1;

case(state1)

2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end

2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end 2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end 2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;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

else num2[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 @(posedge qclk)

begin //数码管扫描

if(rst1)

begin

st1=0;

st2=0;

end

else

begin

case({st2,st1})

2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01; end 2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10; end 2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11; end 2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00; end endcase

end

end

always @(posedge qclk)

begin //数码管译码显示

case(num)

4'b0000: counter<=7'b0111111; //0

4'b0001: counter<=7'b0000110; //1

4'b0010: counter<=7'b1011011; //2

4'b0011: counter<=7'b1001111; //3

4'b0100: counter<=7'b1100110; //4

4'b0101: counter<=7'b1101101; //5

4'b0110: counter<=7'b1111101; //6

4'b0111: counter<=7'b0000111; //7

4'b1000: counter<=7'b1111111; //8

4'b1001: counter<=7'b1101111; //9

default: counter<=7'b0111111; //0

endcase

end

endmodule

测试程序:

module syy;

// Inputs

reg en;

reg clk;

reg qclk;

reg rst;

reg rst1;

reg hold;

// Outputs

wire [7:0] num1;

wire [7:0] num2;

wire [2:0] light1;

wire [2:0] light2;

wire [6:0] counter;

wire st1;

wire st2;

// Instantiate the Unit Under Test (UUT) sy uut (

.en(en),

.clk(clk),

.qclk(qclk),

.rst(rst),

.rst1(rst1),

.hold(hold),

.num1(num1),

.num2(num2),

.light1(light1),

.light2(light2),

.counter(counter),

.st1(st1),

.st2(st2)

);

initial begin

// Initialize Inputs

en = 0;

clk = 0;

qclk = 0;

rst = 0;

rst1 = 0;

hold = 0;

#500 en=0;

#500 en=1;

hold=0;

#500 rst=1;

rst1=1;

#500 rst=0;

rst1=0;

end

always #500 clk=~clk;

always #50 qclk=~qclk; endmodule

参考资料

[1]《Verilog数字系统设计教程》夏宇闻编著北京航空航天大学出版社

[2] 《EDA设计实验教程》艾明晶编著清华大学出版社

小组分工

课程设计评语及成绩评定记录

教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。教育革命的对策是手脑联盟,结果是手与脑的力量都可以大到不可思议。

相关主题
文本预览
相关文档 最新文档