关于vivado实现基于BRAM资源的多端口RAM过程中遇到的问题

目标是写一个multi-ports(多读多写)的RAM,且因为声明空间较大不能浪费LUT资源去做,需要用BRAM实现

遇到的第一个问题是无法使用xilinx IP核,因为端口数量限制以及IP核必然会输出延迟1 Tclk;

手写过程中发现综合非常慢,原因在于由于单元内复杂的读写逻辑,vivado自动选择了LUT资源去综合,即使使用ram_extract和ram_ram_style试图强行限制到block ram中也没用。

综合过程中查看runme日志发现了各种问题,最典型的就是

”因为以下几种原因无法map to RAM:1. xxx

2. xxx etc.“

查看AMD论坛得知是HDL限制了使用BRAM声明的RAM不能在一个always块中进行一个以上的读写,比如reg [1:0] ram [1023:0]; 那么在同一个always块中哪怕只进行一个赋值和一个读取都会导致无法map到BRAM上。

解决方案是分开很多个always块写。想办法让每个always块中只有一个对ram进行读写的操作。ram[0] <= ram[1]这样都是不可以的!


以上理论上就已经可以解决问题。但如果读写逻辑足够复杂,还会遇到下一个问题:“Can not mapped to RAM because it is too sparse”。这个在AMD论坛上也暂时没看到什么好的方案,根据工作人员的回复推断是逻辑太复杂导致MUX过多,BRAM的存储单元布局没法装下被MUX导致如此分散的RAM。接下来尝试优化读写逻辑。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vivado ,双端口 BRAM(Block RAM)的读写时序需要根据具体的设计进行调整。下面是一些常见的双端口 BRAM 读写时序示例: 1. 简单的同步读写时序 在这种情况下,读操作和写操作都是同步的,并且使用相同的地址和时钟信号。时序如下: ``` ________ CLK __| |__ ________ ADDR __| |__ ________ WE ______| |____ __________________ DIN __| |__ ________ DOUT __| |__ ``` 2. 简单的异步读写时序 在这种情况下,读操作和写操作都是异步的,并且使用相同的地址信号。时序如下: ``` __________________ ADDR __| |__ ________ WE ______| |____ __________________ DIN __| |__ ________ OE __| |__ ________ DOUT __| |__ ``` 3. 带有读写使能信号的同步时序 在这种情况下,读操作和写操作都是同步的,并且使用不同的读写使能信号。时序如下: ``` ________ CLK __| |__ ________ ADDR __| |__ ________ WE ______| |____ ________ WEN __| |__ ________ DIN __| |__ ________ OE __| |__ ________ REN __| |__ ________ DOUT __| |__ ``` 4. 带有读写使能信号的异步时序 在这种情况下,读操作和写操作都是异步的,并且使用不同的读写使能信号。时序如下: ``` __________________ ADDR __| |__ ________ WE ______| |____ ________ WEN __| |__ ________ DIN __| |__ ________ OE __| |__ ________ REN __| |__ ________ DOUT __| |__ ``` 根据具体的设计要求,可以调整双端口 BRAM 的读写时序。需要注意的是,在设计时需要遵循 FPGA 的时序限制,以确保信号能够稳定传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值