FPGA自学笔记--VIVADO RAM IP核控制和使用

FPGA自学笔记--VIVADO RAM IP核控制和使用

      本文主要学习在VIVADO软件中如何生成所需要的RAM IP核,以及相关的配置定义,并搭建tb对生成的IP读写控制时序进行仿真和测试。

一、sram ip生成与配置

1.1 ram ip创建方法

  1. 新建工程:打开 Vivado,创建一个新的工程项目。
  2. 打开 IP Catalog:在 Vivado 主界面中,单击 IP Catalog
  3. 搜索 RAM:在右侧窗口的 Search 框中输入 ram,会出现相关 IP 条目。
  4. RAM IP 类型:在 Memories & Storage Elements 分类下,可以看到两种主要的 RAM 创建入口:
    • Distributed Memory Generator
    • Block Memory Generator
  5. 主要差别
    • Distributed Memory Generator:生成的 RAM/ROM 核心占用 FPGA 的 LUT(查找表) 资源。查找表本质上是一种小型 RAM,因此这种方式适合对存储容量要求不大但需要快速访问的场景。
    • Block Memory Generator:生成的 RAM/ROM 核心占用 FPGA 的 Block Memory(嵌入式硬件 RAM) 资源。适合需要较大容量存储、节省 LUT 资源的应用。

选择 Block Memory Generator 双击鼠标进入到 RAM IP 配置界面。

1.2 Xilinx RAM IP 配置选择说明

    • 常规接口(Native):原生端口,直接控制信号。
    • AXI 接口:用于与 AXI 总线系统集成。

全局summary ,点击OK

初始化设置 RAM IP 的初始化配置用于在 FPGA 上电或复位时为存储单元设置初始值,可以选择默认填充(如全 0 或全 1),也可以通过加载初始化文件(如 .mem.coe 文件)写入自定义数据。初始化可以在生成时包含初始内容,也可以通过逻辑模块在系统上电后写入,Vivado 常通过 COE 文件指定每个地址的初始数据。同时,可以配置是否在初始化时对输出端口进行寄存,以保证上电或复位期间读出的数据符合预期。这种初始化常用于存放查找表数据、系统默认值或测试仿真阶段的初始化数据。

端口 B 输出寄存器配置 端口 B 的输出寄存器配置主要用于控制读出数据是否经过寄存器缓存,以改善时序性能或满足设计需求。在简单双端口 RAM 中,虽然端口 B 只能进行读操作,但仍可以配置其输出寄存器,通常可以选择 无寄存器(直接输出)或 有寄存器(输出数据经过寄存器打一拍),这样可以根据系统时序要求优化读数据的稳定性和延迟。在真双端口 RAM 中,同样可以独立配置端口 B 的输出寄存器,实现更灵活的时序控制。

端口 B 输出置位/复位设置 这里不创建置位/复位端口,需注意这里置位/复位并不复位 RAM 中的数据而是只复位寄存器上的值。

端口 B 数据位宽和内存深度的设置 在简单双端口 RAM 中,端口 B 仅用于读操作,无法进行写操作,因此其操作模式不可修改。而在真双端口 RAM 中,端口 B 则可以进行操作模式设置。这里将端口 B 的使能设置为 Always Enable,确保该端口始终处于使能状态。

端口使能信号类型设置 端口使能信号类型设置,一个是一直使能,一个是通过一个 ENA 信号管脚控制,这里选择 Always Enable。

操作模式设置 在 RAM IP 的配置中,操作模式(Write Mode)提供三个选项,主要用于处理当同一地址在同一时钟周期同时发生读写操作时的行为。具体而言,这些选项决定了读出的数据是 写入的最新数据该地址原有的数据,还是 读数据保持不变。选择合适的操作模式可以确保在读写冲突情况下的逻辑行为符合设计需求。Write First 模式下的波形,同时对同一地址读写,读出数据刚写入该地址的数据。Read First 模式下的波形,同时对同一地址读写,读出数据刚上次写入该地址的数据。No Change 模式下波形,读出的数据只有在进行读操作但未进行写操作时更新数据,在同时读写数据时,读出数据保持不变。

