13 双口 RAM IP 核

双口 RAM IP 核简介

双口 RAM IP 核有两个端口,它又分为伪双端口 RAM 和真双端口 RAM,伪双端口 RAM 一个端口只能读,另一个端口只能
写,真双端口 RAM 两个端口都可以进行读写操作。同时对存储器进行读写操作时就会用到双端口 RAM,例如有一个 FIFO 存储器,需要同时对其进行数据的写入和读出,这时候就需要一个写端口和一个读端口。

伪双端口 RAM

BMG IP 核配置成简单双端口 RAM 的框图如下图所示:
在这里插入图片描述
它有两组独立的端口 A 和 B,其中 A 端口只能提供了 DINA 数据总线,只能进行写操作,B 端口只提供了 DOUTB 数据总线,只能进行读操作,此外它相当于单口 RAM 还多出了以下信号线(在常规使用中一般不会关注这些信号线):

  1. IINJECTSBITERR:Inject Single-Bit Error 的简写,即注入单 bit 错误,仅适用于 Xilinx Zynq-7000 和 7系列芯片的 ECC 配置。
  2. IINJECTDBITERR:Inject Double-Bit Error 的简写,即注入双 bit 错误,同样仅适用于 Xilinx Zynq-7000和 7 系列芯片的 ECC 配置。
  3. SBITERR:Single-Bit Error 的简写,即单 bit 错误,标记内存中存在的单 bit 错误,该错误已在输出总线上自动更正。
  4. DBITERR:Double-Bit Error 的简写,即双 bit 错误,标记内存中存在双 bit 错误,需要注意的是内置的ECC 解码模块不能自动纠正双 bit 错误。
  5. RDADDRECC:Read Address for ECC Error output 的简写,即读地址 ECC 错误输出,同样仅适用于Xilinx Zynq-7000 和 7 系列芯片的 ECC 配置。

真双口 RAM

BMG IP 核配置成真双端口RAM 的框图如下图所示:
在这里插入图片描述
它有两组独立的端口 A 和 B,且每组端口都可进行读写操作。

不同 RAM 端口对比

在这里插入图片描述
通过对比可以发现无论是哪种双端口 RAM,其地址线、时钟线、使能线都有两组,所以双端口 RAM 可以实现在不同时钟域下的读/写,且可以同时对不同的地址进行读/写,这便大大提高了我们数据处理的灵活性。

读写冲突和写写冲突

写-写冲突:当两个端口都试图向同一个地址写数据(即两个端口写使能同时有效且写地址相同)时则会产生写-写冲突,发生写-写冲突后对应内存地址的数据为未知。
读-写冲突:一个端口进行读取数据操作,另一个端口进行写入数据操作,当同时操作到同一地址时就会发生读-写冲突,此时如果:

  • 写端口为 READ_FIRST 模式,则读端口读出的数据为写入操作前存储在RAM中的数据。
  • 写端口为 WRITE_FIRST 或 NO_CHANGE 模式,则读端口读出的数据为无效。

双口 RAM 配置核生成

打开 BMG IP 核的“Customize IP”窗口

  1. Vivado 工程左侧“Flow Navigator”栏中的“IP Catalog”
    在这里插入图片描述
  2. 在“IP Catalog”窗口的搜索栏中输入“Block Memory”关键字后,出现唯一匹配的“Block Memory Generator”
    在这里插入图片描述
  3. 双击“Block Memory Generator”后弹出 IP 核的配置界面
    在这里插入图片描述

BMG IP 核有关伪双口 RAM 的配置

