数电课程设计报告交通灯控制电路设计

  • 格式: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