2025寒假练—用小脚丫FPGA STEP BaseBoard V4.0套件
(图形化编程)实现交通灯控制系统
1.项目介绍
按照2025寒假练平台一STEP BaseBoard V4.0套件任务一要求,实现交通灯控制以及倒计时数字显示。具体要求如下:
完全使用WebIDE的图形化编程,使用常规的74系列的元器件,构建一个交通灯控制系统:其中数码管计时信息以及蜂鸣器报警两功能使用图形化编程实现,接近传感器检测人员走近与环境光感知,自动点亮路灯这两个功能由verilog语言实现。
WebIDE项目链接:https://www.stepfpga.com/project/17385/gui?type=top
2.硬件介绍
本项目中主要用的到的器件如下。
2.1.Lattice LCMXO2-C
Lattice LCMXO2是一款高性能、低功耗的FPGA(现场可编程门阵列)芯片,广泛应用于工业控制、通信、消费电子等领域。具备丰富的逻辑资源、高速IO接口和灵活的配置选项。STEP-MXO2-C是基于上述核心并增加基础的数码管、四位开关、四位按钮、八位单色led、两个rgb三色led等外设。同时以U盘配置,便于程序烧录。
2.2. STEP-Baseboard V4.0
以STEP-MXO2-C为核心进行大幅扩展的综合性底板。
2.3. RPR-0521RS
RPR-0521RS是一款高性能、小尺寸的反射式光传感器,适用于各类环境光线检测场景。
2.4. 硬件连接
3.设计思路
本项目按要求进行拆解后方案框图如下:
具体方案是:
在核心控制模块中,使用74HC161(4位二进制计数器)实现交通灯状态机控制(红、黄、绿灯切换),通过预置计数逻辑完成固定时序循环。74HC190(同步加/减计数器)负责倒计时功能,输出计时数据至数码管,支持动态调整计时周期。74HC153(双4选1数据选择器)用于设置不同交通灯状态的计时阈值(如红灯30秒、绿灯25秒等)。
显示与报警模块通过74HC48(BCD-7段译码器)驱动数码管,实时显示当前状态剩余时间,并在红灯时触发蜂鸣器告警,图形化编程实现动态刷新。当接近传感器(Verilog模块)检测到行人靠近时,亮起单色LED代表路灯。
传感器与灯光控制模块通过Verilog编写的环境光传感器(RPR0521)驱动,采集环境光强度,光线不足时自动点亮核心板上的单色LED(PWM调光)。传感器数据通过I2C协议传输,由`rpr0521_ctrl`模块解析,`led_ctrl`模块控制LED亮度。例程中的代码不能直接移植入图形化编程中的自定义模块,需要对部分变量进行reg形式的转换以及赋值,例如IIC_dirver模块修改如下:
在系统集成与优化模块中,通过74系列芯片的同步信号确保计数器、状态机与显示模块的时序一致性。环境光控制模块在白天关闭路灯LED,夜间自动开启。
最后,在验证与扩展模块中,分模块验证计数器精度、传感器响应、显示同步性,再整体联调交通灯逻辑。或通过修改74HC153的输入扩展复杂计时规则。
4.软件流程
4.1. 显示以及状态转换
首先,系统通过74HC190同步可逆计数器实现核心计时功能。该计数器根据任意频率分频器产生1s脉冲外部时钟信号进行递减计数,U_D端口置1表示递减。可以通过74HC153 设置计时初值,从而设定计时起点。计时器的当前计数值以BCD码形式输出,并输入至74HC48 BCD-七段译码器。译码器将BCD码转换为七段数码管驱动信号,实时驱动数码管显示当前计数值信息。
接下来,74HC161四位二进制计数器负责管理计时器的状态切换,如绿红黄模式切换。clk按键或逻辑电路向 74HC161 输入脉冲信号,其输出端连接至 74HC153双四选一数据选择器选取预制时间。
通过若干逻辑式对当前状态以及全零输出信号的处理进行状态跳转。
4.2.环境传感器以及模拟路灯
这个系统由三个核心模块组成,分别是I2C驱动模块、传感器控制模块和数据处理模块,它们协同工作,实现了从传感器数据采集到最终光强计算和LED控制的完整流程。
I2C驱动模块负责实现标准的I2C通信协议。它采用有限状态机的方式,以400KHz的快速模式,与7位地址的设备进行通信(SLAVE_ADDRESS)。
传感器控制模块负责初始化传感器并控制数据的读取。在初始化阶段,模块会依次写入4个配置寄存器:0x40用于使能ALS(环境光传感器)和接近传感器,0x41设置ALS测量时间,0x42设置接近传感器LED电流,0x43设置接近传感器测量时间。初始化完成后,模块进入循环读取数据的阶段,依次读取6个数据寄存器:0x44-0x45存储接近传感器数据,0x46-0x47存储ALS CH0数据(可见光),0x48-0x49存储ALS CH1数据(红外)。每次读取完成后,模块会触发dat_valid信号,表示数据已准备好供后续处理。
数据处理模块负责对传感器数据进行处理和计算。首先,模块对接近传感器数据进行差分滤波,以消除噪声。然后,根据CH1(红外数据)与CH0(可见光数据)的比值,动态选择4种光强计算公式之一进行计算。最后,根据阈值条件确定led灯光的状态。
5.功能展示
灯光控制以及数字显示如下,从四幅图中可以看出三色led切换以及倒计时显示,由图(d)可以看出在较暗环境下路灯自然点亮,由图(a)可以看出当有人靠近时路灯也会自然点亮。
(a) (b)
(c) (d)
本项目完全基于WebIDE完成,资源占用如图:
6.困难与解决
首先,由于对Verilog硬件描述语言的掌握不够深入,加之数字电路基础课程的知识有所遗忘,这成为了项目初期的主要障碍。为了解决这个问题,我采取了系统性的学习策略:在Bilibili平台上搜索并学习了相关的专业课程,通过观看教学视频和完成配套练习,逐步巩固了数字电路的基本概念,如组合逻辑电路、时序逻辑电路、状态机设计等,同时也加深了对Verilog语言语法、模块化设计、测试平台搭建等关键技术的理解。
其次,在图形化编程方面,由于是首次接触相关开发工具,我面临着操作不熟练、工作流不清晰等问题。针对这一挑战,我采取了循序渐进的学习方法:从最简单的点灯实验入手,通过反复实践来熟悉开发环境、掌握工具使用技巧。
在实现数码管显示功能时,我遇到了一个特殊的技术难题:开发环境内置的74系列芯片库中没有专门的数码管驱动芯片。如果完全通过基本逻辑门来实现这一功能,不仅设计复杂,还会给IDE带来过大的负荷,经常无法显示或显示错误。我决定采用自定义模块的方式来解决这个问题。严格按照74HC48的功能表进行开发,包括BCD码到七段码的转换、消隐控制、灯测试等功能。在设计过程中,我特别注意了模块的接口规范,使其与WebIDE中内置芯片的接口标准保持一致,确保了模块的兼容性和易用性。
7.心得与建议
在参与FPGA开发项目的过程中,我深刻体会到项目成功的多个关键因素。首先,项目启动前的准备工作至关重要,包括对项目需求的深入分析、详细设计方案的制定以及技术路线的选择,这些为项目的顺利进行奠定了坚实基础。在设计阶段,我认识到模块化设计的重要性,通过将复杂系统分解为独立模块,不仅使项目结构更加清晰,还便于团队分工合作,并为后期维护提供了便利。
对与webIDE我有些不成熟的建议,一是完善使用介绍,原本的介绍仅仅是将基本功能引入,还有很多部分需要自己探索。二是引脚配置界面偶尔有卡顿,会丢失引脚。