实例的内容及方针
1.实例的首要练习内容
本实例经过Verilog HDL言语规划一个简易的交通等操控器,完结一个具有两个方向、共8个灯并具有时刻倒计时功用的交通灯功用。
2.实例方针
经过本实例,读者应到达下面的方针。
- 把握Verilog规划一个交通等操控器的办法。
- 开端把握Verilog言语的规划办法。
原理简介
交通灯是城市交通中不行短少的重要东西,是城市交通秩序的重要保障。本实例便是完结一个常见的十字路口交通灯功用。读者经过学习这个交通灯操控器,能够完结一个愈加完好的交通灯。例如完结实时装备各种灯的时刻,手动操控各个灯的状况等。
一个十字路口的交通一般分为两个方向,每个方向具有红灯、绿灯和黄灯3种,别的每个方向还具有左转灯,因而每个方向具有4个灯。
这个交通灯还为每一个灯的状况规划了倒计时数码管显现功用。能够为每一个灯的状况设置一个初始值,灯状况改动后,开端依照这个初始值倒计时。倒计时归零后,灯的状况将会改动至下一个状况。
值得注意的是,交通灯两个方向的灯的状况是相关的。也便是说,每个方向的灯的状况影响着别的一个方向的灯的状况,这样才能够和谐两个方向的车流。假定每个方向的灯是独立改变的,那么交通灯就没有了含义。
如表1所示是两个方向(假定为A,B方向)灯的状况的对应状况。
表1 交通灯两个方向灯状况对应表
方向A |
方向B |
红灯亮 |
黄灯亮或绿灯亮 |
直行绿灯亮 |
红灯亮 |
黄灯亮 |
红灯亮 |
左转灯 |
红灯亮 |
在实践的交通体系中,直行绿灯、左转绿灯和红灯的改变之间都应该有黄灯作为缓冲,以确保交通的安全。因而假定咱们假定方向A的黄灯亮的时刻继续5s,直行绿灯灯亮的时刻继续40s,左转灯灯亮的时刻继续15s,则方向B红灯灯亮的时刻继续为(直行绿灯+黄灯+左转绿灯+黄灯)所耗费的时刻,一共为65s。
相同假定方向B黄灯亮的时刻继续5s,直行绿灯灯亮的时刻继续30s,左转灯灯亮的时刻继续15s,则方向B红灯灯亮的时刻继续为(直行绿灯+黄灯+左转绿灯+黄灯)所耗费的时刻,一共为55s。
详细时刻参数的设定读者能够根据需要进行修正,可是一定要确保两个方向的灯的状况契合表1的要求。
代码剖析
下面给出交通灯操控器的Verilog HDL源代码,首要介绍交通灯端口信号的界说及阐明,读者能够经过这些端口将此交通灯模块实例化至自己的工程规划中。
- CLK:同步时钟。
- EN:使能信号,为高电平时,操控器开端作业。
- LAMPA:操控A方向4盏灯的状况;其间,LAMPA0~LAMPA3别离操控A 方向的左拐灯、绿灯、黄灯和红灯。
- LAMPB:操控B方向4盏灯的状况;其间,LAMPB0~LAMPB3别离操控B 方向的左拐灯、绿灯、黄灯和红灯。
- ACOUNT:用于A方向灯的时刻显现,8位,可驱动两个数码管。
- BCOUNT:用于B方向灯的时刻显现,8位,可驱动两个数码管。
下面是交通灯的Verilog HDL源代码及阐明。
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT); //端口阐明
output[7:0] ACOUNT,BCOUNT;
output[3:0] LAMPA,LAMPB;
input CLK,EN; //内部信号阐明
reg[7:0] numa,numb; //ACOUNT和BCOUNT的内部信号
reg tempa,tempb;
reg[2:0] counta,countb; //方向A和方向B的灯的状况
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;
reg[3:0] LAMPA,LAMPB;
//设置各交通灯的继续时刻初始化值,红灯的值由另一个方向的黄灯和绿灯核算得出。
always @(EN)
if(!EN) begin //使能信号EN无效时,对交通灯的计数值进行初始化
ared =8d55; //55 s , 30 + 5 + 15 + 5
ayellow =8d5; //5 s
agreen =8d40; //40 s
aleft =8d15; //15 s
bred =8d65; //65 s , 40 + 5 + 15 + 5
byellow =8d5; //5 s
bleft =8d15; //15 s
bgreen =8d30; //30 s
end
assign ACOUNT=numa; //8位数码管输出
assign BCOUNT=numb; //8位数码管输出
//操控A方向4种灯的模块
always @(posedge CLK) begin
if(EN) begin //使能有用时,交通灯开端作业
if(!tempa) begin
tempa=1;
case(counta) //操控灯状况的次序
0: begin //状况0
numa=agreen; //直行绿灯亮
LAMPA=2; //输出0010
counta=1; //进入下一个状况
end
1: begin //状况1
numa=ayellow; //黄灯亮
LAMPA=4; //输出0100
counta=2; //进入下一个状况
end
2: begin //状况2
numa=aleft; //左转绿灯亮
LAMPA=1; //输出0001
counta=3; //进入下一个状况
end
3: begin //状况3
numa=ayellow; //黄灯亮
LAMPA=4; //输出0100
counta=4; //进入下一个状况
end
4: begin //状况4
numa=ared; //红灯亮
LAMPA=8; //输出1000
counta=0; //进入下一个状况(状况0)
end
default: //默许状况
LAMPA=8; //红灯亮,输出1000
endcase
end
else begin //每一个状况的倒计时
if(numa>1) //判别倒计时未归零时别离对高位置进行递减
if(numa[3:0]==0) begin
numa[3:0]=4b1001;
numa[7:4]=numa[7:4]-1;
end
else
numa[3:0]=numa[3:0]-1;
if (numa==2)
tempa=0; //倒计时完毕,回来灯状况改变判别,将进入下一个状况
end
end
else begin
LAMPA=4b1000; //使能无效时,红灯亮
counta=0; //回来方向A的状况0(绿灯状况)
tempa=0; //进入状况改变判别
end
end
//操控B方向4种灯的模块,模块的言语描绘与方向A的描绘根本共同,这儿不再重复注释
always @(posedge CLK) begin
if (EN) begin
if(!tempb) begin
tempb=1;
case (countb)
0: begin
numb=bred;
LAMPB=8;
countb=1;
end
1: begin
numb=bgreen;
LAMPB=2;
countb=2;
end
2: begin
numb=byellow;
LAMPB=4;
countb=3;
end
3: begin
numb=bleft;
LAMPB=1;
countb=4;
end
4: begin
numb=byellow;
LAMPB=4;
countb=0;
end
default:
LAMPB=8;
endcase
end
else begin //倒计时
if(numb>1)
if(!numb[3:0]) begin
numb[3:0]=9;
numb[7:4]=numb[7:4]-1;
end
else
numb[3:0]=numb[3:0]-1;
if(numb==2)
tempb=0;
end
end
else begin
LAMPB=4b1000;
tempb=0;
countb=0;
end
end
endmodule
经过上面这个Verilog HDL模块,根本完结了交通灯操控器的根本功用。读者可将此规划应用于实践的硬件体系中,经过晶振、FPGA、开关、LED灯及数码管等资源即可完结硬件完结。