前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么要用XPM_MEMORY

为什么要用XPM_MEMORY

作者头像
Lauren的FPGA
发布2019-10-30 21:58:57
4.5K0
发布2019-10-30 21:58:57
举报
文章被收录于专栏:Lauren的FPGALauren的FPGA

存储单元在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实现。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lauren的FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档