RAM 数据位宽和深度设置(重要!!!)由于我们选择的是简单双端口ram,port A作为输入端口,我们这里配置数据位宽为16,数据深度1024,也就是最大存储1024个16bit数。

实现算法选择在 RAM IP 的配置中,算法类型提供了三种选择:最小面积(Minimum Area)、低功耗(Low Power)以及固定原语(Fixed Primitives)。这些选项会影响生成的 RAM 的实现方式和性能特性,例如占用资源和功耗等。具体的实现细节可以参考 IP 手册,从第 42 页开始有详细说明。在当前配置中,我们保持默认的 最小面积 选项即可,不做额外修改。

BYTE写使能在配置 RAM 时,如果勾选写数据字节使能(Write Enable),写使能信号会按字节生成对应的位,使每个字节对应一个写使能位。字节大小可以设置为 8 或 9 位,因此输入输出数据的位宽必须是 8 或 9 的整数倍。由于这里需要一个位宽为 8bit 的 RAM,因此选择勾选 Write Enable 并将字节大小设置为 8bit。   

ECC 选项ECC 全称是 Error Correction Capability,是在简单双端口 RAM 类型下的一种纠错功能,具体该功能的详细说明,可以查看 IP 手册,可以看到,只有在简单双端口RAM类型才是可以选择的,这里选择 NO ECC。ECC是FPGA和数字IC设计中一种经典数据校验和纠错的算法功能模块,以后单开一篇博客详细介绍其原理。

存储器类型(Memory Type)对于 RAM,有三种类型可选:

类型端口数量时钟数量读写特性
单端口 RAM11读写共享同一时钟,读写不能同时进行。
简单双端口 RAM2(PORTA/PORTB)2PORTA 用于写,PORTB 用于读,可同时进行操作。
真双端口 RAM22两个端口各自独立,可同时读写,支持双向操作。

端口类型(Interface Type)
Xilinx 的很多 IP 核提供两种接口类型:在本例中,选择 Native 接口

二、verilog例化模板

        1、点击Generate,生成对应IP相关的文件。

        2、点击IP SOURCE一栏,查看例化文件,可以复制例化模块到自己的工程中使用。

