• 方案介绍
  • 相关推荐
申请入驻 产业图谱

交通灯控制 FPGA 设计 Verilog Vivado

07/02 13:24
193
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:交通灯控制 FPGA 设计 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

本设计实现一个主路与支路交叉口交通灯控制系统,使用 Verilog 编写并在 Vivado 工程中组织。系统以 50MHz 时钟作为输入,通过分频得到 1Hz 计时节拍,用于驱动红、黄、绿灯状态切换以及剩余时间倒计时显示。

交通灯输出包含主路红灯、绿灯、黄灯以及支路红灯、绿灯、黄灯六路控制信号。主路绿灯时间设置为 60 秒,支路绿灯时间设置为 40 秒,主路和支路黄灯时间均设置为 3 秒,适合用于 FPGA 交通灯课程设计、数字逻辑实验和 Verilog 状态机控制练习。

显示部分通过数码管位选和段选信号输出倒计时数据,使主路与支路当前通行状态及剩余时间能够同步显示。顶层模块将灯控、倒计时数据生成、数码管动态扫描和时钟分频模块连接起来,结构清晰,便于修改不同路口的通行时间参数。

运行环境

开发语言:Verilog
开发软件:Vivado
顶层模块:traffic_light
工程文件:traffic_light.xpr
主要源码目录:traffic_light/scr
约束文件:traffic_light/scr/pins.xdc

设计思路

系统设计以顶层 traffic_light 模块为核心,将 50MHz 系统时钟送入分频模块生成 1Hz 计时信号,再由交通灯控制模块按照设定的绿灯、黄灯时间完成主支路红黄绿状态切换。主路和支路采用互斥通行逻辑:一侧处于绿灯或黄灯阶段时,另一侧保持红灯,并通过倒计时信号反映当前阶段剩余时间。

交通灯控制模块负责产生六路灯信号以及各阶段 BCD 倒计时数据。顶层中将主路绿灯时间设置为 8\'d60,支路绿灯时间设置为 8\'d40,黄灯时间固定为 8\'d3。这样的参数写法便于在源码中直接调整通行周期,适合实验中比较不同配时方案对状态切换和显示结果的影响。

数码管显示采用数据生成与动态扫描分离的方式:shumaguan_data 模块根据当前灯色状态选择主路或支路对应的倒计时数据,display 模块负责位选、段选输出。该划分方式降低了顶层逻辑复杂度,也便于单独调试显示编码、扫描刷新和交通灯状态控制。

模块结构

traffic_light:顶层模块,连接分频、交通灯控制、显示数据生成和数码管显示模块。
div:时钟分频模块,将输入时钟分频为交通灯计时使用的 1Hz 时钟。
led:交通灯控制模块,产生主路、支路红黄绿灯输出及各阶段倒计时 BCD 数据。
shumaguan_data:数码管显示数据生成模块,根据当前灯状态选择主路、支路倒计时显示内容。
display:数码管动态显示模块,输出位选 weixuan 和段选 duanxian。
edge_check:边沿检测相关模块,可用于按键信号或控制信号边沿处理。
time_ctrl:时间控制相关模块,用于交通灯计时控制逻辑扩展。

开发板验证

工程提供 Vivado 管脚约束文件 pins.xdc,并已生成实现阶段文件与 bit 文件,可用于按约束连接的 FPGA 开发板进行红黄绿灯输出和数码管倒计时显示验证。约束文件覆盖顶层端口的物理引脚分配,便于将 main_red、main_green、main_yellow、branch_red、branch_green、branch_yellow、weixuan、duanxian 等信号映射到开发板外设。

仿真图/仿真说明/设计文档图片

配有交通灯设计要求图片,可用于核对系统功能需求、主支路灯色切换关系和倒计时显示目标。工程还包含 Vivado 综合、实现、时序、功耗、资源利用率等报告文件,便于查看工程构建结果和 FPGA 实现情况。

部分代码

以下展示顶层模块 traffic_light 的部分代码,完整源码请下载压缩包查看。

