交通灯EDA课程设计.docx
《交通灯EDA课程设计.docx》由会员分享,可在线阅读,更多相关《交通灯EDA课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
交通灯EDA课程设计
目录
第一章设计原理1
第二章设计流程2
第三章程序设计说明3
3.1程序设计流程图3
3.2分频模块3
3.3特殊功能及清零模块4
3.4交通灯运行模块4
3.5扫描显示模块6
第四章仿真及调试8
4.1调试步骤8
第五章总程序设计9
参考文献15
注释:
请用Quartus7.0仿真
摘 要:
VerilogHDL作为一种规范的硬件描述语言,被广泛应用于电路的设计中。
他的设计描述可被不同的工具所支持,可用不同器件来实现。
本设计选用了目前应用较为广泛的VerilogHDL硬件描述语言,实现对路口交通灯系统的控制器的硬件电路描述。
此程序通过下载到FPGA芯片后,可应用于实际的交通灯控制系统中。
关键字:
VerilogHDL交通灯FPGA芯片
第一章设计原理
Veriloghdl提供了简单实用的状态机语句,在设计时把它和实验箱结合起来控制扫描显示交通灯的运行情况。
其原理框图如图1:
图1
通过外部时钟控制整个交通灯的运行,先将外部时钟经过分频电路变为周期1HZ的时钟,以这个时钟来控制各个路口灯的亮灭及时间显示。
即和计数器结合起来,每一秒钟计数器计一次数并传送给扫描模块显示输出。
当计数器达到设定的最大值便清零,相应的灯的状态便改变,如此反复。
至于复位和特殊功能的实现皆是通过单独的时钟翻转来控制,本设计中采用置数的方法来实现。
当需要的时候直接将对应的时钟置为高电平即可,再置为低电平时从一开始的状态显示。
第二章设计流程
当控制开关打开后,主干路和支干路的灯暂时不显示,等待初始化信号。
待信号来临后,两路灯均开始显示。
其中,主干路红灯和支干路绿灯先亮,待主干路红灯显示35秒后,绿灯开始显示,20s后黄灯显示,黄灯显示5s后红灯再一次点亮,如此循环。
支干路绿灯亮了30s后黄灯点亮,5s后红灯点亮,红灯显示25s后绿灯再一次点亮,如此循环。
其流程图如下图2所示:
图2
第三章程序设计说明
3.1程序设计流程图
流程图如图3:
图3
3.2分频模块
通过提供一个60hz的外部时钟wclk,经过分频得到一个1hz的时钟clk。
其程序如下:
always@(posedgewclk)
begin
if(enn)
begin
clk=0;
end
elsebegin
if(dout==29)
begin
clk=~clk;
dout<=0;
end
elsedout<=dout+1;
end
end
通过计数器计数,当计数器从零计到29时clk翻转,即clk每0.5秒翻转一次,产生一个周期为1秒的时钟。
3.3特殊功能及清零模块
通过外部赋予高电平将交通灯清零或者实现特殊功能,其程序如下:
always@(posedgeclk)
begin
if(rest)
begin
statea<=a;
atra<=0;
JT1<=3'b000;
end
elseif(tclk)
begin
statea<=a;
JT1<=3'b001;
end
end
当清零信号rest来临时交通灯全部灭掉,当特殊功能信号为高电平时交通灯黄灯亮,其余全灭。
3.4交通灯运行模块
利用分频得到的1hz时钟clk来控制交通灯的运行,当复位和特殊功能信号均为低电平时,通过en给系统复初值,而后en变为低电平。
此时,当检测到clk上升时钟沿时,交通灯通过状态机的选择实现各个路口红、黄、绿灯的点亮以及计时。
always@(posedgeclk)
begin
if(rest)
begin
stateb<=d;
btra<=0;
JT2<=3'b000;
end
elseif(tclk)
begin
stateb<=d;
JT2<=3'b001;
end
elseif(en)
begin
btra<=8'b00101001;
stateb<=d;
end
elsecase(stateb)
d:
if(btra==0)
begin
btra<=8'b00000100;
stateb<=e;
JT2<=3'b010;
end
elsebegin
JT2<=3'b100;
if(btra[3:
0]==0)
begin
btra[3:
0]<=4'b1001;
btra[7:
4]<=btra[7:
4]-1;
end
elsebegin
btra[3:
0]<=btra[3:
0]-1;
end
end
e:
if(btra==0)
begin
btra<=8'b00100100;
stateb<=f;
JT2<=3'b001;
end
elsebegin
JT2<=3'b010;
if(btra[3:
0]==0)
begin
btra[3:
0]<=4'b1001;
btra[7:
4]<=btra[7:
4]-1;
end
elsebegin
btra[3:
0]<=btra[3:
0]-1;
end
end
f:
if(btra==0)
begin
btra<=8'b00101001;
stateb<=d;
JT2<=3'b100;
end
elsebegin
JT2<=3'b001;
if(btra[3:
0]==0)
begin
btra[3:
0]<=4'b1001;
btra[7:
4]<=btra[7:
4]-1;
end
elsebegin
btra[3:
0]<=btra[3:
0]-1;
end
end
endcase
end
3.5扫描显示模块
用实验箱实现数字的扫描输出显示,SEL0和SEL1为实验箱提供的数码管显示驱动,通过原理图法从外部引一个扫描时钟(本实验用15.6khz),与74161连接控制SEL0和SEL1的分频。
其中,SEL0为2分频而SEL1为4分频,从而在一个扫描周期内SEL0和SEL1的值从00变化到10,再从10变化到00,即数码管逐个循环往复显示输出。
always@(SEL0orSEL1)
begin
case({SEL0,SEL1})
2'b00:
beginA<=atra[3:
0];end
2'b01:
beginA<=atra[7:
4];end
2'b10:
beginA<=btra[3:
0];end
2'b11:
beginA<=btra[7:
4];end
endcase
case(A)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
endcase
end
第四章仿真及调试
4.1调试步骤
1.建立工作库文件夹和编辑设计文件
菜单操作:
file—new,在new窗口中,DeviceDesignFiles—VerilogHDLFile产生.v文件。
在VerilogHDL文本编辑器中输入源程序。
文件存盘:
文件名应该与模块名一致。
2.创建工程
菜单操作:
file—newprojectwizard,根据实验箱提供的器件型号选择目标器件:
EPF10K10LC84-4,创建工程产生.gpf文件。
3.全程编译
菜单操作:
Processing—startcompilation或
4.画原理图
(1)用原理图新建顶层文件,并建立工程,file—new—BlockDiagram/SchematicFile。
(2)将jtd.vhd转换成元件符号(元件文件的后缀为.bsf)
(3).新建jtd.vhd文件
(4).File—Create/-Update—CreateSymbolFilesforCurrentFile,fx元件可以在高层次设计中调用
(5)在顶层原理图文件中调用jtd元件,并完成设计。
5.编译
6.时序仿真
7.引脚锁定
菜单操作:
Assignments—pins,并连接线。
8.保存并编译
9.配置文件下载
菜单操作:
Tools—Programmer或
按
弹出hardwaresetop窗口;按
弹出addhardware窗口,按
选择下载接口,按
,选中文件*.sof,并使
有效
,按
使文件*.sof下载到目标器件中。
第五章总程序设计
modulejtd(atra,JT1,btra,JT2,en,enn,A,LED7S,clk,wclk,dout,tclk,rest,SEL0,SEL1);
output[7:
0]atra,btra,dout;
outputclk;
output[2:
0]JT1,JT2;
output[6:
0]LED7S;
output[3:
0]A;
inputtclk,rest,wclk,en,enn;
inputSEL0,SEL1;
regclk;
reg[7:
0]atra,btra,dout;
reg[6:
0]LED7S;
reg[2:
0]JT1,JT2;
reg[3:
0]A;
reg[3:
0]statea,stateb;
parametera=4'b0001,b=4'b0010,c=4'b0100,d=4'b1001,e=4'b1010,f=4'b1100;
always@(posedgewclk)
begin
if(enn)
begin
clk=0;
end
elsebegin
if(dout==29)
begin
clk=~clk;
dout<=0;
end
elsedout<=dout+1;
end
end
always@(posedgeclk)
begin
if(rest)
begin
statea<=a;
atra<=0;
JT1<=3'b000;
end
elseif(tclk)
begin
statea<=a;
JT1<=3'b001;
end
elseif(en)
begin
atra<=8'b00110100;
statea<=a;
end
else
case(statea)
a:
if(atra==0)
begin
atra<=8'b00011001;
statea<=b;
JT1<=3'b100;
end
elsebegin
JT1<=3'b001;
if(atra[3:
0]==0)
begin
atra[3:
0]<=4'b1001;
atra[7:
4]<=atra[7:
4]-1;
end
else
begin
atra[3:
0]<=atra[3:
0]-1;
end
end
b:
if(atra==0)
begin
atra<=8'b00000100;
statea<=c;
JT1<=3'b010;
end
elsebegin
JT1<=3'b100;
if(atra[3:
0]==0)
begin
atra[3:
0]<=4'b1001;
atra[7:
4]<=atra[7:
4]-1;
end
else
begin
atra[3:
0]<=atra[3:
0]-1;
end
end
c:
if(atra==0)
begin
atra<=8'b00110100;
statea<=a;
JT1<=3'b001;
end
elsebegin
JT1<=3'b010;
if(atra[3:
0]==0)
begin
atra[3:
0]<=4'b1001;
atra[7:
4]<=atra[7:
4]-1;
end
else
begin
atra[3:
0]<=atra[3:
0]-1;
end
end
endcase
end
always@(posedgeclk)
begin
if(rest)
begin
stateb<=d;
btra<=0;
JT2<=3'b000;
end
elseif(tclk)
begin
stateb<=d;
JT2<=3'b001;
end
elseif(en)
begin
btra<=8'b00101001;
stateb<=d;
end
elsecase(stateb)
d:
if(btra==0)
begin
btra<=8'b00000100;
stateb<=e;
JT2<=3'b010;
end
elsebegin
JT2<=3'b100;
if(btra[3:
0]==0)
begin
btra[3:
0]<=4'b1001;
btra[7:
4]<=btra[7:
4]-1;
end
elsebegin
btra[3:
0]<=btra[3:
0]-1;
end
end
e:
if(btra==0)
begin
btra<=8'b00100100;
stateb<=f;
JT2<=3'b001;
end
elsebegin
JT2<=3'b010;
if(btra[3:
0]==0)
begin
btra[3:
0]<=4'b1001;
btra[7:
4]<=btra[7:
4]-1;
end
elsebegin
btra[3:
0]<=btra[3:
0]-1;
end
end
f:
if(btra==0)
begin
btra<=8'b00101001;
stateb<=d;
JT2<=3'b100;
end
elsebegin
JT2<=3'b001;
if(btra[3:
0]==0)
begin
btra[3:
0]<=4'b1001;
btra[7:
4]<=btra[7:
4]-1;
end
elsebegin
btra[3:
0]<=btra[3:
0]-1;
end
end
endcase
end
always@(SEL0orSEL1)
begin
case({SEL0,SEL1})
2'b00:
beginA<=atra[3:
0];end
2'b01:
beginA<=atra[7:
4];end
2'b10:
beginA<=btra[3:
0];end
2'b11:
beginA<=btra[7:
4];end
endcase
case(A)
4'b0000:
LED7S<=7'b0111111;
4'b0001:
LED7S<=7'b0000110;
4'b0010:
LED7S<=7'b1011011;
4'b0011:
LED7S<=7'b1001111;
4'b0100:
LED7S<=7'b1100110;
4'b0101:
LED7S<=7'b1101101;
4'b0110:
LED7S<=7'b1111101;
4'b0111:
LED7S<=7'b0000111;
4'b1000:
LED7S<=7'b1111111;
4'b1001:
LED7S<=7'b1101111;
endcase
end
endmodule
参考文献
[1]Verilog数字系统设计教程北京航空航天大学出版社夏宇同编著
[2]大规模可编程逻辑器件及其应用成都电子科技大学出版社徐志军编著
[3]可编程逻辑器件原理、开发与应用西安电子科技大学出版社赵曙光编著
[4]基于EDA技术的数字频率计芯片化的实现电子科技大学出版社武卫华、陈德宏编著