lsw0136 发表于 2010-6-8 15:06:37

请教,Verilog hdl语言如何使数组占用ram,而不占用逻辑资源?

用得EP1C6,定义的数组都占用逻辑单元,ram占用0%,有办法吗?必须要用ip核吗?

可是用了ip核之后,读数据的时候,还是要定义变量接收数据,这样不又占用逻辑资源了吗?

racemaker 发表于 2010-6-8 15:25:18

quartus 中可以通过设置综合选项来选择是否用内嵌ram块。

setting-> analysis & synthesis setting-> more setting-> auto ram replacement

lsw0136 发表于 2010-6-8 15:33:31

auto ram replacement选项是打开的

在程序中定义了一个 reg Moter_ram ;

可是这个数组总是占用逻辑单元

racemaker 发表于 2010-6-8 16:05:10

reg Moter_ram ;
这样描述不一定会用ram替代,可能要看你的程序怎么描述。具体怎么做我也没试过,抱歉!

lsw0136 发表于 2010-6-8 16:08:49

能具体解释一下吗?程序写到这卡壳了,什么样的描述会用ram替代呢?

racemaker 发表于 2010-6-8 16:33:34

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)

ngzhang 发表于 2010-6-8 16:45:03

必须用IP核。
为啥要接受数据?我是直接异步读出,在RAM口上直接拿数就行了。

lsw0136 发表于 2010-6-8 16:55:10

看redlogic的vga程序,没有使用ip核,可是ram资源也能被使用,使用了12288bit,不知道哪些变量占用ram了,我把他工程里原来的文件都删掉,把我自己的程序放过来,ram占用还是12288bit,逻辑资源使用量也和在我自己工程里占用的一样,晕死了

lsw0136 发表于 2010-6-8 16:58:48

异步方式怎么读呢?我每次mclk都要取一个数

ngzhang 发表于 2010-6-8 17:01:48

回复【8楼】lsw0136SOLOMON
异步方式怎么读呢?我每次mclk都要取一个数
-----------------------------------------------------------------------

呃,读一个数很容易的,关键是你是否要同时操作多个字。
如果同时只读或者只写一个单元的话,那就很简单了。

以读为例,在CLK来的时候,从RAM的输出口读你需要的数据,同时把地址输入换成你下一个要读的地址即可。

tear086 发表于 2010-6-8 19:14:06

學習。

lsw0136 发表于 2010-6-8 19:53:45

回复【9楼】ngzhang 兽哥
-----------------------------------------------------------------------

3q,试试看,感觉还是c语言ram随便用爽啊

akuei2 发表于 2010-6-8 20:58:17

学习中 ...
永远都使用便货的飘过

ngzhang 发表于 2010-6-8 23:06:21

回复【11楼】lsw0136SOLOMON
-----------------------------------------------------------------------

。。。在寸土寸金的FPGA软核里随便用试试看。。。

yngufeng 发表于 2010-6-9 22:56:25

Qii似乎只能用自带的IP来实现.个人觉得用Qii的话没必要自己写RAM,直接调用方便快捷.

minux 发表于 2010-6-10 01:40:38

【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没有办法用异步读写,都得是得同步操作。仔细看数据手册就明白了。

eworker 发表于 2010-6-10 04:56:28

学习

lsw0136 发表于 2010-6-10 16:15:39

回复【9楼】ngzhang 兽哥
-----------------------------------------------------------------------

当前上升沿给地址,下个上升沿读数据,地址0没有读出数据,地址1,2读的是ram0中的数,地址3读的是ram1中的数,地址4读的是ram2中的数,以此类推。

后来看ram的时序,好像是3个读时钟脉冲之后读的书才能对应上,把系统时钟信号3倍频之后作为ram的读时钟,这样送个地址,下个脉冲再读就是地址对应的数据了

不知道我的做法对不对呢?

lsw0136 发表于 2010-6-10 16:18:05

回复【14楼】yngufeng
qii似乎只能用自带的ip来实现.个人觉得用qii的话没必要自己写ram,直接调用方便快捷.
-----------------------------------------------------------------------

变量如果能直接放到ram里多爽啊,我是不是太懒了啊

minux 发表于 2010-6-10 19:34:08

ft... 直接忽略了我的15楼啊……

还要明白地说么?Quartus II支持自动推断RAM,但是你写的RAM得能用器件中的Block RAM实现才行。
必须是同步的读写才可以(输入输出可以加寄存器输出,也可以没有,都是能正确推断的)。

NJ8888 发表于 2010-6-10 19:48:30

15楼对的,XILINX也是,异步的不能用BRAM

lsw0136 发表于 2010-6-11 09:03:36

回复【19楼】minux 啊啊?
ft... 直接忽略了我的15楼啊……
还要明白地说么?quartus ii支持自动推断ram,但是你写的ram得能用器件中的block ram实现才行。
必须是同步的读写才可以(输入输出可以加寄存器输出,也可以没有,都是能正确推断的)。
-----------------------------------------------------------------------

呵呵,不好意思啊,没有忽略啊,但是确实不是很明白,

我定义一个数组,并在rst信号的时候一起赋值,这个是同步写吗?可是在综合的时候看到ram占用仍然是0%

能举个例子说明一下什么情况下才是同步读写呢?万分感谢

lsw0136 发表于 2010-6-11 09:08:39

http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_561115.jpg
(原文件名:1.jpg)

ljt8015 发表于 2010-6-11 09:32:24

mark!~

rx_78gp02a 发表于 2010-6-11 11:52:41

用synplify对着rtl右键属性加个ram style的约束选择ram block就可以了!

lsw0136 发表于 2010-6-12 09:36:01

synplify哪里有呢?

shaozh 发表于 2010-6-14 15:46:44

学习了

billjing 发表于 2012-7-4 11:17:01

quartus 能够自动将定义的RAM分配到内部RAM,但应该打开上面说的auto ram replacement 选项。
页: [1]
查看完整版本: 请教,Verilog hdl语言如何使数组占用ram,而不占用逻辑资源?