FPGA原理与结构——RAM IP核的使用与测试

news2024/11/19 1:39:47

目录

一、前言

二、RAM IP核定制

1、RAM IP核

step1 打开vivado工程,点击左侧栏中的IP Catalog

step2 在搜索栏搜索RAM,找到Block Memory Generator IP核:

2、IP核定制

step3 Baisc界面定制

step4 端口定制

step5 Other Options

step6 Summary

3、IP核例化

step7 例化

三、IP核测试

一、前言

        本文介绍Block Memory Generator v8.4 IP核的具体使用与例化,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考:

FPGA原理与结构——块RAM(Block RAM,BRAM)https://blog.csdn.net/apple_53311083/article/details/132253916?spm=1001.2014.3001.5501        本文讲述了这个IP核使用的底层资源BRAM。

FPGA原理与结构——RAM IP核原理学习https://blog.csdn.net/apple_53311083/article/details/132326228?spm=1001.2014.3001.5501        本文讲述了这个IP核的基本原理和具体参数

二、RAM IP核定制

1、RAM IP核

step1 打开vivado工程,点击左侧栏中的IP Catalog

step2 在搜索栏搜索RAM,找到Block Memory Generator IP核:

        我们知道FPGA中的RAM可以分为DRAM和BRAM,今天我们要用到的时BRAM资源实现RAM,选择图中红色部分框选的IP核,双击打开。

2、IP核定制

step3 Baisc界面定制

①Component Name : IP核名字

②Interface Type : 接口类型,可选Native类型和AXI4类型,这里我们选Native类型

    Memory Type : 存储器类型选择,对于RAM来说有三种可选(还有2种是ROM):单端口,简单双端口,真双端口,这里我们选择单端口RAM

③ECC Options :Error Correction Capability,纠错能力选项,单端口 RAM 不支持 ECC。

④Write Enable:字节写使能选项,勾中后可以单独将数据的某个字节写入 RAM 中,这里不使能。

⑤Algorithm Options:算法选项。可选择 Minimum Area(最小面积)、Low Power(低功耗)和 Fixed Primitives(固定原语),这里选择默认的 Minimum Area。

step4 端口定制

        这里因为我们使用是单端口的RAM,所以只需要配置一个端口A就好了,如果使用的是双端口RAM,端口A和端口B需要独立进行配置。

① Memory Size 

        Write Width : 写位宽,这里设置为8

        Read Width : 读位宽,允许和读的位宽不一致,但是要满足一定的比例要求,这里设置和写位宽一致,为8

        Write Depth : 写深度,这里设置为32,这样就等于确定了我们的RAM的大小

        Read Depth : 读深度,由于写位宽+写深度已经确定了RAM的大小,再结合读位宽,这里读深度已经唯一确定(写位宽*写深度/读位宽),这里就是8*32/8 = 32

② Operating Mode : RAM 读写操作模式。共分为三种模式,分别是 Write First(写优先模式)、Read First(读优先模式)和 No Change(保持模式)这里选择Write First模式。

     Enable Port Type:使能端口类型。Use ENA pin(添加使能端口 A 信号);Always Enabled(取消使能信号,端口 A 一直处于使能状态),这里选择默认的 Use ENA pin。

③ Port A Optional Output Register:端口 A 输出寄存器选项。其中“Primitives Output Register”默认是选中状态,作用是打开 BRAM 内部位于输出数据总线之后的输出流水线寄存器,虽然在一般设计中为了改善时序性能会保持此选项的默认勾选状态,但是这会使得 BRAM 输出的数据延迟一拍,在这里我们只是进行一个简单的例化测试,为了使得我们的效果直观,我们不进行勾选。

④ Port A Output Reset Options:RAM 输出寄存器复位信号选项,这里不添加复位信号,保持默认即可。(注意是对输出寄存器复位,不是对RAM的复位)

⑤ READ Address Change A : 这是对于ultrascale系类的,普通的7系类不适用。

step5 Other Options

① Pipeline Stages within Mux:当使用多个BRAM资源来构成一个较大的RAM时,IP核提供了可选的0~3流水线结构来帮助优化性能,这里我们的RAM很小,一块BRAM(18Kb)就可以实现,所以不需要 。

② Memory Initialization : 内存初始化,简单说就是给RAM进行赋初值,可以有两种方式,一种是通过Coe文件写入,还有一种是直接把RAM赋同一个值,这里我们选择的就是第二种,全部赋值为0 。(也可以两种都不选)

③ :这里都是一些仿真的打印信息,我们保持默认。

step6 Summary

        基本上所有的IP核设计的最后都会有一个Summary界面来帮助我们进行一个检查回顾,这里我们可以看到使用的是单端口RAM,用到了一个18Kb的BRAM资源,读延迟1个时钟周期,A端口的地址位宽为5 。

        最后我们点OK,逐步完成IP核的生成。

3、IP核例化

step7 例化

        对于IP核的例化来说,找到如下界面(IP Sources),图中标注了VHDL和Verilog的例化案例,我们以verilog为例