Block Memory Generator IP核的 IP Catalog 窗口如下,主要包括一个IP名称输入框核4个选项卡,页面依次进行介绍。
在这里插入图片描述

  1. 在“Component Name”一栏可以设置该 IP 元件的名称
    在这里插入图片描述
  2. “Basic”选项卡
    在这里插入图片描述
    (1)“lnterface Type(接口模式)”:有两种接口模式可选,分别为 Native(常规)接口和 AXI4 接口。AXI4 模式一般是在处理器中的数据需要和 BRAM 交互时才会使用,当不需要与处理器数据进行交互时一般采用 Native 模式。
    (2) “Generate address interface with 32 bits”选项为是否生成位宽为 32 的地址接口,勾选后内存的数据位宽也必须设置成 32 的整数倍,一般不做勾选。
    (3) “Memory Type(存储类型)”:有五种类型可选,分别为“Single Port RAM(单端口RAM)”、“Simple Dual Port RAM(伪双端口 RAM)”、“True Dual Port RAM(真双端口 RAM)”、“Single Port ROM(单端口 ROM)”和“Dual Port ROM(双端口 ROM)”,这里以单端口 RAM 为例。
    (4) “Common Clock”选项:是否启用同步时钟,Port A 和 Port B 在同一个时钟域时可以勾选也可以不勾选在不同时钟域时不能勾选,否则跨时钟域会出问题。
    (5) “ECC Options(ECC 选项)”:ECC纠错码选项只有在伪双端口 RAM 类型下才可以进行配置。
    (6) “Write Enable(写使能)”:可以选择是否使用字节写使能功能,启用后可设置字节大小为 8 位或 9 位,需要注意的是启用后内存的数据位宽必须设置为所选字节大小的整数倍。
    (7) “Algorithm Options(算法选项)”:算法选项主要用于决定 BRAM 的拼接的方式,一般在BRAM 深度、宽度较大的时候起作用,有三种算法可选,分别为“Minimum Area(最小面积算法)”、“Low Power(低功耗算法)”和“Fixed Primitives(固定单元算法)”
  3. “Port A Options选项卡,Port A实现数据写入操作。
    在这里插入图片描述
    (1)“Memory Size(内存大小)”:用于指定端口宽度和深度、运行模式和使能端口类型。
  • Port A Width;数据位宽,单位 bit,本次实验我们设置成 8,可设置的位宽范围为 1~4608。
  • Port A Depth;深度,即 RAM 所能访问的地址范围。这里有一点需要注意,那就是写深度和写位宽的乘积不要超过器件本身的 ram 资源的大小。
  • Operating Mode;RAM 运作模式,有三种模式可选,分别是Write First(写优先模式)、 Read First(读优先模式)、No Change(不变模式),单口 RAM 一般选 No Change(不变模式)。
  • Enable Port Type;使能端口类型。有两种可选,分别为 Use ENA pin(添加使能端口 A 的信号)和 Always Enabled(取消使能信号,端口 A 一直处于使能状态)。
    (2)“Port A Optional Output Register”:用于为 RAM 的输出端添加寄存器,Port A 不支持。
    (3)“Port A Output Reset Options”:用于配置端口的复位信号。,Port A 不支持
    (4)“READ Address Change A”:用于更改端口的读地址,这个功能只在 UltraScale 设备上使用。
  1. “Port B Options”选项卡,Port B 只支持读操作。
    在这里插入图片描述
    (1)“Memory Size(内存大小)”:用于指定端口宽度和深度、运行模式和使能端口类型。
  • Port B Width;数据位宽,其位宽设置必须与 Port A 数据位宽存在倍数关系,通常情况下保持一致。
  • Port B Depth;深度,当 Port B 数据位宽、Port A 数据位宽和深度的值确定后,Port B 深度的值就会自动确定。
  • Operating Mode;RAM 运作模式,Port B 不可配置。
  • Enable Port Type;使能端口类型。有两种可选,分别为 Use ENA pin(添加使能端口 A 的信号)和 Always Enabled(取消使能信号,端口 B 一直处于使能状态)。
    (2)“Port B Optional Output Register”:用于为 RAM 的输出端添加寄存器。其作用是提高 BRAM 的运行频率和改善时序,当然为此付出的代价就是每勾选一个寄存器,输出就会延迟一拍。
  • Primitives Output Register 使用 BRAM 内部的寄存器打拍输出。
  • Core Output Register 使用 SLICE 的寄存器打拍输出。
  • SoftECC Input Register 当使用软 ECC 的时候,用 SLICE 的寄存器打拍。
  • REGCEA,当使用 Primitives Output Register 或者 Core Output Register 时,可以用 REGCEA 来使能相应的输出。
    (3)“Port B Output Reset Options”:用于配置端口的复位信号。可以添加一个复位信号(RSTA Pin)、配置复位时 RAM 输出总线上的数据值(Output Reset Value)、配置是否复位内置锁存器(Reset Memory Latch)、配置复位信号与时钟使能之间的优先级(Reset Priority)。
    (4)“READ Address Change B”:用于更改端口的读地址,这个功能只在 UltraScale 设备上使用。
  1. “Other Options”选项卡
    在这里插入图片描述
    (1)“Pipeline Stages within Mux”:输出端 Mux 选择器的流水线级数。在大位宽、大深度的 BRAM 拼接场景中会用 MUX 来选择输出地址所对应的数据,勾选该选项后可以使输出数据具有更好的时序。
    (2)“Memory Initialization(初始化文件)”:选择是否使用本地初始化文件(.coe 文件)来对存储空间进行初始化。
    (3)“Structural/UniSim Simulation Model Options”:用于选择结构仿真模型发生碰撞时生成的警告消息和输出的类型。
    (4)“Behavioral Simulation Model Options”:用于关闭仿真时的冲突告警和超出范围告警。
  2. “Summary”选项卡
    在这里插入图片描述
    该界面显示了配置的存储器的类型,消耗的 BRAM 资源等信息,检查没问题可以直接点击“OK”按钮生成 RAM IP 核。
    在这里插入图片描述
    在弹出的“Generate Output Products”窗口直接点击“Generate”即可。
    在这里插入图片描述

