【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程2-基于紫光FPGA 的键控流水灯实验例程

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)

在FPGA技术于5G、AI及低空经济等新兴领域持续"破圈"、国产替代加速的宏大背景下,小眼睛科技联合紫光同创及电子发烧友共同发起了"拥抱开源------一起来做FPGA开发板"的项目。历时半年,集结了100多位来自各行各业的工程师智慧,我们成功打造了这款凝聚集体心血的紫光HiYou开源开发板(OPHW-25H)。

这款基于国产紫光同创Logos-2系列芯片的开发板,不仅是千元内入门级产品中唯一配备PCIe接口的轻量级利器,更实现了从硬件设计到底层代码的全方位开源,旨在为广大开发者提供一个高性价比、高扩展性的国产FPGA学习与验证平台,共同点燃技术创新的火花。

(详情见技术论坛:https://www.szlogicmatrix.com/)

****1.****实验简介

实验目的:

OPHW-25开发板有4个用户LED灯,FPGA输出低电平时对应的LED灯亮灯(详情请查看"OPHW-25开发板硬件使用手册")。由USER_BUTTON1按键输入,切换USER_LED0~USER_LED3的输出效果。

实验环境:

Window11

PDS2022.2

硬件环境:

OPHW-25开发板

****2.****实验原理

实现框架如下:

(1)顶层实现按键切换LED的流水灯状态;

(2)需要设计一个输入控制模块及一个输出控制模块;

这个实验带大家将多个模块整合成为一个工程,涉及到的知识点有子模块设计、模块例化;子模块的设计主要是依据功能定位,确定输入输出,再做具体的设计;

模块例化方式如下:

****2.1.****按键控制模块功能

接收按键输入信号。统计按键按下次数,由于流水灯模式是3种,计数统计范围是0~2循环,将计数结果传递给LED控制模块;

根据需求输入信号有:时钟,按键;输出信号有:流水灯控制信号;

内部功能处理:

<1>内部需要对按键信号做消抖处理;

<2>按键触发计数器(计数值输出)改变继而调整流水灯的状态;

****2.2.****按键消抖模块

前后抖动时间约为5~10ms,取按键抖动区间开始标识,持续10-20ms后标识归零,在抖动区间内输出保持,非消抖区间,按键状态输出。

2.3.LED********控制模块功能

3种流水灯模式有按键传递过来的计数控制切换,每一个LED的显示状态完整后进入下一模式初始化。根据需求可得到如下信息:

输入信号:时钟,流水灯模式控制信号;出信号:8bit位宽的LED控制信号;功能处理注意事项:流水灯状态切换点,不同状态的切换时如何初始化;

****3.****实验源码设计

****3.1.****顶层文件源码

****3.2.****按键控制模块

整个模块主要功能是对外部输入的按键信号进行消抖,并通过计数器实现按键多次按下时的模式切换控制。

在10-21行,这里实例化了一个btn_deb_fix模块,对输入key进行消抖处理。由于机械按键在按下和释放时会产生抖动,所以必须经过消抖电路,输出稳定的btn_deb信号。参数设置了单通道按键(BTN_WIDTH=1)和延迟阈值(BTN_DELAY=20'h7_ffff),确保按键信号稳定后才有效。

在23-27行,通过一个时序寄存器btn_deb_1d保存消抖信号的一个时钟周期延迟。这样可以配合当前周期的btn_deb,用来检测按键的边沿变化。

重点逻辑在29-39行:定义了一个2位寄存器key_push_cnt,用来计数按键的按下次数。在 always块中,通过条件if(~btn_deb&btn_deb_1d)检测到按键从按下到释放的上升沿(即一次有效的按键动作)。每次检测到有效按键动作时,计数器key_push_cnt+1。计数器达到2'd2时,再次按键会将其清零,形成一个0→1→2→0的循环计数。

最后在41行,将key_push_cnt的值输出到ctrl。这样ctrl就会随着按键次数循环变化,通常可用来切换工作模式,按一次进入模式1,按两次进入模式2,再按一次回到模式********0

总体说btn_deb_fix模块解决了机械按键抖动问题;边沿检测逻辑确保每次按键只触发一次计数;2位计数器实现了多模式循环切换功能;输出ctrl作为最终控制信号,直接驱动其他模块。

****3.3.****按键消抖模块

代码的25行到57行是按键消抖的核心实现,主要用于对多路机械按键信号进行消抖,输出稳定的按键状态。这里只讲解主要实现的功能。首先代码的20-23行,通过一个时钟上升沿触发的always块,将输入按键状态寄存到btn_in_reg,这是为了后续检测按键边沿变化,保证时序逻辑能够正确捕捉按键的跳变。接着在生成块中,对于每一路按键,都存在三个always块,分别用于抖动检测、计数器累加和消抖输出。

代码的31-37行是抖动检测逻辑。当上一周期的按键状态btn_in_reg[i]与当前按键状态 btn_in[i]不一致时,说明检测到按键边沿变化,于是将抖动标志flag[i]拉高,表示当前按键进入抖动阶段;如果计数器cnt[i]已经达到设定的消抖时间BTN_DELAY,则将flag[i]清零;否则保持原状态不变。这个逻辑保证了按键在刚触发或释放的瞬间进入抖动阶段,抖动阶段持续时间由计数器控制。

代码的41-47行是计数器逻辑。在抖动阶段,计数器cnt[i]每个时钟周期累加,用于记录抖动持续时间,当计数器达到设定的消抖时间时自动清零。如果按键不在抖动阶段,计数器保持0。这一逻辑的作用是为抖动检测提供时间窗口,从而滤除机械按键可能存在的瞬时跳变。

代码的51-55行是消抖输出逻辑。当按键处于抖动阶段时,消抖输出btn_deb_fix[i]保持原状态不变,避免在抖动过程中出现不稳定输出;而在非抖动阶段,按键的实际状态直接传递到消抖输出,从而生成稳定的按键信号。这里需要注意,由于是时序逻辑,赋值总在下一个时钟周期才生效,所以在抖动开始或结束的边沿,输出信号会在下一个时钟周期才更新。时序逻辑的赋值总在下一个时钟周期生效,所以抖动开始或结束时的操作会在当前时钟周期观察到的输出上有延迟,但不会影响整体的消抖效果。

3.4.LED********控制模块

从代码的14行到58行是LED的闪烁控制逻辑,主要用于根据输入的控制信号ctrl实现不同模式的LED灯显示。这里只讲解主要实现的功能。首先代码的14-20行是时间计数器逻辑,通过一个50MHz时钟对led_light_cnt计数,每个时钟上升沿计数器加1,当计数器达到24,999,999时归零,这样形成了一个0.5秒的周期,用作LED模式切换的时间基准。

代码的23-27行用于保存上一个LED状态周期的控制信号值ctrl_1d,在每个计数器归零的时刻,将当前的ctrl保存到ctrl_1d中,以便在模式切换时判断当前周期是否与上一个周期不同,确保在切换模式时能够正确初始化LED状态。

代码的30-58行是LED状态变化逻辑。在每个计数器达到24,999,999,即0.5秒时,进入一个case分支,根据ctrl信号选择不同的LED显示模式。当ctrl=2'd0时,实现从高位到低位的LED流水灯,如果模式刚刚切换(ctrl_1d !=ctrl),则将LED状态初始化为8'b1000_0000,否则每个周期将LED状态循环右移一位,形成流水灯效果。当ctrl=2'd1时,实现隔一亮一交替的LED闪烁,如果模式切换则初始化为8'b1010_1010,否则每个周期取反LED状态,实现交替闪烁效果。当ctrl=2'd2时,实现从高位到低位的暗灯流水效果,切换模式时初始化为8'b0111_1111,否则同样通过右移循环实现流水效果。

assign 语句 assign led =led_status;将计算得到的LED状态输出到模块端口led,使外部能够看到LED灯的显示效果。不同模式下LED状态会按0.5秒周期循环变化。这个模块通过计数器实现时间基准,通过保存上一个控制周期的信号判断模式切换,并根据不同模式更新LED状态,实现从流水灯、交替闪烁到暗灯流水的多种LED显示效果

****4.****实验现象

每按下一次KEY1,LED灯状态切换一次,总共三种LED模式供循环切换;

LED模式一:从高位到低位的LED流水灯;LED模式二:隔一亮一交替点亮;

LED模式三:从高位到低位暗灯流水;

相关推荐
XMAIPC_Robot3 小时前
电力设备RK3568/RK3576+FPGA,多系统混合部署Linux+RTOS RT-THREAD,强实时性
linux·运维·fpga开发
XMAIPC_Robot4 小时前
RK3588 PLC AMP 核隔离配置 + RT‑Thread 实时优化 + FPGA 接口定义 + CODESYS 工程
人工智能·嵌入式硬件·深度学习·fpga开发
喵喵苗4 小时前
嵌入式和 FPGA 工程师与AI 结合技术提升规划
人工智能·fpga开发
传感器与混合集成电路16 小时前
1/16砖电源模块使能逻辑解析与上电时序设计
fpga开发
FPGA_小田老师21 小时前
ZYNQ7020笔记:MIO、EMIO、GPIO的区别及应用
fpga开发·gpio·zynq·外设·mio·emio
不会武功的火柴21 小时前
SystemVerilog语法(7)-接口(interface)
嵌入式硬件·fpga开发·仿真·ic验证·rtl
高速上的乌龟21 小时前
Lattice LFCPNX-100 Fpga开发+源码:基于I2c协议的IMU驱动控制
fpga开发
GateWorld1 天前
LCD显示技术完全指南:原理·制造·驱动·FPGA实现之基础三
fpga开发·lcd显示·minilvds·fpga点屏
cjie2211 天前
图像缩放因子的计算
计算机视觉·fpga开发