玉林师范学院本科生课程设计论文
基于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
编译结果:
【数码管显示译码和扫描模块】
驱动交通信号LED灯以及倒计时器数码管的显示,模块如下图:
端口说明:
Scanclk:4000Hz时钟脉冲 Ewh,smh:输入高4位BCD码 Ewl,sml:输入高4位BCD码
Ledout:数码管段选 Ledsel:数码管位选
Verilog语言描述如下:
module display(scanclk,ewh,ewl,snh,snl,ledout,ledsel); input scanclk;
input [3:0] ewh,ewl,snh,snl; output [6:0] ledout; output [3:0] ledsel; reg [6:0] ledout;
reg [3:0] ledsel; reg [3:0] bcd; reg [2:0] q;
always @(posedge scanclk) begin
q<=q+1; case(q)
3'b000:begin ledsel<=4'b0111;bcd<=ewh;end 3'b001:begin ledsel<=4'b1011;bcd<=ewl;end 3'b010:begin ledsel<=4'b1101;bcd<=snh;end 3'b011:begin ledsel<=4'b1110;bcd<=snl;end
default:begin ledsel<=8'b11111111;bcd<=4'bzzzz;end endcase end
always @(bcd) begin
case(bcd)
4'b0000:ledout=7'b0111111; 4'b0001:ledout=7'b0000110; 4'b0010:ledout=7'b1011011; 4'b0011:ledout=7'b1001111; 4'b0100:ledout=7'b1100110; 4'b0101:ledout=7'b1101101; 4'b0110:ledout=7'b1111101; 4'b0111:ledout=7'b0000111; 4'b1000:ledout=7'b1111111; 4'b1001:ledout=7'b1101111; default:ledout=7'b0000000; endcase end
endmodule
编译结果:
【各模块电路符号】
顶层电路图如下:
顶层文件原理图
顶层文件编译结果如下:
【硬件验证结果】
1、引脚配置如下:
2、硬件验证效果如下:
按照设计好的原理图,运行QuartusⅡ软件,运用模块化设计方法,创建图形设计文件,画出所设计的交通灯控制器总框图并连接,对其进行测试,编译,得到结果如图所示:
【总结】
本设计借助FPGA器件及其支撑软件,快速明确的验证了交通灯控制功能。通过此次EDA课程设计,我系统的学习了课本上的相关知识,对程序设计有了一定思路;通过实验课的学习,在程序的调试方面也学到了很多东西。其中在编程中也出现了很多的问题,但通过老师同学的帮助下,把问题一一解决了。其实只要我们自己认真看书,仔细分析,仔细调试,就一定会发现错误,真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中。在这个设计过程中我深刻地体会到
刻苦努力与认真对待的重要性,进一步巩固了自己所学的专业基础知识,提高了自己解决问题的能力。本设计使得我有了一次非常好的将理论与实践结合的机会,并使我从中学到了新知识。通过学习EDA这门课程,懂得了QuartusⅡ这个软件的基本操作、用Verilog语言编写一些简单的程序,我知道我还需要不断的学习,才能更好地掌握这一门课程。
最后我想特别的感谢陈宇宁老师,感谢您的悉心指导,您渊博的学识,谦虚、严谨的治学态度、灵活的思维方式、认真的工作作风和对学生的关心都令我佩服不已,谆谆教诲使我受益匪浅!我会继续努力的!参考文献
参考文献
[1] 王金明.数字系统设计与Verilog HDL[M].北京:电子工业出版社.2011.1.
[2] 曹昕燕,周凤臣,聂春燕.EDA技术实验与课程设计[M].北京:清华出版社.2006.5.