【黑金云课堂】FPGA技术教程FPGA基础:呼吸灯实验+RAM/ROM IP设计与验证

FPGA 基础第 7-8 节 呼吸灯实验+ RAM/ROM IP 设计与验证 ,选自ALINX 黑金云课堂 FPGA 免费直播课。该课程由 ALINX 资深工程师团队倾力打造,从 0 到 1 系统化教学,帮助每位工程师跨过 FPGA 开发门槛。

🔍 ALINX :关注 ALINX,进入视频号即可查看完整黑金云课堂 FPGA 视频教程。配合笔记学习效果更佳。


FPGA PWM 呼吸灯

实验目的

  • 理解脉冲宽度调制(PWM)的基本原理
  • 掌握占空比与LED亮度的关系
  • 实现LED呼吸灯效果(亮度平滑渐变)
  • 综合运用计数器与比较器设计数字电路

PWM 原理说明

  • PWM:通过调节高电平持续时间(脉冲宽度)来控制平均能量
  • 占空比公式:占空比 = T_ON / T_周期 × 100%
  • 应用场景:LED 光、电机调速、电源管理等
  • 人眼感知:占空比越高,亮度越高(视觉暂留效应)

呼吸灯实现思路

  • 固定 PWM 周期:如 1000 个时钟周期,保证频率稳定
  • 占空比步进控制:
    • 逐步增大占空比(如每次+1),亮度增加
    • 达到最大值后逐步减小(每次-1),亮度降低
    • 回到最小值后重复循环,形成呼吸效果
  • 呼吸频率:完整周期约 1Hz

💡具体讲解可前往 ALINX 视频号进行直播回看。

Verilog核心代码

  • 模块名:pwm_generator
  • 主要信号:
    • pwm_cnt:10 位计数器,范围 0~1023,决定PWM周期
    • duty:10 位占空比控制值(0~1023)
    • pwm_out:PWM 输出,控制 LED 亮灭
  • 核心逻辑:
    • 计数器每个时钟周期加 1,自动循环
    • pwm_cnt < duty 时输出高电平,否则低电平
    • 通过外部改变 duty 值即可调节亮度

仿真波形分析

  • 通过仿真验证不同占空比下的输出波形
  • 高电平宽度与 duty 值成正比,验证 PWM 原理正确

上板效果总结

  • LED 亮度平滑变化,呼吸效果逼真
  • 无闪烁(PWM 频率 > 100Hz)
  • 长时间运行稳定
  • 成功验证 PWM 调光原理

学习要点回顾

  • 理解 PWM 周期与占空比的概念
  • 掌握用计数器生成 PWM 的方法
  • 能独立编写 PWM 发生器的 Verilog 代码
  • 能通过仿真和上板验证 PWM 输出效果

RAM IP 设计与验证

RAM IP 设计与验证核心要点

  • 核心原理与内部结构:

RAM 是易失性随机存取存储器,支持对任意地址的读写操作,访问时间与存储单元的物理位置无关。

其内部结构由三部分组成:地址译码器 ,负责对输入地址解码,地址线的宽度直接决定了 RAM 的寻址深度;存储矩阵 ,是 RAM 的核心存储区域,总存储容量等于寻址深度乘以数据位宽;读写控制逻辑,负责根据外部的读写使能信号,控制对选中存储单元的读写操作。

  • FPGA 实现方式与选型

FPGA 中 RAM 有两种主流的实现方式,选型直接影响资源利用率与性能:

  • Block RAM(BRAM):FPGA内部的专用嵌入式存储块,常见的单块容量为18Kb 或 36Kb,不会消耗FPGA的逻辑资源,访问速度较快,适合大容量数据缓存、FIFO、帧缓冲这类场景。
  • Distributed RAM(LUTRAM):利用 FPGA 内部的查找表构建的分布式存储,访问速度极快,没有额外的访问延迟,但会消耗 FPGA 的逻辑资源,适合小容量的查找表、状态机跳转表、小型缓存这类场景。

选型建议: 当存储容量小于 64bit 时,优先选择 LUTRAM,避免 BRAM 资源的浪费;当容量大于 512bit 时,优先选择 BRAM,节省逻辑资源。

端口类型与冲突处理

根据端口的配置,RAM 可分为三类,适配不同的交互场景:

  • 单端口 RAM: 仅有一套地址、数据与控制信号,同一时刻仅能执行读操作或者写操作,无法并发访问,结构最简单。
  • 简单双端口 RAM: 拥有两套独立的地址与控制信号,通常配置为 A 端口写入、B 端口读出,是典型的"生产者-消费者"数据交互模型,非常适合跨时钟域的数据传输场景。
  • 真双端口 RAM: 拥有两套完全独立且对称的读写端口,支持双向的并发访问,功能最灵活,但设计时需要处理地址冲突问题,常见的解决方法包括地址分区、仲裁机制、利用 IP 核内置的冲突处理机制。

操作模式

