请教,Verilog hdl语言如何使数组占用ram,而不占用逻辑资源?
用得EP1C6,定义的数组都占用逻辑单元,ram占用0%,有办法吗?必须要用ip核吗?可是用了ip核之后,读数据的时候,还是要定义变量接收数据,这样不又占用逻辑资源了吗? quartus 中可以通过设置综合选项来选择是否用内嵌ram块。
setting-> analysis & synthesis setting-> more setting-> auto ram replacement auto ram replacement选项是打开的
在程序中定义了一个 reg Moter_ram ;
可是这个数组总是占用逻辑单元 reg Moter_ram ;
这样描述不一定会用ram替代,可能要看你的程序怎么描述。具体怎么做我也没试过,抱歉! 能具体解释一下吗?程序写到这卡壳了,什么样的描述会用ram替代呢? module memory(wr,rd,addr,data);
input wr,rd;
inout data;
input addr;
reg memory;
wire data = (rd? memory: 8'hzz);
always @(posedge wr)
begin
memory = data;
end
endmodule
试了一下程序这样描述,但是吧auto ram replacement 打开,都是不会综合成内嵌ram的。
但是从RTL来看,和用内嵌ram没什么区别,应该是可以用ram替代的,也期待高人说说。
http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_560463OX1XAW.jpg
(原文件名:ram.jpg) 必须用IP核。
为啥要接受数据?我是直接异步读出,在RAM口上直接拿数就行了。 看redlogic的vga程序,没有使用ip核,可是ram资源也能被使用,使用了12288bit,不知道哪些变量占用ram了,我把他工程里原来的文件都删掉,把我自己的程序放过来,ram占用还是12288bit,逻辑资源使用量也和在我自己工程里占用的一样,晕死了 异步方式怎么读呢?我每次mclk都要取一个数 回复【8楼】lsw0136SOLOMON
异步方式怎么读呢?我每次mclk都要取一个数
-----------------------------------------------------------------------
呃,读一个数很容易的,关键是你是否要同时操作多个字。
如果同时只读或者只写一个单元的话,那就很简单了。
以读为例,在CLK来的时候,从RAM的输出口读你需要的数据,同时把地址输入换成你下一个要读的地址即可。 學習。 回复【9楼】ngzhang 兽哥
-----------------------------------------------------------------------
3q,试试看,感觉还是c语言ram随便用爽啊 学习中 ...
永远都使用便货的飘过 回复【11楼】lsw0136SOLOMON
-----------------------------------------------------------------------
。。。在寸土寸金的FPGA软核里随便用试试看。。。 Qii似乎只能用自带的IP来实现.个人觉得用Qii的话没必要自己写RAM,直接调用方便快捷. 【14楼】 yngufeng
这也太冤枉Quartus II了…… 它明明可以自动infer RAM的,我认为这是最基本的功能……
(如果综合工具不能自动识别RAM/ROM,那么我们怎么写跨平台的HDL?)
注意看编译的Info信息,比如这条:
Info: Found 1 instances of uninferred RAM logic
Info: RAM logic "data" is uninferred due to asynchronous read logic
那不是很明显告诉你为啥不能用内部RAM资源了么……
须知,Altera的FPGA里面的块RAM没有办法用异步读写,都得是得同步操作。仔细看数据手册就明白了。 学习 回复【9楼】ngzhang 兽哥
-----------------------------------------------------------------------
当前上升沿给地址,下个上升沿读数据,地址0没有读出数据,地址1,2读的是ram0中的数,地址3读的是ram1中的数,地址4读的是ram2中的数,以此类推。
后来看ram的时序,好像是3个读时钟脉冲之后读的书才能对应上,把系统时钟信号3倍频之后作为ram的读时钟,这样送个地址,下个脉冲再读就是地址对应的数据了
不知道我的做法对不对呢? 回复【14楼】yngufeng
qii似乎只能用自带的ip来实现.个人觉得用qii的话没必要自己写ram,直接调用方便快捷.
-----------------------------------------------------------------------
变量如果能直接放到ram里多爽啊,我是不是太懒了啊 ft... 直接忽略了我的15楼啊……
还要明白地说么?Quartus II支持自动推断RAM,但是你写的RAM得能用器件中的Block RAM实现才行。
必须是同步的读写才可以(输入输出可以加寄存器输出,也可以没有,都是能正确推断的)。 15楼对的,XILINX也是,异步的不能用BRAM 回复【19楼】minux 啊啊?
ft... 直接忽略了我的15楼啊……
还要明白地说么?quartus ii支持自动推断ram,但是你写的ram得能用器件中的block ram实现才行。
必须是同步的读写才可以(输入输出可以加寄存器输出,也可以没有,都是能正确推断的)。
-----------------------------------------------------------------------
呵呵,不好意思啊,没有忽略啊,但是确实不是很明白,
我定义一个数组,并在rst信号的时候一起赋值,这个是同步写吗?可是在综合的时候看到ram占用仍然是0%
能举个例子说明一下什么情况下才是同步读写呢?万分感谢 http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561115.jpg
(原文件名:1.jpg) mark!~ 用synplify对着rtl右键属性加个ram style的约束选择ram block就可以了! synplify哪里有呢? 学习了 quartus 能够自动将定义的RAM分配到内部RAM,但应该打开上面说的auto ram replacement 选项。
页:
[1]