微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请问Xilinx FPGA开发板里的BRAM,对于小设计一般怎么使用?

请问Xilinx FPGA开发板里的BRAM,对于小设计一般怎么使用?

时间:10-02 整理:3721RD 点击:
我的RTL设计很小,就是从BRAM中某些地址读出数据,然后加法运算,最后存回去。
用不到Microblaze这种处理器的IP。
但是我搜到的大部分例子,都是用Microblaze-PLB Bus-BRAM这种连接方法,请问我这种小电路,应该怎么使用BRAM呢?
我的困惑是,BRAM不是综合出来的netlist, 那么它和Verilog RTL设计是不同的, 虽然可以用行为级module做仿真,但是真正用到BRAM的时候是怎么操作的呢?比如怎么在Verilog中例化它,怎么才能真正地把自己的小design连接到BRAM的各个端口信号?

BRAM就是一RAM,跟普通的RAM操作都一样,读、写、地址、数据什么的,时序很简单。之所以叫BRAM(块RAM)是相对于分布式RAM而言的,两者的差别在于FPGA内部用什么资源实现。
对于我们这种菜鸟级用户,看到的BRAM只是一个黑盒子,所以直接在你的设计中例化用CoreGenerate产生的模块就行了。


多谢大侠回帖。
我用Core  generator 生成了一个BRAM.xco 文件,然后在同一个project里试图用一个叫TopBRAM.v的文件来例化我刚生成的BRAM。
为了简单处理,我在TopBRAM.v中没有做任何操作,只是试图例化BRAM:
module TopBRAM(clk, leds
    );
input clk;
output [7:0] leds;
wire wea;
wire [9:0] addra;
wire [7:0] dina;
wire clk;
wire ena;
BRAM mybram(.wea(wea), .addra(addra), .dina(dina), .clka(clk), .ena(ena));
endmodule
结果得到以下错误信息,请问大侠我还有那些操作没有考虑到?
WARNING:HDLCompiler:1016 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 30: Port douta is not connected to this instance
WARNING:HDLCompiler:1499 - "C:\Xilinx\DesignFiles\IPBRAM\ipcore_dir\BRAM.v" Line 39: Empty module <BRAM> remains a black box.
WARNING:HDLCompiler:634 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 25: Net <wea> does not have a driver.
WARNING:HDLCompiler:634 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 26: Net <addra[9]> does not have a driver.
WARNING:HDLCompiler:634 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 27: Net <dina[7]> does not have a driver.
WARNING:HDLCompiler:634 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 29: Net <ena> does not have a driver.
WARNING:Xst:653 - Signal <addra> is used but never assigned. This sourceless signal will be automatically connected to value GND.
WARNING:Xst:653 - Signal <dina> is used but never assigned. This sourceless signal will be automatically connected to value GND.
WARNING:Xst:653 - Signal <wea> is used but never assigned. This sourceless signal will be automatically connected to value GND.
WARNING:Xst:653 - Signal <ena> is used but never assigned. This sourceless signal will be automatically connected to value GND.
WARNING:Xst:1814 - Core <BRAM.ngc> does not contain any logic.

WARNING:HDLCompiler:1016 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 30: Port douta is not connected to this instance
BRAM例化端口douta没连
WARNING:HDLCompiler:634 - "C:\Xilinx\DesignFiles\IPBRAM\TopBRAM.v" Line 25: Net <wea> does not have a driver.
信号没给驱动
WARNING:Xst:653 - Signal <addra> is used but never assigned. This sourceless signal will be automatically connected to value GND.
地址线未赋值,综合优化连到GND了
BRAM不是说你例化了就能用,必须要有正确的控制逻辑,例化端口连接要完整。

你可以直接把顶层例化文件和CoreGenerater产生的BRAM.v(打开看看和你想的是否一样)放到一个文件夹里,把这两个文件都当做你自己的设计文件,创建工程。
在实现阶段会提示错误。只需要在Implement的属性里面,把你生成BRAM的路径当做-sd的参数,即可。

多谢各位大侠回复。我把完整的控制信号加上去了。
没有管 “Empty module <BRAM> remains a black box.” 还有 “Core <BRAM.ngc> does not contain any logic.” 这两个warning。
结果发现读操作正常工作,比如:
我的BRAM里存储的数据是
1000
0100
0010
0001
可以看到LED的流水变化。
唯一不爽的就是warning仍然去不掉。
我看到网上有人用infer来调用block RAM,请问这个infer和Core Gen有何区别呢?是不是我定义一个二维register,XST就自动综合成BRAM资源了呢?

请问infer和Core Gen有何区别呢

请问Core Gen和 infer这两种方法例化BRAM,本质上有何区别呢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top