当两个端口同时对同一个地址进行读写操作时,RAM 支持三种不同的操作模式,适配不同的业务需求:

  • 写优先模式: 同一时钟周期内优先执行写操作,随后立即将新写入的数据输出,适合需要立即获取最新数据的场景。
  • 读优先模式: 优先将该地址的旧数据读出,之后再执行写操作更新存储,适合需要保证读取数据为操作前原始状态的场景,比如日志记录。
  • 无变化模式: 在执行写操作期间,数据输出端口保持上一次读操作的结果,不会反映当前的写过程,这种模式可以减少输出的电平翻转,降低功耗,适合普通的缓存场景。

IP 工程搭建核心配置

基于 Vivado 工具的 RAM IP 搭建,核心的配置要点如下:

  1. 输出寄存器配置: 可以选择是否添加输出寄存器,开启后会增加 1 个时钟周期的读延迟,但可以打断组合逻辑,提升 IP 的最高工作频率;如果是对延迟敏感的低延迟应用,可以关闭该选项。
  2. 位宽与深度适配: IP 核会自动根据你配置的位宽和深度,拼接多个BRAM来满足需求,无需手动处理。
  3. 异步时钟支持: IP 核默认支持双端口的异步时钟,无需额外配置,但需要注意跨时钟域的亚稳态问题,对控制信号添加同步器。

仿真与调试

仿真的核心是验证 RAM 的读写功能正确性,核心逻辑为:

先遍历所有地址写入测试数据,完成写入后再依次读取每个地址的数据,自动校验读取结果与写入数据是否一致。

上板调试时,可以使用 Vivado 的 ILA(集成逻辑分析仪)抓取 RAM 的读写信号,验证实际硬件中的时序是否符合预期。

常见的问题包括:跨时钟域同步问题、端口被综合工具优化、复位信号的同步问题。

ROM IP 设计与验证核心要点

核心原理与实现

ROM 是非易失性的只读存储器,在正常工作时仅能读取数据,无法进行写入操作,数据会在 FPGA 上电配置的阶段,通过初始化文件加载到存储单元中,断电后数据不会丢失。

FPGA 中 ROM 的实现分为两种:

  • 分布式 ROM,基于LUT实现,适合小容量、高速度的常量存储;
  • 块 ROM,将 BRAM 配置为只读模式,适合大容量的固定数据,比如波形表、启动代码这类场景。

端口类型

  • 单端口 ROM:只有一个访问端口,同一时刻仅能进行一次读操作,是最常用的类型。
  • 双端口 ROM:扩展出两个独立的访问端口,支持两个模块同时读取同一块存储的数据,适合多模块共享固定数据的场景,比如 VGA 显示模块与 DMA 模块同时读取像素数据。

IP 工程搭建

ROM IP 搭建的核心是初始化文件的制作,小容量的初始化数据可以手动编写 .coe 格式的初始化文件;对于大容量的初始化数据,比如波形、图片数据,无需手动编写,可通过脚本自动生成,大幅提升开发效率。

配置 IP 时需要注意:Xilinx 工具使用 .coe 格式的初始化文件,Intel 工具使用 .mif 格式,两者不能通用;建议将初始化文件放在工程目录下,使用相对路径,避免工程迁移时文件找不到;同时要保证初始化文件中的数据个数、位宽,与 IP 的配置完全匹配。

仿真与调试

ROM 的验证相对简单,核心是校验读取的数据与初始化文件中的数据是否一致,仿真时遍历所有地址,自动比对读取结果与预期数据即可。

常见的问题包括:初始化文件的路径错误、数据的格式不匹配、地址访问越界,这些问题都会导致 ROM 读取的数据错误,配置和仿真时需要重点关注。

总结:RAM 与 ROM 是 FPGA 设计中最常用的存储 IP,在实际项目中,需要根据容量、速度、端口的需求,选择合适的实现方式,同时重点关注跨时钟域、地址冲突这类常见问题,通过完整的仿真与上板调试,保证设计的可靠性与稳定性。

更多细节欢迎关注我们黑金云课堂全年免费直播课
黑金云课堂五月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!

系列 内容定位
Verilog开发 硬件描述语言基础、逻辑设计、仿真调试
Vitis开发 Zynq软硬件协同、外设驱动、网络协议栈
Linux开发 嵌入式Linux系统移植、驱动编写、应用开发
相关推荐
皮卡蛋炒饭.1 小时前
传输层协议UDP
linux·网络协议·udp
treesforest1 小时前
IP精准定位服务:从城市轮廓到街道坐标,技术如何重塑空间感知
网络·数据库·网络协议·tcp/ip·ip
ALINX技术博客3 小时前
【黑金云课堂】FPGA技术教程Vitis开发:PS端IIC通信
fpga开发·fpga
fiveym4 小时前
二层核心网络技术通俗解析(VLAN/Access/Trunk/LACP/ARP)
服务器·网络·网络协议
专注VB编程开发20年5 小时前
Vscode调试是真不方便
网络·网络协议
第二层皮-合肥6 小时前
线阵相机坏点校正方案
fpga开发
mobai76 小时前
frr使用Valgrind定位内存泄漏
网络协议
袁小皮皮不皮8 小时前
HCIP-BFD 学习笔记
运维·服务器·网络·笔记·网络协议·学习·智能路由器
xlq223228 小时前
54.序列化和反序列化
服务器·网络·网络协议·tcp/ip