//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
ram_v1 your_instance_name (
  .clka(clka),    // input wire clka
  .ena(ena),      // input wire ena
  .wea(wea),      // input wire [0 : 0] wea
  .addra(addra),  // input wire [4 : 0] addra
  .dina(dina),    // input wire [7 : 0] dina
  .douta(douta)  // output wire [7 : 0] douta
);
// INST_TAG_END ------ End INSTANTIATION Template ---------

// You must compile the wrapper file ram_v1.v when simulating
// the core, ram_v1. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.

        把上述的代码赋值出来,进行模块例化就可以了。

        设计的顶层代码如下:

module top(
    input clk,               //输入时钟
    input ena,               //ram使能信号
    input wea,               //ram读写选择
    input [4:0]addra,        //读写地址(共用)
    input [7:0]din,         //数据输入

    output [7:0]dout         //数据输出
    );

    ram_v1 ram_u1(
        .clka(clk),
        .ena(ena),
        .wea(wea),
        .addra(addra),
        .dina(din),
        .douta(dout)
    );

endmodule

三、IP核测试

        首先我们需要添加 仿真文件:

`timescale 1ns / 1ns

module tb_ram();

reg clk;           //时钟
reg ena;           //ram使能信号
reg wea;           //ram读写选择,1写,0读
reg [4:0]addra;    //ram地址
reg [7:0]din;      //数据输入
wire [7:0]dout;    //数据输出

initial begin
    clk = 0;
    ena = 0;
    wea = 0;
    addra = 0;
    din = 0;
#30
    ena = 1;
    wea = 1;      //写数据
    repeat(30)begin
    #10
        addra = addra + 1;
        din = din + 1;
    end

    wea = 0;     //读数据
    addra = 0;
    repeat(30)begin
    #10
        addra = addra + 1;
    end
#20
    $finish;
end

always #5 clk = ~clk;

top tb_top(
    .clk(clk),
    .ena(ena),
    .wea(wea),
    .addra(addra),
    .din(din),
    .dout(dout)
);

endmodule

        我们设计的仿真方式如下,首先向0~29地址内写入数据,随着地址每次加1,写入的数据也加1,一共写入30组数据,然后进行读操作,从地址0开始,把数据读出来

         上图完成了写操作,从wea和ena同时拉高开始进行写操作,把数据依次写入RAM。

        上图完成了读操作,从wea拉低开始进行读操作,从地址0开始依次读出之前写入的数据。

        到这里我们就完成了IP核的测试,但是有一个小问题,在进行数据写入的时候,我们的dout已经有了输出的值,这其实是因为我们选择的是写优先模式,输入值被直接驱动到了输出端,如果我们不希望这时候dout有数据,可以设置为读优先模式,或者在写优先模式下通过wea增加一层组合逻辑的判断,这样就能实现我们的设计需求了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/905524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell脚本 六 :免交互

文章目录 1.免交互的概念1.1什么是免交互 2.多行重定向2.1标准格式2.2注意事项2.3示例 3. expect免交互 (需要安装)3.1定义3.2 安装3.3命令格式3.4 执行expect脚本3.5 expect相关命令3.5.1 脚本解释器3.5.2 spaw3.5.3 expect3.5.4 send3.5.5 结束符3.5.6…

Vue3 用父子组件通信实现页面页签功能

一、大概流程 二、用到的Vue3知识 1、组件通信 (1)父给子 在vue3中父组件给子组件传值用到绑定和props 因为页签的数组要放在父页面中, data(){return {tabs: []}}, 所以顶部栏需要向父页面获取页签数组 先在页签页面中定义props用来接…

AMBA总线协议(2)——AMBA信号

一、前言 在之前的文章中我们已经对AMBA总线协议进行了一个简单的介绍,这篇文章我们来详细介绍AHB,APB,AXI协议的信号。对于AMBA总线协议有一个初步直观的认识。 二、AMBA信号 所有 AMBA 信号的命名都用名称的第一个字母来指示信号和哪个总线相关联。信号名称中用一…

学习设计模式之装饰器模式,但是宝可梦

装饰模式 为了不改变组件的结构,动态地扩展其功能。 通常,扩展功能通过子类进行,但是继承的方式具有静态特征,耦合度高。 意图:动态地给对象添加额外的功能 主要解决:继承方式是静态特征,扩…

[国产MCU]-W801开发实例-GPIO输入与中断

GPIO输入与中断 文章目录 GPIO输入与中断1、硬件准备2、软件准备3、驱动实现4、驱动测试W801的GPIO支持软件配置中断,中断触发方式包含:上升沿触发、下降沿触发、高电平触发、低电平触发。本文在前面[ 国产MCU]-W801开发实例-按键与GPIO输入的基础上实现GPIO中断配置。 1、硬…

字节跳动推出免费域名DNS和公共DNS服务

近日,字节跳动旗下云计算服务火山引擎推出了 TrafficRoute DNS 套件,套件提供了从公网到私网、从递归到权威的全链路 DNS 服务以及基于 DNS 的流量调度服务,包含了云解析(DNS)、云调度(GTM)、私…

Linux:安全技术与防火墙

目录 一、安全技术 1.安全技术 2.防火墙的分类 3.防水墙 4.netfilter/iptables关系 二、防火墙 1、iptables四表五链 2、黑白名单 3.iptables命令 3.1查看filter表所有链 iptables -L ​编辑3.2用数字形式(fliter)表所有链 查看输出结果 iptables -nL 3.3 清空所有链…

宇宙原理:黑洞基础。

宇宙原理:黑洞基础TOC 黑洞的数理基础:一个由满数组成的数盘,经过自然演进,将会逐步稀疏化、最终会向纯数方案发展;纯数方案虽然只有{2}、无数(虚拟)、{0,1,2,3}(虚拟)、…

wustoj2007标准体重和身高的对应关系

#include <stdio.h> int main() {int n;double f;scanf("%d",&n);f(n-100)*0.9*2;printf("%.1lf",f);return 0;}

读发布!设计与部署稳定的分布式系统(第2版)笔记34_读后总结与感想兼导读

1. 基本信息 发布&#xff01;设计与部署稳定的分布式系统 第2版 Release It! Design and Deploy Production - Ready Software,Second Edition [美]迈克尔尼加德(MichaelT.Nygard) 人民邮电出版社,2020年1月出版 1.1. 读薄率 2版书籍总字数426千字&#xff0c;笔记总字数…

wustojc2011计算终止时间

#include <stdio.h> int main() {int n,m,a,b,c,d;scanf("%d%d",&n,&m);an%100;c0;bam;while(b>60&&b>0){bb-60;c;}while(b<0){bb60;c--;}dn/100c;if(d>24)dd-24;printf("%d%02d",d,b);return 0; }

【硬件设计】INA282电流采集电路

文章目录 1. 电流采集电路介绍1.1 电流采集电路是什么1.2 电流采集电路的作用和特点1.3 电流采集电路的应用场景 2. 电流采集芯片INA282AQDRQ12.1 INA282AQDRQ1特性和基本参数2.2 INA282AQDRQ1原理2.3 INA282AQDRQ1的注意事项 3. INA282单向电流采集电路4. INA282双向电流采集电…

计算机技术与软件专业技术资格(水平)考试----系统架构设计师

【原文链接】计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试----系统架构设计师 考试简介 计算机软件资格考试是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试。计算机软件资格考试既是职业资格考试&#xff0c;又是职称资格考试。考试合格…

vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件

文章目录 ⭐前言⭐react 组件传值实例&#x1f496;父组件传值给子组件&#xff08;props&#xff09;&#x1f496;子组件传递事件给父组件props绑定事件&#x1f496;父组件触发子组件的事件Ref ⭐vue3 组件传值实例&#x1f496; 父组件传递数据给子组件props&#x1f496; …

Transformer---ViT:vision transformer

记录一下对transformer方法在计算机视觉任务中的应用方法的理解 参考博客:https://blog.csdn.net/weixin_42392454/article/details/122667271 参考代码:https://gitcode.net/mirrors/Runist/torch_vision_transformer?utm_sourcecsdn_github_accelerator 模型训练流程: imp…

【数据结构与算法】克鲁斯卡尔算法

克鲁斯卡尔算法 介绍 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法是用来求加权连通图的最小生成树的算法。基本思想&#xff1a;按照权值从小到大的顺序选择 n - 1 条边&#xff0c;并保证这 n - 1 条边不构成回路。具体做法&#xff1a;首先构造一个只含 n 个顶点的森林…

文本三剑客sed grep awk

目录 1、sed 1.1、基本用法 1.2、sed脚本格式 1.3、搜索与替换 1.4、变量 2、awk 2.1、基础用法 2.2、常见的内置变量 2.3、模式 2.4、判断 2.5、for计算 2.6、数组 3、grep 1、sed sed 即 Stream EDitor&#xff0c;和 vi 不同&#xff0c;sed是行编辑器 Sed是从…

leetcode刷题之283:移动零

问题 实现思路 首先, 将dest指向-1 位置, cur指向下标为0 的位置, 在cur遍历的过程中: 1) 遇到非零元素则与下标dest1 位置的元素交换, 2) 若遇到零元素则只继续cur遍历. 下标为1 的位置上是 非零元素 执行1) 交换得到右图结果 随后cur 得到下图结果 下标为2 的位置上是零…

day-27 代码随想录算法训练营(19)part03

78.子集 画图分析&#xff1a; 思路&#xff1a;横向遍历&#xff0c;每次遍历的时候都进行一次添加&#xff0c;然后进行纵向递归&#xff0c;递归完之后进行回溯。 注意&#xff1a;空集也是子集。 90.子集|| 分析&#xff1a;和上题一样&#xff0c;区别在于有重复数字 …

LeetCode283.移动零

这道题还是很简单的&#xff0c;我用的是双指针&#xff0c;左指针i从头开始遍历数组&#xff0c;右指针j是从i后面第一个数开始遍历&#xff0c;当左指针i等于0的时候&#xff0c;右指针j去寻找i右边第一个为0的数和i交换位置&#xff0c;交换完了就break内层循环&#xff0c;…