模块设计

本次实验的用 Xilinx BMG IP 核配置成一个伪装双口 RAM 并对其进行读写操作,系统框图如下:
在这里插入图片描述

编写代码

大多数情况下伪双口 RAM 都已经满足使用需求,入跨时钟域传输数据、存储数据、FIFO等,所以这里以伪双口 RAM 为例。

生成伪双口 RAM IP 核

伪双口 RAM IP 核的配置如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

伪双口 RAM IP读写代码编写

在伪双口 RAM IP读写代码先例化一个伪双口 RAM IP核,在复位完成后开始通过 Port A 周期写入数据,当第一次写入到一半时启动 Port B 进行周期读数据,波形图如下:
在这里插入图片描述

module ram_ip_rw(
	input sys_clk,
	input sys_rst_n
);

//端口 A 时钟
wire clka;
//端口 A 使能,高电平使能
reg ena;
//端口 A 写使能,高电平写入
reg wea;
//端口 A 地址
reg [5:0]addra;
//写入端口 A 的数据
wire [7:0]dina;

//端口 B 时钟
wire clkb;
//端口 B 使能,高电平使能
reg enb;
//端口 B 地址
reg [5:0]addrb;
//端口 B 读出的数据
wire [7:0]doutb;


//端口 A 时钟
assign clka = sys_clk;

//端口 A 使能
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		ena <= 0;
	else
		ena <= 1;
end

//端口 A 写使能
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		wea <= 0;
	else
		wea <= 1;
end

//端口 A 地址,0~63
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		addra <= 0;
	else if((addra < 63) && (wea == 1))
		addra <= addra + 1;
	else
		addra <= 0;
end

//端口 A 写入数据,从地址0~63依次写入如0~63
assign dina = (wea == 1) ? addra : 0;


//端口 B 时钟
assign clkb = sys_clk;

//端口 B 使能
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		enb <= 0;
	else if(addra == 31)
		enb <= 1;
end

//端口 B 地址,0~63
always @(posedge sys_clk) begin
	if(!sys_rst_n)
		addrb <= 0;
	else if((addrb < 63) && (enb == 1))
		addrb <= addrb + 1;
	else
		addrb <= 0;
