在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM 那么什么是单端口和双端口?又该如何区分真双端口和伪双端口? 单端口RAM(Single-port RAM): 输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。 伪双端口RAM可以提供并行读写操作,避免了传统单端口RAM的等待时间,因此有更快的访问速度和响应时间。 伪双端口RAM:AB可同时读写,但仅A写B读。 真双端口RAM:AB可同时读写,A可写可读,B可写可读。 图片 在功能上与伪双端口RAM与FIFO较为相似,两者有何区别? ,即伪双端口RAM。
在FPGA设计中可能会出现对单端口RAM需求较大的情况。尽管Xilinx提供了将BRAM配置为单端口RAM的IP Core,但从资源角度来看,可能会造成浪费。 例如,需要2个512x18的单端口RAM,若直接采用单端口RAM的配置方式,1个512x18的单端口RAM将占用1个18Kb的BRAM,这意味着将要消耗2个18Kb的BRAM。 这里,采用另一种方式:将BRAM配置为1Kx18的双端口RAM,其中端口A和端口B均为1Kx18的模式。具体配置方式如下图左边区域所示。显然,此时只占用了1个18Kb的BRAM。 ? 二者地址空间没有重叠,因此互相独立,从而形成了两个独立的512x18即9Kb的单端口RAM。此外,端口A和端口B的位宽可以不一致(但不是随意的),如上图的右半区域所示。 仍将BRAM配置为双端口RAM,其中端口A为1024x18,端口B为2048x9。
1,设计需求 设计一个双端口的RAM,具有独立的读写时钟,独立读写地址和数据端口,具有复位功能,并具有读和写的使能信号。 (2)输入输出端口 各个信号的含义如第二小节所示。 ? (3)双端口RAM定义 定义了一个位宽为 data_width,深度为 2^addr_width 的ram存储器。 ? (4)在写时钟的驱动下,双端口RAM写数据以及复位功能设计 在本写时钟下给出写地址和写数据,在下一个写时钟周期,数据被写入到RAM中。 ? (5)再读时钟的驱动下,双端口RAM读数据的功能设计 本读时钟给出读地址信息,在下一个读时钟信号,输出对应地址的数据。 ? 5,功能仿真(仿真代码) (1)信号初始化,并复位 ? (2)读数据过程的仿真波形 可以看出,读地址在本时钟上升沿产生,数据在下一个时钟的上升沿从RAM中读出。 ? 7,源代码下载 在公众号对话框内回复 双端口RAM 即可得到工程文件下载链接。
单口 RAM(Single RAM)、双口 RAM(Dual RAM)、简单双口 RAM(Simple-Dual RAM)、真双口 RAM(True-Dual RAM)有什么不同? 对于 分布式 RAM,支持简单双口 RAM 和双口 RAM,不能配置成真双口 RAM。 问题在于:Xilinx 给出的 DRAM(分布式 RAM)支持双口,我把双口认为包含真双口了,不对。 ,支持单口 RAM、简单双口 RAM、真双口 RAM,单口 ROM 和双口 ROM。 真双口 RAM: 和简单双口的区别: 简单双口是一个口专门读,一个口专门写; 真双口是 2 个口都可以读写; 真双口可以看成是 2 个单口拼起来的,且 2 个单口共享存储器。 ? RAM:支持单口、简单双口、双口。 (注意!这里的双口和真双口不同,DRAM 不支持真双口 RAM) ?
CMOS RAM 芯片 下面的内容中,我们通过对CMOS RAM的读写来体会一下对端口的访问。 PC机中,有一个CMOS RAM 芯片,一般简称为CMOS。 BIOS也提供了相关的程序,使我们可以在开机的时候配置CMOS RAM 中的系统信息。 (4)该芯片内部有两个端口,端口地址为70h和71h。CPU 通过这两个端口读写CMOS RAM。 (5)70h为地址端口,存放要访问的CMOS RAM单元的地址;71h为数据端口,存放从选定的CMOS RAM 单元中读取的数据,或要写入到其中的数据。 CMOS RAM中存储的时间信息 5.1 基本介绍 在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。 要读取 CMOS RAM的信息,我们首先要向地址端口70h写入要访问的单元的地址: mov al,8 out 70h,al 然后从数据端口71h中取得指定单元中的数据: in al,71h 5.3.2
nginx基础配置---点击 tomcat基础配置---点击 上述配置完成之后进行对tomcat配置不同端口 tomcat设置端口 # 移动tomcat设置两个主目录 [root@lyx local]# cp -R tomcat-home tomcat-8090 进行修改对应端口8080默认不变修改8090: [root@lyx local]# vi /usr/local/tomcat 对应访问: 修改8090端口网页内容为tomcat-8090而8080端口为hello依然为猫作为对比测试: [root@lyx local]# cd tomcat-8090/ [root@lyx tomcat lyx tomcat-8080]# cat webapps/ROOT/index.jsp hello [root@lyx tomcat-8080]# 进行刷新网页查看: 注意:如果操作完之后会出现显示一个端口那么就是端口进行冲突需要进行修改环境变量 -r-- 1 root root 833473 4月 12 09:20 nginx-1.8.1.tar.gz -rw-r--r-- 1 root root 124138 4月 12 09:14 nginx-sticky-module-ng
图片异步FIFO主要由五部分组成:RAM、写控制端、读控制端、两个时钟同步端双端口RAM:此处为伪双端口RAM进行数据存储与读出,有两组数据线、地址线、时钟线。 二、异步FIFO模块原理2.1 双口RAM ——读写数据控制模块伪双口RAM可以具体阅读三种不同RAM总结,里面对单端口、伪双端口和真双端口RAM有更加详细地介绍。 此处使用的是伪双口RAM。在 FPGA 设计中,往往使用厂商给的伪双口 RAM 的 IP;在 ASIC 设计中,往往用寄存器模拟伪双口 RAM。什么是伪双口 RAM? 简单地说,伪双口 RAM是有两组地址线、两条时钟线、一组输入数据线、一组读出数据线和一条“写使能”线的 RAM,其有两组端口,读、写各占据一组,每组端口有各自的时钟(异步FIFO使用各自不同时钟)。 Tips:伪双口RAM可以具体阅读三种不同RAM总结,里面对单端口、伪双端口和真双端口RAM有更加详细地介绍。
(1)单端口RAM 模式 单端口RAM的模型如图所示,只有一个时钟源CLK,WE为写使能信号,EN为单口RAM使能信号,SSR为清零信号,ADDR为地址信号,DI和DO分别为写入和读出数据信号。 单端口RAM模式支持非同时的读写操作。同时每个块RAM可以被分为两部分,分别实现两个独立的单端口RAM。 需要注意的是,当要实现两个独立的单端口RAM模块时,首先要保证每个模块所占用的存储空间小于块RAM存储空间的1/2。 (2)简单的双端口RAM 简单双端口RAM 模型如下图所示,图中上边的端口只写,下边的端口只读,因此这种RAM 也被称为伪双端口RAM(Pseudo Dual Port RAM)。 (3)真正双端口RAM 模式 真正双端口RAM模型如下图所示,图中上边的端口A和下边的端口B都支持读写操作,WEA、WEB信号为高时进行写操作,低为读操作。
单端口RAM支持BWE(Byte Write Enable),同样地,双端口RAM也支持BWE。 例如:双端口RAM读优先,双端口RAM写优先。这里我们看一个支持BWE功能的真双端口读优先RAM,通过这个案例了解一下SystemVerilog的几个知识点。 先看代码的第一部分,如下图所示。 从端口声明部分不难看出,该RAM有两个独立的端口:端口A和端口B。之所以认为两者独立是因为它们有各自的时钟端口、数据端口、地址端口和BWE端口。 该属性用于指导Vivado将该RAM采用何种资源实现,可用的值包括block、distributed、registers和ultra(ram_style的具体使用方法可以看这里Vivado综合属性:RAM_STYLE 不同于之前单端口BWE的描述方式,这里使用了符号“+:”,该符号的左边为基地址,右边为位宽,从而确定哪些bit被选中。除了“+:”还有“-:”,两者被称为indexed part-select。 ?
无论是单端口(SP)、简单双端口(SDP)或真双端口(TDP),也无论是采用BlockRAM或分布式RAM(Distributed RAM)实现,都可以采用如下几种方式: RTL代码 原语(Primitive ) IP Core XPM_MEMORY RTL代码方式具有较强的可控性和可测性,但未必能获得最优的综合结果;原语方式看似精确但过于繁琐,因为给用户暴露出过多的端口和属性,而实际用户用到的并不多;IP Core是比较快速且灵活的方式,也能根据性能或资源需求获得期望的综合结果,但如果需要更换Memory的实现方式例如把分布式RAM换成BRAM,就需要重新调用IP生成。 例如,设计中要用到大量的单端口RAM,如果采用IP Core的方式,就需要反复调用IP。这里我们采用XPM_MEMORY的方式。 设计中用到了两个单端口RAM,分别采用URAM和BRAM实现。 ?
但在Xilinx FPGA上,Xilinx提供的BRAM IP最高只能实现真双端口RAM。不能满足多读多写的需求。 普通真双口RAM:利用vivado IP核生成的16K深度,73bit位宽的真双口RAM消耗的BRAM数为32个。即如果11个端口各自维护一张地址查找表共使用352个RAM。 普通真双口RAM:利用vivado IP核生成的16K深度,73bit位宽的真双口RAM消耗的BRAM数为32个。 即如果11个端口各自维护一张表共使用352个RAM 对比发现,在满足11个端口同时读地址查找表的条件下,多端口RAM比普通RAM节约了68%左右的BRAM资源 四、防止读写冲突的组合逻辑设计(写优先) 读端口是第一拍读使能,读地址,第二拍读出数据。 1.单口写数据 2.单端口读数据 3.多口读相同数据 4.多口同时读不同数据
第一个为单端口RAM,第二个为伪双端口RAM,第三个为真双端口RAM,第四个为单端口ROM,第五个为真双端口ROM。我们此次使用的是单端口ROM。 写好端口之后,我们将IP核与地址控制模块例化到顶层当中。 编辑 点击Next,选择Create File,新建顶层开始写代码。 编辑 编辑 打开IP核例化的头文件。
按照端口的数量有单端口以及双端口之分,双端口来自于同时对 RAM 进行读写的需求。 双端口 RAM 又可以分为 Simple/Ture 双端口,这方面似乎有点复杂,将在后续的文章中详细分析。本文将主要介绍单端口 RAM 的使用。 单/双端口 RAM 的应用 在单端口 RAM 中,通常的应用可能是,先进行一系列写入,再进行一系列读取,循环反复。但也可以对一个地址,写入,读取,地址递增,再循环反复。 单端口 BRAM 的应用主要用于缓存,比如需要缓存一些数据,首先将所有数据放入 RAM 中,之后根据需要从不同的地址中取出数据进行运算或者处理。单端口适合读取和写入分时进行的应用。 连续的写入,读取操作可以使用双端口的 RAM 实现,双端口 RAM 有各种独立的地址通道和数据通道,可选各自独立的时钟。 双端口 RAM 的应用很广泛,这里举一个图像处理中的例子。
5、为FTP服务器配置端口映射,即华为防火墙上的服务器映射功能。由于是两条链路,需要配置两条服务器映射的NAT策略,注意,FTP服务器默认21端口,为了安全起见,还是改个端口比较好。
这些元件是块RAM(BRAM)、LUT和移位寄存器。 BRAM是实例化到FPGA结构中的双端口RAM模块,为相对较大的数据集提供片上存储。 BRAM的应用 单端口BRAM配置 块RAM单端口配置 ? 当只有一个接口需要检索数据时,单端口块RAM配置是很有用的。这也是最简单的配置,对某些应用很有用。 也许你的应用有一堆校准参数,这些参数只写一次,并在启动时读出,那么一个单端口块RAM就可以很好的完成这个任务! 对于单端口配置,你可以在端口A上读或写数据,你不能同时做这两件事。如果你想同时读和写数据,你将需要一个双端口块RAM! 双端口BRAM配置 块RAM双端口配置 ? 块RAM双端口配置 双端口块RAM(或DPRAM)配置的行为方式与单端口配置完全相同,只是您有另一个端口可用于读取和写入数据。端口A和端口B的行为完全相同。
近期,浪潮发布了采用英特尔双端口傲腾SSD的全闪存存储新品——AS5000G5-F,成为全球范围内较早采用傲腾双端口固态盘的存储厂商之一。 AS5000G5-F是国内第一个采用双端口傲腾固态盘的存储产品,单块盘可提供56万IOPS,2.4GB/s带宽,响应时间仅为22μs,傲腾最大的优势在于低延迟和高耐久性,作为介于内存和传统存储介质之间的缓存层 双端口NAND SSD的平均延迟是以百微秒的水平,而双端口傲腾的延迟仅为20微秒,这是NVMe协议和3D Xpoint介质共同作用的结果。 双端口盘并不是新生事物,常见于存储系统当中,用来存储系统里的多个控制器访问同一个硬盘。此前的双端口盘都是SAS协议的磁盘,它的出现主要提供冗余能力,当一个端口故障的时候,还有另外一个端口可用。 另外,在性能方面,双端口通常比单端口的性能要好。 可以说,双端口方案对于基于NVMe的闪存系统方案非常重要,双端口方案的推出对于傲腾在存储系统中的应用普及有非常大的推动作用。
SLICEM中的查找表可用作分布式RAM。如果把FPGA比作大海,LUT就像一个个小的岛屿分布在这片大海上,或许这就是分布式RAM的名称由来。 以UltraScale Plus芯片为例,一个6输入查找表可实现深度为64宽度为1的单端口RAM。同一个SLICEM中的8个LUT可级联构成512深度的RAM。 LUT只提供一个时钟端口,一个写使能端口,因此,向RAM中写数据是同步的,但读数据则是异步的,为此,只需添加额外的寄存器即可实现同步读操作。这虽然增加了Latency,但改善了时序,提升了系统性能。 不管是单端口(SP)、简单双端口(SDP)还是真正双端口(TDP)RAM,都有三种工作模式,即读优先(read_first)、写优先(write_first)和保持(no_change)。 从逻辑级数的角度看,一个深度为128,宽度为1的单端口RAM,需要消耗2个LUT,1个F7MUX,如下图所示,其逻辑级数为1。
无论是7系列FPGA、UltraScale还是UltraScale Plus系列FPGA,都包含Block RAM(BRAM),但只有UltraScale Plus芯片有UltraRAM也就是我们所说的 尽管在使用XPM_MEMORY实例化URAM时可以看到clka和clkb,但这两个端口最终都连接到URAM的物理端口CLK上。 初始值 BRAM的初始值是可以设定的,无论BRAM是单端口、简单双端口还是真双端口都可以通过COE文件设定其初始值。而URAM的初始值只能为0,且无法更改,换言之,其初始值是不可设定的。 工作模式 BRAM可配置为单端口、简单双端口和真双端口,但对于URAM,不能简单地将这三种模式映射过来,其工作行为如下图所示。 可以看到,A/B端口不是独立的,例如,A端口读而B端口写同一地址,读出的是该地址原有数据;A端口写而B端口读同一地址,读出的是新写入的数据。 ?
LUT本身是实现组合逻辑的,但通过特定的配置方式(利用其输入端口和内部结构),它可以被“借用”来实现小容量的分布式RAM或移位寄存器。它是逻辑资源的一部分。 访问端口数量有限(通常是双端口),宽度可配置但受块本身限制。时序相对固定。 真正的多端口访问: 你可以通过使用多个LUT(或配置LUT为双端口模式,但容量会减半)来实现理论上任意数量的读写端口(受限于逻辑资源)。而BRAM通常是双端口(最多两个独立访问)。 实现功能多样性: BRAM: 核心功能就是存储(支持单端口、简单双端口、真正双端口RAM,以及ROM)。 可以配置为分布式RAM(各种深度和宽度组合,单/双端口)。 可以配置为移位寄存器。 其输出寄存器可以单独用作触发器。 其进位逻辑可以用于快速算术运算。
无论是用XPM_MEMORY还是IP Core的方式调用各种类型的RAM(单端口、简单双端口或真双端口),都会遇到这样一个参数:Write Mode。 可以看出,一旦写操作有效,读操作即无效,此时输出端口保持写操作之前读出的数据不变。 ? ? 三种模式让很多初学者觉得困惑。 思考一下: 对于一个单端口RAM,采用RTL代码描述,如何在同一个模块中实现如下功能: (1)宽度可配置 (2)深度可配置 (3)写模式可配置