blk_mem_gen_0 your_instance_name ( .clka(clka), // input wire clka .ena(ena), // input wire ena .wea(wea), // input wire [0 : 0] wea .addra(addra), // input wire [9 : 0] addra .dina(dina), // input wire [15 : 0] dina .clkb(clkb), // input wire clkb .enb(enb), // input wire enb .addrb(addrb), // input wire [9 : 0] addrb .doutb(doutb) // output wire [15 : 0] doutb );

 三、仿真TESTBENCH搭建。

        由于本文中只会对ram ip 的行为进行测试,所以直接将模块例化到tb中仿真即可,添加tb文件如下。

`timescale 1ns/1ns `define clk_period 20 module dpram_tb; reg clock; reg [15:0]data; reg [9:0]rdaddress; reg [9:0]wraddress; reg wren; wire [9:0]q; integer i; dpram dpram0( .clock(clock), .data(data), .rdaddress(rdaddress), .wraddress(wraddress), .wren(wren), .q(q) ); initial clock = 1; always#(`clk_period/2)clock = ~clock; initial begin data = 0; rdaddress = 30; wraddress = 0; wren = 0; #(`clk_period*20 +1 ); for (i=0;i<=1023;i=i+1)begin wren = 1; data = 1024 - i; wraddress = i; #`clk_period; end wren = 0; #(`clk_period*20); for (i=0;i<=15;i=i+1)begin rdaddress = i; #`clk_period; end #(`clk_period*20); $stop; end endmodule 

 

  

Read more

Flutter 三方库 huggingface_client 的鸿蒙化适配指南 - 连接全球最大 AI 开源社区、助力鸿蒙应用构建云端一体的大模型推理能力

Flutter 三方库 huggingface_client 的鸿蒙化适配指南 - 连接全球最大 AI 开源社区、助力鸿蒙应用构建云端一体的大模型推理能力

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 huggingface_client 的鸿蒙化适配指南 - 连接全球最大 AI 开源社区、助力鸿蒙应用构建云端一体的大模型推理能力 前言 在 OpenHarmony 鸿蒙应用全场景智能化的今天,AI 模型的获取与推理能力已成为应用的核心竞争力。如果你希望在鸿蒙应用中集成最前沿的文本生成、图像识别或语音转写功能,而又不想从零开始训练模型,那么 Hugging Face Hub 正是你不可或缺的“AI 军火库”。huggingface_client 作为一个专为 Dart/Flutter 设计的官方级客户端,提供了对 Hugging Face API 的深度封装。本文将指导你如何在鸿蒙端利用此库轻松调取全球顶尖的开源 AI 算力。 一、原原理分析 / 概念介绍 1.1

Android集成Whisper实战指南:从环境搭建到语音识别优化

快速体验 在开始今天关于 Android集成Whisper实战指南:从环境搭建到语音识别优化 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 Android集成Whisper实战指南:从环境搭建到语音识别优化 最近在做一个需要语音交互的Android应用时,发现市面上开源的语音识别方案要么识别率不够理想,要么对网络依赖严重。直到遇到了OpenAI的Whisper模型,这个在语音识别领域表现出色的开源模型让我眼前一亮。不过在实际集成过程中,还是踩了不少坑,今天就把

从Copilot到Agentic:快手如何重构“人×AI×流程“研发铁三角

从Copilot到Agentic:快手如何重构“人×AI×流程“研发铁三角

编者按 一年前,行业热衷于追问“从Copilot到Coding Agent,我们离AI自主开发还有多远”;一年后,快手用万人研发组织的真实实践,给出了一个冷静而有力的回答:组织级提效的胜负手,从来不在AI是否“自主”,而在人、AI、流程三者能否完成范式级重构。 当AI代码生成率突破40%,需求交付周期却纹丝不动——这一反直觉现象戳破了“工具幻觉”的泡沫。快手的破局之道,并非等待Agent进化到完全自主,而是主动将AI从“嵌入流程的工具”升维为“重写流程的要素”,通过L1-L3分级交付体系与端到端效能度量,让个人提效真正传导至组织效能。53%的需求交付周期压缩、38%的人均交付需求增长,这些来自生产环境的数据,为行业提供了一份稀缺的规模化落地参照。 这不仅是一次技术演进,更是一场组织能力的“压力测试”:AI不会自动修复流程断点,它只会将隐性问题放大。真正的智能化转型,始于承认“人仍是流程的锚点”,终于实现“人×AI×流程”的乘数效应。 文章概要 本文基于快手技术团队首次系统披露的AI研发范式升级实践「快手万人组织AI研发范式

没显卡怎么玩AI绘画?NewBie-image-Exp0.1云端镜像2块钱搞定

没显卡怎么玩AI绘画?NewBie-image-Exp0.1云端镜像2块钱搞定 你是不是也和我一样,某天刷推特突然看到同行用AI生成了一张超精致的日系角色图——发色渐变自然、服装细节拉满、眼神光都带着情绪,心里“咯噔”一下:这我也想做啊! 可一查教程,清一色写着“需要NVIDIA显卡”“推荐RTX 4060以上”,再上京东一看价格,好家伙,五千多起步。而你的工作主力机偏偏是台轻薄MacBook,连个独立显卡都没有,只能干瞪眼。 别急,今天我就来告诉你一个不用买显卡、不折腾本地环境、2块钱就能玩转AI绘画的神仙方案:使用ZEEKLOG星图平台上的 NewBie-image-Exp0.1 云端镜像,一键部署,直接开画! 这个镜像专为动漫风格图像生成打造,基于Next-DiT架构,拥有35亿参数规模,在生成二次元角色方面表现极其出色。更关键的是,它支持XML结构化提示词,能精准控制角色特征、动作、场景甚至光影氛围,特别适合插画师、原画爱好者、同人创作者这类对细节要求高的用户。 而且整个过程完全在云端完成,你只需要一台能上网的电脑(哪怕是MacBook Air),就能享受高性能GPU