end

//例化伪双口RAM IP核
blk_mem_gen_0 u_blk_mem_gen_0_inst0(
	.clka(clka),
	.ena(ena),
	.wea(wea),
	.addra(addra),
	.dina(dina),

	.clkb(clkb),
	.enb(enb),
	.addrb(addrb),
	.doutb(doutb)
);

endmodule

仿真激励代码编写

仿真激励代码非常简单,只需要例化 单口 RAM IP读写模块 ,然后产生一个周期时钟即可,完整的代码如下:

module tb_ram_ip_rw(
);

reg sys_clk;				//系统时钟
reg sys_rst_n;				//系统复位,低电平有效

//信号初始化
initial begin
	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
	#200
	sys_rst_n = 1'b1;
end

//产生时钟
always #20 sys_clk = ~sys_clk;

//例化需要仿真的IP核
ram_ip_rw tb_u_ram_ip_rw_inst0(
	.sys_clk(sys_clk),				//系统时钟
	.sys_rst_n(sys_rst_n)			//系统复位,低电平有效
);

endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode受限条件下可到达节点的数目

题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给你一个二维整数数组 edges &#xff0c;长度为 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…

决策树实验分析(分类和回归任务,剪枝,数据对决策树影响)

目录 1. 前言 2. 实验分析 2.1 导入包 2.2 决策树模型构建及树模型的可视化展示 2.3 概率估计 2.4 绘制决策边界 2.5 决策树的正则化&#xff08;剪枝&#xff09; 2.6 对数据敏感 2.7 回归任务 2.8 对比树的深度对结果的影响 2.9 剪枝 1. 前言 本文主要分析了决策树的分类和回…

matplotlib——散点图和条形图(python)

散点图 需求 我们获得北京2016年三月和十月每天白天最高气温&#xff0c;我们现在需要找出气温随时间变化的某种规律。 代码 # 导入库 from matplotlib import pyplot as plt import random# 解决中文乱码 import matplotlib matplotlib.rc("font",family"F…

详细讲解Docker架构的原理、功能以及如何使用

一、简介 1、了解docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化&#xff0c;以便隔离进程和资源&#xff0c;而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中&…

如何解决线程安全问题(synchronized、原子性、产生线程不安全的原因,锁的特性,加锁的方式等等干货)

文章目录 &#x1f490;线程不安全的示例&#x1f490;锁的特性&#x1f490;产生线程不安全的原因&#xff1a;&#x1f490;加锁的三种方式 &#x1f490;线程不安全的示例 对于线程安全问题&#xff0c;这里用一个例子进行讲解&#x1f447;&#xff1a; 我现在定义一个变…

Image Fusion via Vision-Language Model【文献阅读】

阅读目录 文献阅读AbstractIntroduction3. Method3.1. Problem Overview3.2. Fusion via Vision-Language Model 4. Vision-Language Fusion Datasets5. Experiment5.1Infrared and Visible Image Fusion 6. Conclusion个人总结 文献阅读 原文下载&#xff1a;https://arxiv.or…

串及BF朴素查找算法(学习整理):

关于串的相关定义&#xff1a; 串&#xff1a;用‘ ’表示的字符序列空串&#xff1a;包含零个字符的串子串&#xff1a;包含传本身和空串的子串 eg: abc(,a,b,c,ab,bc,ac,abc)共7个&#xff1a;串的长度的阶乘1&#xff08;空串&#xff09;真子串&#xff1a;不包含自身的所…

Java进阶-IO(3)

话接上回&#xff0c;继续java IO的学习。上一次说完了字符流的读写数据&#xff0c;这次将基础部分剩余的一点内容看完。 一、流按功能分类 1、系统流 1.1 概述 系统流的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流。 System.in&#xff1a;标…

