400 likes | 715 Views
7.4 基于 IP Core 的 Block RAM 设计. 7.4 基于 IP Core 的 Block RAM 设计. 本节介绍基于 IP Core 的 Block RAM 设计,由于 Block RAM 属于特殊结构,使用 Xilinx 公司提供的 IP Core 是比较方便的,而且灵活、高效、不容易出错( IP Core 的使用请见 3.1.4 节)。. 7.4.1 双端口块 RAM ( Dual-Port Block RAM ). 双端口 RAM 的特性
E N D
7.4 基于IP Core的Block RAM设计 • 本节介绍基于IP Core的Block RAM设计,由于Block RAM属于特殊结构,使用Xilinx公司提供的IP Core是比较方便的,而且灵活、高效、不容易出错(IP Core的使用请见3.1.4节)。
7.4.1双端口块RAM(Dual-Port Block RAM) 双端口RAM的特性 • Virtex、Virtex-E、Virtex-II、Virtex-IIPro、Spartan、Spartan-II、Spartan-IIE和Spartan-3系列的FPGA都嵌入了Block RAM。 • 支持所有3种Virtex-II写模式 :Read-After-Write、Read-Before-Write和 No-Read-On-Write(只适用于Virtex-II和Spartan-3) • 支持RAM和ROM功能。 • 支持1到256BIT的数据端口宽度。 • 根据选择的不同结构,支持1到2M字的存储深度。
支持ROM功能,两个端口可以同时对一个地址的数据进行读操作。支持ROM功能,两个端口可以同时对一个地址的数据进行读操作。 • 支持RAM功能,两个端口可以同时对不同的地址进行写操作,或者对同一地址进行读操作。 • 两个端口是完全独立的。 • 支持A、B端口的不对称配置。 • 支持CORE设计或者使用SelectRAM+ 、 SelectRAM-II 库原语以求面积优化。 • 支持不同极性的控制信号引脚:时钟(clock)、 使能(enable), 写使能(write enable) 和输出初使化(output initialization)引脚。 • 结合Xilinx的Smart-IP技术使设计更灵活,最优化实现。
2.双端口RAM的功能描述 • Dual-Port Block RAM是由一块或多块叫做Select-RAM+™的4Kb存储块组成的。Virtex-II和Spartan-3系列的Dual-Port Block RAM是由一块或多块16 Kb存储块(SelectRAM-II™)组成的,能构成更宽或者更深的存储器设计。Select-RAM+™和SelectRAM-II™都是真正的双端口RAM,为Spartan-II和Virtex系列家族的芯片提供快速、离散的而且足够大的块RAM。因为Spartan-II和Virtex都使用4Kb的Select-RAM+™存储块,所以任何涉及到Virtex能实现的RAM,都可以在Spartan-II、Virtex-E、Virtex-II、Virtex-IIPro、Spartan-IIE系列中实现。
每个存储器含有两个完全独立的端口A和B,两个端口享有同时访问存储器中同一地址的能力,存储器的深度和宽度由使用者自己定义。两个端口在功能上是完全一样,都可以对存储器进行读写操作。两个端口可以同时对存储器的同一地址进行读操作,如果对同一地址进行操作,一个端口读,一个端口写,那么写操作成功,而读出的数据是无效的。每个存储器含有两个完全独立的端口A和B,两个端口享有同时访问存储器中同一地址的能力,存储器的深度和宽度由使用者自己定义。两个端口在功能上是完全一样,都可以对存储器进行读写操作。两个端口可以同时对存储器的同一地址进行读操作,如果对同一地址进行操作,一个端口读,一个端口写,那么写操作成功,而读出的数据是无效的。
根据使用者的定义,可以配置端口A和端口B的数据宽度和地址宽度。当两个端口被禁用时(ENA和ENB无效),存储器中的数据和输出端口将保持不变。当两个端口可用时(ENA和ENB有效),对存储器的所有操作将在输入时钟的边沿触发。根据使用者的定义,可以配置端口A和端口B的数据宽度和地址宽度。当两个端口被禁用时(ENA和ENB无效),存储器中的数据和输出端口将保持不变。当两个端口可用时(ENA和ENB有效),对存储器的所有操作将在输入时钟的边沿触发。
进行写操作时(WEA或WEB有效),相应数据端口的数据将写入地址端口所指定的存储地址中。 在这个操作中,Spartan-II/Virtex和Virtex-II系列的块RAM的输出端口的动作并不相同。 • Virtex-II和Spartan-3系列的块RAM的输出端口的具体实现要根据“写模式”的设置而定。Virtex-II和Spartan-3系列的块RAM支持3种“写模式”,每种模式决定了输出端口在写操作发生后将如何作出反应。
Spartan-II和Virtex系列的块RAM只支持一种“写模式”:Read-After-Write。这种写模式使写入的数据在写操作后呈现在输出端口。Spartan-II和Virtex系列的块RAM只支持一种“写模式”:Read-After-Write。这种写模式使写入的数据在写操作后呈现在输出端口。 • 在读操作时,地址输入端口指定的地址上的数据在输出端口输出。当同步初始化(Synchronous Initialization(SINITA或SINITB))有效时,有锁存器的输出端口将被同步初始化,Spartan-II和Virtex系列将被初始化为0,Virtex-II系列将被初始化为使用者事先定义的数据。同步初始化操作并不影响存储器中的数据,也不会与写操作发生冲突。 • 使能,写使能和同步初始化可以被定义为高电平有效或者低电平有效。
3.双端口RAM的引脚 • 双端口RAM的Core引脚如图7.4.1所示。 图7.4.1 双端口RAM的引脚
7.4.2 使用IP Core生成双端口RAM • Xilinx提供了Dual-Port Block RAM的IP Core。具体如何调用IP Core、生成IP Core见3.1.4节。这里介绍具体的一些IP Core参数,设计者可以根据设计的需要设置这些参数。 • Dual-Port Block RAM的参数设置窗口分别如图7.4.2、图7.4.3、图7.4.4、图7.4.5所示。Dual-Port Block RAM的参数设置一共有4个窗口,可以单击按钮进入下一个窗口。
元件名称(Component Name):为了生成IP Core,必须为生成的文件取一个名称。 • 端口A存储器大小(Memory Size): • 数据端口A宽度(Width A):可以选择数据端口A的宽度,宽度可以从1到256。 • 地址端口A深度(Depth A):可以选择存储器的字节数。根据所选择的不同结构,字节数可以从2BIT到2M。可以选择的地址深度要根据所选择的数据端口A的宽度而定。Spartan-II和Virtex系列的块RAM的最大字节数为256K,Virtex-II和Spartan-3系列的块RAM的最大字节数为1M。必须注意生成的CORE的大小不能超过目标器件库原语的大小
端口B存储器大小(Memory Size) : 数据端口B宽度(Width B):可以选择数据端口B的宽度,可以选择的数据端口B的宽度取决于定义的数据端口A的宽度。对于Spartan-II和Virtex系列的块RAM,能够选择的宽度可以是1,2,4,8或16倍A端口的宽度。对于Virtex-II系列的块RAM,能够选择的宽度可以是1,2,4,8,16或32倍A端口的宽度。
地址端口B深度(Depth B):定义了Width A、Depth A和Width B后,Depth B的值将为定值。根据端口A和B定义的存储器的大小必须相等可以计算出Depth B。
端口A可选项(Port A Options): • 配置(Configuration)选项:可以选择的有Read And Write(读和写), Write Only(只写)和Read Only(只读)。 • 写模式(Write mode)选择:可以为Virtex-II系列的块RAM选择写模式。Spartan-II和Virtex系列的块RAM只支持Read After Write模式。
Read After Write模式(支持的有Virtex-II、Spartan-II、Spartan-3、Virtex),可能有下面几种情况: • 没有输入输出寄存器时:数据在WEA信号有效后的第一个时钟沿传送到端口DOUTA。 • 仅有输入寄存器时:数据在WEA信号有效后的第二个时钟沿传送到端口DOUTA。 • 仅有输出寄存器时:数据在WEA信号有效后的第二个时钟沿传送到端口DOUTA。 • 有输入和输出寄存器时:数据在WEA信号有效后的第三个时钟沿传送到端口DOUTA。 • Read After Write模式的时序如图7.4.6所示。
Read Before Write模式(支持的有Virtex-II、Spartan-3),可能有下面几种情况: • 没有输入输出寄存器时:在WEA信号有效后的第一个时钟沿,存储器中当前地址上的数据被传送到端口DOUTA。 • 仅有输入寄存器时:在WEA信号有效后的第二个时钟沿,存储器中当前地址上的数据被传送到端口DOUTA。
仅有输出寄存器时:在WEA信号有效后的第二个时钟沿,存储器中当前地址上的数据被传送到端口DOUTA。仅有输出寄存器时:在WEA信号有效后的第二个时钟沿,存储器中当前地址上的数据被传送到端口DOUTA。 • 有输入和输出寄存器时:在WEA信号有效后的第三个时钟沿,存储器中当前地址上的数据被传送到端口DOUTA。
No-Read-On-Write模式(支持的有Virtex-II、Spartan-3):当WEA有效时,不会进行读操作。DOUTA端口将保持上一次读操作的数据。No-Read-On-Write模式(支持的有Virtex-II、Spartan-3):当WEA有效时,不会进行读操作。DOUTA端口将保持上一次读操作的数据。 No-Read-On-Write模式时序如图7.4.8所示。
端口B可选项(Port B Options): 端口B可选项与端口A可选项相同。 • 端口A设计选项(Port A Design Options): 1 可选引脚端(Optional Pins): a. 使能引脚端。 b. 握手信号引脚端。包括ND、RFD、RDY 信号,它们的含义如表7.4.1所示。需要注意的是,ND信号必须在RFD有效时才能有效。RFD信号在EN信号有效时一直是有效的。
可选输入寄存器(Register Options) :可以为端口DIN、ADDR和WE添加输入寄存器。 可选输出寄存器(Output Register Options): • a. Additional Output Pipe Stages:选择‘1’可以为输出端口再增加一级寄存器,选择‘0’不加寄存器。 • b. 初始化(SINIT)引脚: SINIT引脚的含义见表7.4.1。
引脚极性(Pin Polarity):使用者可以为存在的引脚极性配置。对于时钟信号,可以配置成上升沿或下降沿触发。对于EN、WE和SINIT引脚端,可以配置成高电平或低电平有效。
端口B可选项(Port B Options): 端口B可选项与端口A可选项相同。 • 库原语选择(Primitive Selection):有两项可供选择。 • 面积优化(Optimize For Area)。 • 选择库原语(Select Primitive)。Virtex、Virtex-E和Spartan-II的库原语有4kx1, 2kx2, 1kx4, 512x8和256x16。Virtex-II的库原语有16kx1, 8kx2, 4kx4, 2kx9, 1kx18, 和 512x36.
初始化(Initial Contents):可以设置配置后存储器中的初始值。 • 全局初始化值(Global Init Value):全局初始化值定义了配置后存储器中初始值。缺省(默认)为‘0’。注意输入的值必须是16进制,并且其大小不能超过A端口能输入的最大值。 • 加载初始化文件(Load Init File):存储器中的初始值可以保存在一个以COE为后缀的文件中,加载这个文件可以使存储器在配置后,各个单元的初始值为文件中所列出的值。
7.4.3 使用Memory Editor生成COE文件 • 前面提到,可以为双端口RAM提供一个初始化数据文件,加载这个文件可以使RAM在配置后,各个单元的初始值为文件中的所列出的值。下面介绍如何使用Memory Editor生成这个文件,并且写入初始化数据。
打开Xilinx Core Generator。选择菜单ToolsMemory Editor,如图7.4.9所示。进入Memory Editor,如图7.4.10所示。
(2)单击按钮,如图7.4.11所示键入名称。 图7.4.11 键入名称
单击确定。然后设置好双端口RAM的各个参数,并且在初始值输入区填写数据。选择FileGenerate COE Files生成COE文件,如图7.4.12所示。