项目报告:2025寒假练 - 基于小脚丫FPGA实现交通灯控制系统
1. 项目需求
完全使用WebIDE的图形化编程,使用常规的74系列的元器件,构建一个交通灯控制系统:
- 在数码管上显示计时信息 - 图形化
- 蜂鸣器报警 - 图形化
- 接近传感器检测人员走近 -Verilog
- 环境光感知,自动点亮路灯(小脚丫核心板上的单色LED)- Verilog
硬件平台采用STEP Baseboard 4.0版本的底板和STEP MXO2 LPC核心板。该底板资源丰富,能够满足多种外设的控制需求。本次项目将完全使用WebIDE的图形化功能来实现,模拟一个智能化的交通灯控制系统。
2. 系统设计与实现
2.1 系统架构
系统的整体架构包括以下几个模块:
- 时钟分频模块:将主时钟分频为3个不同频率的时钟信,驱动各个模块。
- 交通灯控制模块:负责主路和支路的红绿灯控制,并显示主路倒计时信息。
- 接近传感器模块:通过IIC通信获取传感器数据,检测人员靠近并触发蜂鸣器报警。
- 环境光感知模块:通过IIC通信获取传感器数据,根据环境光强度控制路灯的开关。
2.2 时钟分频模块
系统的时钟分频模块将主时钟信号分频为三个不同的频率,分别用于驱动交通灯控制模块、传感器模块和蜂鸣器模块。
- 1Hz时钟:用于交通灯控制模块的1秒计时。
- 400KHz时钟:用于与传感器的IIC通信。
- 120Hz时钟:用于驱动蜂鸣器。
通过分频模块,系统能够根据不同模块的需求提供合适的时钟信号,确保各个模块的协调工作。
2.3 交通灯控制模块
交通灯控制模块是系统的核心部分,主要负责模拟主路和支路的红绿灯状态,并在数码管上显示倒计时信息。该模块的实现基于两个相同的子模块,分别控制主路和支路的交通灯。
2.3.1 主路交通灯控制
主要逻辑代码:
// 输出逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rgb <= (INIT_STATE == S1) ? RGB_GREEN : // 初始状态为绿灯
(INIT_STATE == S2) ? RGB_YELLOW : // 初始状态为黄灯
RGB_RED; // 初始状态为红灯
timecont <= (INIT_STATE == S1) ? TIM_G :
(INIT_STATE == S2) ? TIM_Y :
TIM_R;
end else begin
case (next_state)
S1: begin
rgb <= RGB_GREEN; // 绿灯
if (timecont == 1)
timecont <= TIM_G;
else
timecont <= timecont - 1;
end
S2: begin
rgb <= RGB_YELLOW; // 黄灯
if (timecont == 1)
timecont <= TIM_Y;
else
timecont <= timecont - 1;
end
S3: begin
rgb <= RGB_RED; // 红灯
if (timecont == 1)
timecont <= TIM_R;
else
timecont <= timecont - 1;
end
default: rgb <= RGB_GREEN; // 默认状态
endcase
end
end
主路交通灯控制模块的输入为1Hz的时钟信号和复位信号。模块内部定义了四个常量,分别表示红灯、绿灯和黄灯的初始状态以及各个灯的时间设置(单位为秒)。输出信号包括:
- RGB信号:用于驱动三色LED,模拟红绿灯的状态变化。
- 倒计时信号:通过解码模块处理后,驱动数码管显示倒计时信息。
2.3.2 支路交通灯控制
支路交通灯控制模块与主路模块结构相同,但常量设置不同。支路的初始状态为红灯,且与主路的红绿灯时间错开。具体表现为:
- 当主路为红灯时,支路为绿灯和黄灯。
- 当主路为绿灯和黄灯时,支路为红灯。
通过这种设计,主路和支路的交通灯能够实现交替控制,模拟真实的交通灯系统。
2.4 接近传感器模块
接近传感器模块通过IIC通信与传感器进行数据交互,获取可见光强度和距离数据。模块内部设置了两个阈值,分别用于判断环境光强度和人员接近情况。
2.4.1 环境光感知
传感器每隔一定时间获取一次环境光强度数据,并与设定的阈值进行比较。当环境光强度低于阈值时,模块输出一个低电平信号,表示需要点亮路灯。由于该信号为1位,而需要驱动8个LED,因此使用了74HC164移位寄存器,将信号同步到8个LED上,模拟路灯的点亮。
2.4.2 人员接近检测
传感器同时检测人员接近的距离数据。当检测到人员靠近时,模块输出一个高电平信号,表示有人员接近。该信号与蜂鸣器驱动信号通过一个与门连接,当有人员接近时,蜂鸣器驱动信号导通,蜂鸣器发出报警声。
2.5 引脚分配
系统的引脚分配如下:
- 三色LED:分别用于主路和支路的红绿灯信号。
- 数码管:用于显示主路交通灯的倒计时信息。
- 8个LED:用于模拟路灯的点亮。
- IIC通信线:用于与接近传感器进行数据交互。
- 蜂鸣器驱动IO线:用于控制蜂鸣器的报警声。
3. 系统调试与优化
在系统实现过程中,调试和优化是确保系统稳定运行的关键步骤。以下是调试过程中遇到的主要问题及解决方案:
3.1 交通灯倒计时显示问题
在初期调试中,数码管显示的倒计时最开始不显示,后面调试发现是FPGA对于除法器的操作有问题,后面修改解码算法去除了除法运算。
// 提取十位:number / 10
tens = (number * 205) >> 11; // 近似计算 number / 10
// 提取个位:number % 10
units = number - (tens * 10);
3.2 传感器数据读取异常
在接近传感器模块的调试过程中,传感器数据读取时出现了异常,导致环境光感知和人员接近检测功能无法正常工作。经过排查,发现是IIC通信的信号没有设置输出,修改后能正常与传感器进行通信。
4. FPGA报告
Design Summary:
Number of registers: 211 out of 4635 (5%)
PFU registers: 211 out of 4320 (5%)
PIO registers: 0 out of 315 (0%)
Number of SLICEs: 221 out of 2160 (10%)
SLICEs as Logic/ROM: 221 out of 2160 (10%)
SLICEs as RAM: 0 out of 1620 (0%)
SLICEs as Carry: 45 out of 2160 (2%)
Number of LUT4s: 440 out of 4320 (10%)
Number used as logic LUTs: 350
Number used as distributed RAM: 0
Number used as ripple logic: 90
Number used as shift registers: 0
Number of PIO sites used: 37 + 4(JTAG) out of 105 (39%)
Number of block RAMs: 0 out of 10 (0%)
Number of GSRs: 1 out of 1 (100%)
EFB used : No
JTAG used : No
Readback used : No
Oscillator used : No
Startup used : No
POR : On
Bandgap : On
Number of Power Controller: 0 out of 1 (0%)
Number of Dynamic Bank Controller (BCINRD): 0 out of 6 (0%)
Number of Dynamic Bank Controller (BCLVDSO): 0 out of 1 (0%)
Number of DCCA: 0 out of 8 (0%)
Number of DCMA: 0 out of 2 (0%)
Number of PLLs: 0 out of 2 (0%)
Number of DQSDLLs: 0 out of 2 (0%)
Number of CLKDIVC: 0 out of 4 (0%)
Number of ECLKSYNCA: 0 out of 4 (0%)
Number of ECLKBRIDGECS: 0 out of 2 (0%)
5. WebIDE的图形化编程改进建议
5.1 自定义模块
- 自定义模块的输入输出与常量的定义需要能灵活修改,现在每次都是新建一个模块将代码迁移过去
- 自定义模块不能调整大小,导致走线扎堆
- 打开模块编辑后切出去会导致图形化数据丢失,只保留模块编辑内容,导致工程报废,正常保存后要恢复到图形化设计界面 -- 先快捷键(Ctrl+S)保存,再点击保存按钮会触发
5.2 图形化界面
- 拉线逻辑需要优化,默认避开元件及走线重合部分,走线拉线希望能像PCB原理图拉线一样可以方便的添加拐角和将一段线平移
- 走线交叉的地方使用类似PCB原理图的节点或跳线来区分网络是否相同
- 拉线不同网络可以使用不同颜色以区分
- 图形化工程没办法做备份或复制副本,数据出现问题只能重来
- 增加注释类框和文本的选项,方便模块划分与记录
- 增加栅格
5.3 编译仿真
- 逻辑综合的报错不好直接定位到错误地点
- 管脚分配在分配一个管脚后覆盖,会丢失管脚
- 图形化的仿真使用教程,尝试仿真时代码执行没有波形,也没有报错,不知道是什么地方有问题
6. 项目总结与展望
本次项目基于小脚丫FPGA平台,成功实现了一个智能化的交通灯控制系统。通过WebIDE的图形化设计,完成了交通灯控制、数码管显示、蜂鸣器报警、接近传感器检测和环境光感知等多个功能模块的设计与实现。系统能够模拟真实的交通灯控制场景,并具备一定的智能化功能,如根据环境光强度自动点亮路灯、检测人员靠近并触发报警等。
未来,可以进一步扩展系统的功能,例如:
- 增加更多的传感器:如温度传感器、湿度传感器等,实现更复杂的环境感知功能。
- 优化交通灯控制算法:根据实时交通流量动态调整红绿灯时间,提高交通效率。
- 增加无线通信模块:实现远程监控和控制,提升系统的智能化水平。
总的来说,本次项目不仅加深了对FPGA逻辑设计的理解,还提升了解决实际问题的能力,为今后的学习和开发积累了宝贵的经验。