基于EDA的VHDL语言设计的交通灯

更新时间:2024-06-20 12:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

玉林师范学院本科生课程设计论文

基于Verilog HDL的RS编码器设计

院 系 专 业 学 生 班 级 姓 名 学 号 指导教师单位 指导教师姓名

电子与通信工程学院

通信工程 通信111班 韦仁良 201108402123

电子与通信工程学院

陈宇宁

【摘 要】

随着社会上特别是城市中机动车辆保有量的不断增加,在现代城市的日常运行控制中,车辆的交通控制越来越重要,在十字交叉路口,越来越多的使用红绿灯进行交通指挥和管理。本文以VHDL硬件描述语言为设计手段,完成了交通信号灯控制电路的设计,其中交通信号灯控制电路的开发目的是设计一个适用于主、支干道十字交叉路口的红黄绿交通灯的控制系统,通过合理设计系统功能,使红黄绿灯的转换有一个准确的时间间隔和转换顺序。所设计的交通信号灯控制电路经过在QuartusⅡ 软件下进行模拟仿真,观察其波形,证明所设计的交通信号灯控制电路完全可以实现预定的功能,并有一定的实用性。

【关键词】

VHDL; QuartusⅡ; 交通灯

【题目要求】

用有限状态机设计一个交通灯控制器,设计要求:A路和B路,每路都有

红、黄、绿三种灯,持续时间为:红灯45s、黄灯5s、绿灯40s。A、B路交通灯的转换状态是:

(1)A红、B绿 (持续时间40s); (2)A红、B黄 (持续时间5); (3)A绿、B红 (持续时间40s); (4)A黄、B红 (持续时间5s);

【系统总体设计原理】

外部时钟 4000Hz 分频器 50MHz 1秒分频器 交通灯控制器 显示模块 数码管 发光二极管 该系统主要由分频模块fen50m_1s、控制模块traffic_control、转换模块bin2bcd以及显示模块display电路构成。其中分频模块fen50m_1s主要将系统输入的基准时钟信号转换为1Hz的激励信号,驱动控制模块工作。控制模块traffic_control根据计数情况对交通灯的亮灭及持续时间进行控制。转换模块bin2bcd将控制模块设计的亮灯时间的二进制转换为bcd码。显示模块display主要将亮灯时间以倒计时的形式通过数码显示出来

【时钟分频模块】

系统时钟脉冲为50MHz,为满足各个模块脉冲需求,需要分频成2Hz和4000Hz的脉冲。

fen50m_1s模块设计,实现频率由50MHz到2Hz的转变,达到我们需要的1s的要求,模块如下图:

分频器一

端口说明:

clkin:输入50MHz时钟脉冲 clkout:输出2Hz脉冲

fen50m_1s实现Verilog语言描述如下:

module fen50m_1s(clkin,clkout); input clkin; output clkout; reg clkout; reg [24:0] q;

always @(posedge clkin) begin

if (q==24999999)

begin q<=0;

clkout<=~clkout; end

else q<=q+1; end endmodule

编译结果:

分频器二fen50m_4000模块设计,实现频率由50MHz到4000Hz的转变

分频器二

端口说明:

clkin:输入50MHz时钟脉冲 clkout:输出4000Hz脉冲

分频器fen50m_4000模块实现程序:

module fen50m_4000(clkin,clkout); input clkin;

output clkout; reg clkout; reg [24:0] q;

always @(posedge clkin) begin

if (q==12499) begin q<=0;

clkout<=~clkout; end

else q<=q+1; end endmodule

编译结果:

【交通灯控制及计时模块】

端口说明:

Clock:输入时钟信号,上升沿有效。 Reset:复位信号,高电平有效。

Red1、yellow1、green1:分别表示A路的红灯、黄灯、绿灯显示信号,高电平有效。

Red2、yellow2、green2:分别表示B路的红灯、黄灯、绿灯显示信号,高电平有效。

Timea:A路绿灯亮时间,高电平有效。 Timeb:B路红灯亮时间,高电平有效。 Alarm:倒计时信号输出

实现程序:

module

traffic_control(clock,reset,red1,yellow1,green1,red2,yellow2,green2,timea,timeb,alarm); input clock,reset;

output red1,yellow1,green1,red2,yellow2,green2,alarm; output [7:0] timea,timeb; reg [1:0] state=2'b00;

