请教RAM的问题
第一个问题:比如,如果使用容量为128*8bits的RAM,4个读端口,4个写端口,
和使用4个RAM,每个分别是32*8bits,1个读端口,一个写端口。
这个两种情况下RAM总的存储容量啊接口总数好像差不多,但是不知道用起来有什么区别啊?面积,功耗或者复杂度,或者其他方面?
第二个问题: 如果我需要的RAM的总的存储容量是 128*168bits,就是有128个存储位置,每个位置上存储168bits的数。8个读端口,16个写端口。
请问这种情况下,是不是不能只用一个大的RAM,而且必须使用多个小的RAM啊?
真心求助啊,先谢谢了
1. FPGA内部的RAM可以用两种方式实现,BLOCK RAM或者distributed RAM,前者是真正的RAM存储体,后者是用FPGA内部的SLICEM搭出来的。
2. 如果是使用block ram的话,一般的,都有固定的大小,比如18Kb。可以配置成16K*1bit, 8K*2bit等等(大概是这样,你可能发现了,我写的size前后不一致,那是因为有两个bit用来做校验位的)。所以,你的例子中用168的宽度,那么应该是多个18Kb的RAM搭建而成的。深度是128,没问题。但是BlockRam没有168宽度的,所以是用好几个BlockRam并行拼接出来的。
3. 这种拼接的行为,ISE会自动帮你做的。所以你不用管到底用一个大的还是几个小的。你就生成一个大的128*168的RAM就好。
4. “8个读端口,16个写端口”,貌似没有直接这么多端口的RAM。所以,自己写个控制器是不可避免的拉。
楼上解释的很清楚
非常感谢小编详细的回答!感激不尽
“ 4. “8个读端口,16个写端口”,貌似没有直接这么多端口的RAM。所以,自己写个控制器是不可避免的拉。”
我可不可以问下,一般读端口和写端口的个数有什么限制吗?还有关于这个控制器,能不能给个例子?
不好意思,我是新手,问的问题可能比较弱啊
Xilinx 的FPGA里面的block ram有一个端口的,两个端口的,并行端口。这里我讲的几个意义如下:
1. 一个端口:所有的读写操作只通过这一个端口。一组读写总线,写的时候不能读,读的时候不能写。
2. 两个端口:写和读分别两个端口,可以同时读和写(一个读,一个写),但是不要读写同一个地址。
3. 并行端口:两个端口分别可以同时读和写,但是也不要读写同一个地址。
我是没有现成的例子给你。但是最简单,有超过两个端口的读写,那么响应的仲裁器是要写的吧。否则不是大家抢了吗?
您好,我设计的RAM是读和写不能同时的,用一个w_r信号控制,为1时写入数据;为0时读出数据。然后还有一个控制信号控制RAM是工作还是处于idle状态的
然后读或者写的话,所输入的八个地址都是不一样的。
我怎么觉得好像没冲突啊,请问还需要响应仲裁器吗?或许是我没考虑全面。如果方便我可以把代码给您看看,看有什么我没考虑到的。
非常感谢!
你的代码我看了,觉得你有一个误区。verilog的写法和综合后的东西你不明确。
不是左右的 mem[addr] <= write_data。这句话都被综合成RAM的,实际上,如果你让ISE综合或者DC直接综合这一段,那么它是一堆的flop,也就是寄存器。所以你写的这段代码不是RAM,而是寄存器组,或者叫寄存器阵列。
您第一句话真是一针见血。我确实是不明确verilog的写法和综合后的东西,呵呵
如果您有时间,希望能收到您关于这个RAM到底怎么写的建议。我自己会在网上再找找看。
非常感谢您的指正!
ISE里边有verilog写的各种模块的模板,就有block RAM写法的模块,LZ可以找找
