首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
资源利用率报告中的LUT和LUTRAM有什么区别
2
xilinx verilog语法技巧(三)--RAM的初始化
3
为什么推荐使用XPM?
4
Block RAM的基本结构
5
为什么要用XPM_MEMORY
6
Vivado中用于时钟操作的几个Tcl命令
7
影响FPGA时序的进位链(Carry Chain), 你用对了么??
8
动态时钟相位
9
动态时钟频率
10
如何缩短Vivado运行时间
11
你的FPGA设计有这些缺陷吗
12
report_utilization远比你想象的强大
13
vivado如何快速找到schematic中的object
14
FPGA中的CLOCK REGION和SLR是什么含义
15
FPGA中的BEL, SITE, TILE是什么含义
16
如何快速查找目标cell
17
都是pin,有什么区别
18
都是net,有什么区别
19
一张图看懂cell, pin, net, port
20
如何快速找到组合逻辑生成的时钟
21
【Vivado那些事】Vivado下头文件使用注意事项
22
Pblock可以这么画
23
关于Pblock的8个必知问题
24
常用的跟Pblock相关的Tcl命令
25
【Vivado】那些事儿-汇总篇
26
【Vivado那些事】Xilinx FPGA普通IO能不能直接接入PLL作为时钟输入
27
Storage Elements
28
D触发器都有哪几种类型?对应什么样的代码?
29
Xilinx 7系列FPGA逻辑单元理解
30
Vivado下查看芯片资源
31
对RAM初始化怎么做
32
干货:Vivado 直接修改RAM初始化文件,避免重新综合、实现的方法
33
借助Elaborated Design优化RTL代码
34
一张图理解什么是好的设计层次
35
9个关于SSI芯片的必知问题
36
Vivado 2018.3 report_qor_suggestions怎么用
37
Vivado 2019.1新特性(5):更新的report_qor_suggestions
38
Xilinx的高质量时钟输出ODDR原语【随路时钟】【全局时钟网络】【ZC706输出时钟】【ZYNQ】
39
FPGA中BEL Site Tile FSR SLR分别指什么?
40
跟I/O相关的几个命令
41
Vivado Non-Project模式
42
FPGA中降低时钟skew的几种方法
43
FPGA时序优化之Reduce MUXF Mapping
44
什么是Forwarded Clock?
45
几个常见问题
46
如何让同一层次的模块在布局时更紧凑一些
47
什么情况下要用OOC综合方式
48
Vivado 2019.1新特性(2):report_ram_utilization
49
URAM和BRAM有什么区别
50
write_first/read_first/no_change什么区别
清单首页FPGA文章详情

为什么要用XPM_MEMORY

存储单元在FPGA设计中几乎是不可或缺的。无论是单端口(SP)、简单双端口(SDP)或真双端口(TDP),也无论是采用BlockRAM或分布式RAM(Distributed RAM)实现,都可以采用如下几种方式:

  • RTL代码
  • 原语(Primitive)
  • IP Core
  • XPM_MEMORY

RTL代码方式具有较强的可控性和可测性,但未必能获得最优的综合结果;原语方式看似精确但过于繁琐,因为给用户暴露出过多的端口和属性,而实际用户用到的并不多;IP Core是比较快速且灵活的方式,也能根据性能或资源需求获得期望的综合结果,但如果需要更换Memory的实现方式例如把分布式RAM换成BRAM,就需要重新调用IP生成。相比之下,XPM_MEMORY就很好地继承了这些方式的优点。

XPM_MEMORY是Xilinx提供的一种宏(Xilinx Parameterized Macros),从字面上就可以看到这是一种可参数化的方式。打开Vivado,依次点击Tools,Language Templates,Verilog或VHDL,Xilinx Parameterized Macros,即可看到如下图所示的列表。从这个列表我们可以看到,设计中可能用到的Memory类型都在其中(FIFO有单独的XPM_FIFO)。

例如,设计中要用到大量的单端口RAM,如果采用IP Core的方式,就需要反复调用IP。这里我们采用XPM_MEMORY的方式。选择xpm_memory_spram,并对其进行封装(实例化,形成一个新的RTL模块)。这个封装的过程需要提取一些参数以便后期可快速地定制化。这些参数如下图所示。

可以看到主要的参数包括:

MEMORY_PRIMITIVE: Memory的实现方式,可以是distributed,block或ultra

ADDR_WIDTH: 地址的位宽,该参数决定了Memory的深度

DATA_WIDTH: 数据的位宽,该参数也就是Memory的宽度

WRITE_MODE: 写模式,可以是read_first,write_first或no_change,主要解决读写冲突问题

READ_LATENCY: 读Latency,该参数决定了从读地址有效到输出数据有效所需的时钟周期

相应的实例化如下图所示。可以看到此时已经把ADDR_WIDTH_A的值设置为其上层参数ADDR_WIDTH,MEMORY_PRIMITIVE的值设置为上层参数MEMORY_PRIMITIVE等,从而实现了参数化。

具体工程中,只需对mysp进行参数化定制即可满足不同的需求。如下图所示。设计中用到了两个单端口RAM,分别采用URAM和BRAM实现。

下一篇
举报
领券