reg [7:0] timea=40; //A路绿灯亮时间 reg [7:0] timeb=45; //B路红灯亮时间

reg red1=1'b0,yellow1=1'b0,green1=1'b1; //A绿灯亮 reg red2=1'b1,yellow2=1'b0,green2=1'b0; //B红灯亮 reg alarm=1'b0;

always @(posedge clock or posedge reset) begin

if (reset) begin

state<=2'b00; timea<=40; timeb<=45; end else begin

case (state) 2'b00: begin

if (timea==0) //A绿灯亮时间40S结束 begin

timea<=5; //A黄灯亮时间5S

red1<=1'b0; yellow1<=1'b1; green1<=1'b0; //A黄灯亮 red2<=1'b1; yellow2<=1'b0; green2<=1'b0; //B红灯继续亮

state<=2'b01; //转到A黄灯,B红灯 end else begin

timea<=timea-1; //A绿灯亮时间40S-- timeb<=timeb-1; //B红灯亮时间45S-- state<=2'b00; end end 2'b01:

begin

if (timea==0) //A黄灯亮5S时间结束 begin

timea<=45; //A红灯亮时间45S timeb<=40; //B绿灯亮时间40S

red1<=1'b1; yellow1<=1'b0; green1<=1'b0; //A红灯亮 red2<=1'b0; yellow2<=1'b0; green2<=1'b1; //B绿灯亮 alarm<=1'b0;

state<=2'b10; //转到A红灯,B绿灯 end else begin

timea<=timea-1; //A黄灯亮时间3S-- timeb<=timeb-1; //B红灯亮时间3S-- alarm<=~alarm; yellow1<=~yellow1;

state<=2'b01; end end

2'b10:

begin

if (timeb==0) //B绿灯亮40S时间结束 begin

timeb<=5; //B灯黄亮时间5S

red1<=1'b1; yellow1<=1'b0; green1<=1'b0; //A红灯亮 red2<=1'b0; yellow2<=1'b1; green2<=1'b0; //B黄灯亮 state<=2'b11; //转到A红灯,B黄灯 end else begin

timea<=timea-1; //A红灯亮时间-- timeb<=timeb-1; //B绿灯亮时间-- state<=2'b10; end end

2'b11: begin

if (timeb==0) //B黄灯亮5S时间结束 begin

timea<=40; //A绿灯亮时间40S timeb<=45; //B绿灯亮时间45S

red1<=1'b0; yellow1<=1'b0; green1<=1'b1; //A绿灯亮 red2<=1'b1; yellow2<=1'b0; green2<=1'b0; //B红灯亮 alarm<=1'b0;

state<=2'b00; //转到A绿灯,B红灯 end else

begin

timea<=timea-1; //A红灯亮时间-- timeb<=timeb-1; //B黄灯亮时间-- alarm<=~alarm; yellow2<=~yellow2; state<=2'b11; end

end endcase end end

Endmodule

编译结果:

此模块是整个系统的核心部分,主要功能是完成四个状态的转换,并且在每个状态里完成相应的控制作用,即控制主干道和支干道的红黄绿灯的点亮和各自数码管倒计时显示。

【bin2bcd转换模块】

该模块将二进制语言转换为BCD码输出,模块如下图:

端口说明:

numin[7..0]:输入8位二进制编码 numa[3..0]:输出高4位BCD码 numb[3..0]:输出低4位BCD码

bin2bcd转换模块实现程序:

module bin2bcd(numin,numa,numb); input[7:0] numin;

output[3:0] numa,numb; reg[3:0] numa,numb; always @(numin) begin

if (numin>=90) begin numa=9; numb=numin-90; end

else if (numin>=80) begin numa=8; numb=numin-80; end else if (numin>=70) begin numa=7; numb=numin-70; end else if (numin>=60) begin numa=6; numb=numin-60; end else if (numin>=50) begin numa=5; numb=numin-50; end else if (numin>=40) begin numa=4; numb=numin-40; end else if (numin>=30) begin numa=3; numb=numin-30; end else if (numin>=20) begin numa=2; numb=numin-20; end else if (numin>=10) begin numa=1; numb=numin-10; end else begin numa=0; numb=numin; end end endmodule

编译结果:

本文来源:https://www.bwwdw.com/article/j9m3.html

Top