腾讯云幻兽帕鲁服务器中,如何检查并确保所有必要的配置文件(如PalWorldSettings.ini和WorldOption.sav)正确配置?

腾讯云幻兽帕鲁服务器中&#xff0c;如何检查并确保所有必要的配置文件&#xff08;如PalWorldSettings.ini和WorldOption.sav&#xff09;正确配置&#xff1f; 登录腾讯云控制台&#xff1a;登录轻量云控制台&#xff0c;找到部署了幻兽帕鲁的服务器&#xff0c;单击实例卡片…

基于BP-Adaboost的预测与分类,附MATLAB代码免费获取

今天为大家带来一期基于BP-Adaboost的预测与分类。代码中的BP可以替换为任意的机器学习算法。 原理详解 BP-AdaBoos模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。关于更多的原…

关于编写测试用例的一些思考

测试用例是QA同学的基本功&#xff0c;每个人都有一套编写测试用例的体系&#xff0c;本文是作者结合自身的工作经验以及阅读一些测试相关的书籍后的一些看法&#xff0c;欢迎大家一起讨论学习。 测试设计 测试用例格式 面试中一些常见的问题 1.APP测试与服务端测试的区别&am…

计算机设计大赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

StarRocks实战——首汽约车实时数仓实践

目录 前言 一、引入背景 二、OLAP引擎选型 三、架构演进 四、实时数仓构建 五、业务实践价值未来规划 原文大佬的这篇首汽约车实时数仓实践有借鉴意义&#xff0c;这里摘抄下来用作学习和知识沉淀。 前言 首汽约车&#xff08;以下简称“首约”&#xff09;是首汽集团打造…

滑动窗口问题

日升时奋斗&#xff0c;日落时自省 目录 一、长度最小的子数组 二、无重复字符的最长子串 三、最大连续1的个数III 四、将x减到0的最小操作数 五、水果成篮 六、找到字符串中所有字母异位词 七、串联所有单词的⼦串 八、最小覆盖子串 注&#xff1a;滑动窗口其实很类似…

图片按照宽度进行居中裁剪,缩放大小

要求 文件存放在img_folder_path中 裁剪要求&#xff1a; 图片大小以高度为基准。居中裁剪 缩放要求&#xff1a; 图片缩放到512大小 图片另存到save_file_path路径中 代码 import numpy as np import cv2 import os from tqdm import tqdm#原图片存放位置 img_folder_p…

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 本实验是模拟进程调度中的优先级算法&#xff0c;在先来先服务算法的基础上&#xff0c;只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU&#xff0c;将其从就绪队列中出队后。若此后队首的进程的…

Spring重点记录

文章目录 1.Spring的组成2.Spring优点3.IOC理论推导4.IOC本质5.IOC实现&#xff1a;xml或者注解或者自动装配&#xff08;零配置&#xff09;。6.hellospring6.1beans.xml的结构为&#xff1a;6.2.Spring容器6.3对象的创建和控制反转 7.IOC创建对象方式7.1以有参构造的方式创建…

【硬件相关】RDMA网络类别及基础介绍

文章目录 一、前言1、RDMA网络协议2、TCP/IP网络协议 二、RDMA类别1、IB2、RoCE3、iWARP 三、RDMA对比1、优缺点说明a、性能b、扩展性c、维护难度 2、总结说明 一、前言 roce-vs-infiniband-vs-tcp-ip RoCE、IB和TCP等网络的基本知识及差异对比 分布式存储常见网络协议有TCP/IP…

【【C语言简单小题学习-1】】

实现九九乘法表 // 输出乘法口诀表 int main() {int i 0;int j 0;for (i 1; i < 9; i){for (j 1; j < i;j)printf("%d*%d%d ", i , j, i*j);printf("\n"); }return 0; }猜数字的游戏设计 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdi…

c语言--qsort函数(详解)

目录 一、定义二、用qsort函数排序整型数据三、用qsort排序结构数据四、qsort函数的模拟实现 一、定义 二、用qsort函数排序整型数据 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…