module traffic_light(
input clk,//50Mhz
output main_red,//主路灯
output main_green,//主路灯
output main_yellow,//主路灯
output branch_red,//支路灯
output branch_green,//支路灯
output branch_yellow,//支路灯
output [3:0] weixuan,//数码管位选
output [7:0] duanxian//数码管段选
);

 wire clk_1Hz;
 wire [7:0] main_green_BCD;
 wire [7:0] main_yellow_BCD;
 wire [7:0] main_red_BCD;
 wire [7:0] branch_green_BCD;
 wire [7:0] branch_yellow_BCD;
 wire [7:0] branch_red_BCD;
 wire [7:0] main_data_out;
 wire [7:0] branch_data_out;
 
wire main_red_led;//主路灯
wire main_green_led;//主路灯
wire main_yellow_led;//主路灯

wire branch_red_led;//支路灯
wire branch_green_led;//支路灯
wire branch_yellow_led;//支路灯

assign main_red=main_red_led;//主路灯
assign main_green=main_green_led;//主路灯
assign main_yellow=main_yellow_led ;//主路灯

assign branch_red=branch_red_led;//支路灯
assign branch_green=branch_green_led;//支路灯
assign branch_yellow=branch_yellow_led ;//支路灯 

//分频模块
div div100
(
. clk(clk),
. clk_out(clk_1Hz)
);

//按键调整时间
wire [7:0]main_green_time;
wire [7:0]main_yellow_time;
wire [7:0]branch_green_time;
wire [7:0]branch_yellow_time;

assign main_yellow_time=8\'d3;//主路黄灯时间设置为3秒
assign branch_yellow_time=8\'d3;//支路黄灯时间设置为3秒
assign main_green_time=8\'d60;
assign branch_green_time=8\'d40;


///////////////////////////////
reg [7:0] display_main;
reg [7:0] display_branch;

////////////////////////////////
//交通灯控制模块
led led(
. clk_1Hz(clk_1Hz),
. lock_key(1\'b0),//紧急按键,为1紧急状态,为0正常状态

. main_red(main_red_led),//主路灯
. main_green(main_green_led),//主路灯
. main_yellow(main_yellow_led),//主路灯

. branch_red(branch_red_led),//支路灯
. branch_green(branch_green_led),//支路灯
. branch_yellow(branch_yellow_led),//支路灯

. main_green_time(main_green_time),
. main_yellow_time(main_yellow_time),
. branch_green_time(branch_green_time),
. branch_yellow_time(branch_yellow_time),

. main_green_BCD(main_green_BCD),//绿灯时间计数
. main_yellow_BCD(main_yellow_BCD),//黄灯时间计数
. main_red_BCD(main_red_BCD),//红灯时间计数
. branch_green_BCD(branch_green_BCD),//绿灯时间计数
. branch_yellow_BCD(branch_yellow_BCD),//黄灯时间计数
. branch_red_BCD(branch_red_BCD)//红灯时间计数
);

//显示数据生成模块
shumaguan_data shumaguan_data(
. clk(clk),

. main_red(main_red_led),//主路灯
. main_green(main_green_led),//主路灯
. main_yellow(main_yellow_led),//主路灯

. branch_red(branch_red_led),//支路灯
. branch_green(branch_green_led),//支路灯
. branch_yellow(branch_yellow_led),//支路灯

. main_green_BCD(main_green_BCD),//绿灯时间计数
. main_yellow_BCD(main_yellow_BCD),//黄灯时间计数
. main_red_BCD(main_red_BCD),//红灯时间计数
. branch_green_BCD(branch_green_BCD),//绿灯时间计数
. branch_yellow_BCD(branch_yellow_BCD),//黄灯时间计数
. branch_red_BCD(branch_red_BCD),//红灯时间计数

. main_green_time(main_green_time),
. main_yellow_time(main_yellow_time),
. branch_green_time(branch_green_time),
. branch_yellow_time(branch_yellow_time),

. main_data_out(main_data_out),//主路数码管数据显示
. branch_data_out(branch_data_out)//支路数码管数据显示
);
		
display display
(
. clk(clk),
. lock_key(lock_key),
// ... 以下代码略,完整源码请下载压缩包查看
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1651

相关推荐