数电课程设计报告交通灯控制电路设计
- 格式:docx
- 大小:481.32 KB
- 文档页数:24
2014—2015学年第一学期
《数字电子技术课程设计》任务书
(适用专业:勘查12级、地物12级)
专业班级 地物一班
姓 名 张瑞
学 号 ********
开课系室 电工电子学教学中心
设计日期 2014年12月22日~30日
目录
一、 设计题目
二、 设计任务及要求
1,具体要求
2,输入输出资源说明
三、 设计与仿真
1,基本要求的设计
1.1时钟分频模块
1.2闪烁模块
1.3计数器模块
1.4译码器模块
1.5交通灯控制模块
1.6点阵显示模块
2,扩展模块的设计
2.1自动切换手动模块的设计
2.2交警控制模块的设计
3,顶层模块的设计
四、 总结与讨论
一、 设计题目
数字电子技术课程设计题目:交通灯控制电路设计。
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂。
要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各四个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯闪烁,红灯亮(表示左转弯),再延时一段时间后,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
在实验中使用4个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为20s(其中,绿灯亮时间为10s,绿灯闪烁时间为5s,黄灯闪烁时间为5s)。数码管的时间总是显示为20、19、18、17……2、1、0、20、19、18……。在显示时间小于等于5秒的时候,通车方向的黄灯闪烁。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。
二、 设计任务及要求
1. 具体要求
本课程设计要完成的任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的50MHz时钟,黄灯和绿灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次。在东西向绿灯期间,点阵显示自己的姓名;在南北向绿灯期间,点阵显示自己的学号后3位。显示方式:1秒显示一个汉字或者一个数字(汉字和数字均静止不动,即不循环),然后全暗1秒,然后再显示一个汉字或者一个数字,以此类推。
实验箱中用到的数字时钟模块、按键开关、数码管、点阵与FPGA的接口电路,以及数字时钟源、按键开关、数码管、点阵与FPGA的管脚连接在以前的实验中都做了详细说明,这里不再赘述。交通灯模块原理与LED灯模块的电路原理一致,当有高电平输入时LED灯就会被点亮,反之不亮。只是LED发出的光有颜色之分。
2. 输入输出资源说明
1、外部输入脉冲信号时钟源CP(50MHz),经适当分频后供计数器使用。
2、输出2组显示译码信号(每组7个输出端),分别接到外部的两个七段数码管M1、M2上,M1和M2分别显示倒计时的十位和个位。
3、输出6个高低电平信号,分别接到外部的6个指示纵向、横向的LED灯。(输出高电平时,对应的LED灯亮)
其具体框图如下:
图1 交通灯控制电路结构框图
根据如上说明,本设计的主要任务和设计要求是:
1、按照现代数字系统的Top-Down模块化设计方法,提出交通灯控制电路设计系统的整体设计方案,并进行正确的功能划分,分别提出并实现控制器、计数器、输出译码、点阵显示等模块化子系统的设计方案。
2、在QuartusⅡ的EDA设计环境中,完成系统的顶层设计、各子系统的模块化设计。分别完成各个基于Verilog语言实现的子模块(包括控制器电路、计数器电路、输出译码电路、点阵显示电路)的逻辑功能仿真。最后对顶层设计进行功能仿真。
3、在2步的基础上,用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。观察实验结果是否与自己的编程思想一致。
三、 设计与仿真
1.基本要求的设计
1.1时钟分频模块
通过设计分频器产生1khz、2hz、1hz时钟频率,为后面模块提供时钟脉冲。
Verilog程序如下:
module clk_div(clk_50MHz,clk_1KHz,clk_2Hz,clk_1Hz);
input clk_50MHz;
output clk_1KHz,clk_2Hz,clk_1Hz;
reg [31:0] count1;
reg [31:0] count2;
reg [31:0] count3;
reg clk_1KHz,clk_2Hz,clk_1Hz;
always @(posedge clk_50MHz)begin
count1<=(count1==32'd49999)?1'd0:(count1+1'd1); 1Hz 纵向指示灯LED1
控
制
器 计数器(倒计时;通车时间倒计时) 七段LED数码管显示(2个) 50MHz 纵向指示灯LED3
横停指示灯LED6 纵向指示灯LED2
横向指示灯LED5 横向指示灯LED4 CLK
显示姓名或者学号 clk_1KHz<=(count1>=32'd25000)?1'd1:1'd0;
count2<=(count2==32'd24999999)?1'd0:(count2+1'd1);
clk_2Hz<=(count2>=32'd12500000)?1'd1:1'd0;
count3<=(count3==32'd49999999)?1'd0:(count3+1'd1);
clk_1Hz<=(count3>=32'd25000000)?1'd1:1'd0;
end
endmodule
生成的模块为:
仿真测试结果:
1.2闪烁模块
考虑到灯有闪烁功能,加了一个闪烁模块控制灯的闪烁功能。
Verilog程序如下:
module flash(clk_2Hz,start,flash);
input clk_2Hz;
input start;
output flash;
reg flash;
always @(clk_2Hz or start)begin
if(clk_2Hz==1&&start==1) flash=1;
else flash=0;
end
endmodule
生成的模块为: clk_50MHzclk_1KHzclk_2Hzclk_1Hzclk_divinst7
仿真测试结果:
1.3计数器模块
用计数器实现倒计时,引入了一个变量reg[4:0]cnt来是实现计数器模值得改变。
Verilog程序如下:
module cnt20or30(clk_1Hz,k0,q,ew_sn);
input clk_1Hz,k0;
output [4:0] q;
output ew_sn;
reg [4:0] q;
reg [4:0] cnt;
reg ew_sn;
initial begin
q=5'd20;
cnt=5'd20;
ew_sn=1;
end
always @(k0)begin
if(k0==1)begin
cnt=5'd30;
end
else begin
cnt=5'd20;
end
end
always @(posedge clk_1Hz)begin
if(q==5'd0)begin
q=cnt;
if(ew_sn==1) ew_sn=0; clk_2Hzstartflashflashinst3 else ew_sn=1;
end
else q=q-5'd1;
end
endmodule
生成的模块为:
仿真测试结果:
1.4译码器模块
实现将计数器的值显示到7段数码管上。
Verilog程序如下:
module yimaqi(clk_1KHz,q,Led1,Led2);
input clk_1KHz;
input [4:0] q;
output [6:0] Led1;
output [6:0] Led2;
reg [6:0] Led1;
reg [6:0] Led2;
reg [3:0] A,B;
always @(posedge clk_1KHz)begin
A=q/10;
B=q%10;
case (A)
4'b0000: Led1 <= 7'b1000_000;
4'b0001: Led1 <= 7'b1111_001;
4'b0010: Led1 <= 7'b0100_100;
4'b0011: Led1 <= 7'b0110_000; clk_1Hzk0q[4..0]ew_sncnt20or30inst4