原创 存储器实现方式转换

2010-10-12 20:32 4095 8 13 分类: FPGA/CPLD

存储器实现方式转换


         最近在搭建一个系统中遇到了一些问题,使用的FPGA器件逻辑资源很充足,而内嵌存储器资源却相当紧张。因此在优化内部RAM使用率时,正如《榨干FPGA偏上存储资源》(http://blog.ednchina.com/ilove314/1811482/message.aspx)一文所分析的,发现了有些存储器的利用率相当低。如果是自己例化的RAM/ROM/FIFO一般配置时会出现“What should the memory block type be?”相应选项,可以是Auto也可以是M?K(如M4K,M9K等)。就拿FIFO来说,如图1所示,有这样的选项。



dfbebf86-6491-4f54-8c51-aac0e2420050.jpg


图1


         其实如果仅仅停留于此,会让人觉得altera很欠扁。选择Auto和M?K有区别吗?99%的时候需要我们去例化的片内存储器type会被编译为M?K,而不可能是Auto的另一个选项:LEs。那么首先我们会问:Auto到底是如何Auto的?有什么基准?其次我们可能还要问:既然出现了M?K的选项,它是Auto可能实现的一种方式,那么当我们要使用Auto可能的另一种方式即逻辑资源来构建存储器的时候,没有选项,我们又该怎么办?


         如图2所示,特权同学的系统中,在查看综合报告里RAM Summary时,发现了一些只有1024bit存储量却占用一整个M9K的情况。不到1/8的利用率,如果逻辑资源充足,存储资源紧张的时候,这是无论如何不可以容忍的,特权同学就处在这种尴尬境地之中。因此,上文提到的问题势必要打破沙锅问到底了。



2ec5275d-66cc-4e59-8ee7-14c56f7a799e.JPG


图2


        说白了,就是要用逻辑资源换存储资源。特权同学在遇到此种情况时,会想当然的认为有两种解决办法:其一是实践——到相关存储器配置的页面海找设置选项,也许会发现设置存储器实现type的选项;其二是理论——还是要海找,用关键词去搜handbook,也许能够找到解决方案。


         在Handbook中找到一个RAM to Logic Cell Conversion的选项设置。Handbook中对RAM to Logic Cell Conversion(不用急,下面再说它是干什么用的,不妨先理解一下对它的介绍)的说明如下:


The Auto RAM to Logic Cell Conversion option allows the Quartus II integrated synthesis to convert RAM blocks that are small in size to logic cells if the logic cell implementation is deemed to give better quality of results. Only single-port or simple-dual port RAMs with no initialization files can be converted to logic cells. This option is off by default. You can set this option globally or apply it to individual RAM nodes.


For FLEX 10K, APEX, Arria GX, and the Stratix series of devices, the software uses the following rules to determine whether a RAM should be placed in logic cells or a dedicated RAM block:


■ If the number of words is less than 16, use a RAM block if the total number of bits is greater than or equal to 64.


■ If the number of words is greater than or equal to 16, use a RAM block if the total number of bits is greater than or equal to 32.


■ Otherwise, implement the RAM in logic cells.


For the Cyclone series of devices, the software uses the following rules:


■ If the number of words is greater than or equal to 64, use a RAM block.


■ If the number of words is greater than or equal to 16 and less than 64,use a RAM block if the total number of bits is greater than or equal to 128.


■ Otherwise, implement the RAM in logic cells.


        看完这些单词,其实两个问题我们都解决了。当然如果你对软件不够熟悉,对这段介绍所处的背景不够熟悉,那么也许你只明白了第一个问题。那么我们在唠叨下第一个问题怎么回事。它说到了Cyclone系列(我想也应该包括了Cyclone II/III)的Auto规则是判断存储量若大等于64个words则使用RAM块,若大等于16个且小于64个words时总bits数大等于128则使用RAM块,其它时候使用逻辑资源实现。


        好,下面我们来解决第二个问题,做RAM to Logic Cell Conversion约束。在做这个约束之前,其实是有一些限制的,并不是所有的存储器都可以随意的实现用逻辑资源代替RAM块。


        首先,在Fitter后,只有single-port 或 simple-dual port RAMs并且没有被初始化的存储器才可以实现RAM to Logic Cell Conversion约束。看到这句话的时候特权同学比较伤心,因为回头看看自己期望优化的占用率低的存储器居然恰好没有满足条件。其次,这个功能有一个大大的背景,特权同学绕了好久也试了好久才发现,作为读者肯定是幸运的,不用再绕了,且听特权同学分解。


        这个功能其实对于在Megawizard中例化的存储器是不太适用的,或者确切的说转换的对象不是针对这类存储器。它是针对设计者代码写出来的一些比较大的寄存器(或相关存储器)而言的,在开启该选项后,设计者代码所用到的这些寄存器就会遵循上文所述的规则来决定是用逻辑资源实现还是嵌入式存储器实现。


        通常我们可以通过Fitter报告里的RAM Summary来了解设计实现的存储器情况。如图3所示,这里我们看到Location选项里罗列出了每个存储器所使用的具体的M9K块名称。



fae0c756-f5a8-4ee1-93ba-487f05d8b5f8.JPG


图3


         如果用前面说到的代码综合成的嵌入式存储块占用的情况,那么可以右击相应的存储器名称,然后选择LocationàLocation In Assignment Edit。进入如图4所示的Assignment约束窗口中,Assignment Name一栏选择Auto RAM to Logic Cell Conversion.



bb6003d7-e04a-459e-ae47-26d72554a09e.jpg


图4


         保存设置后,重新Fitter。Fitter完毕,首先我们会发现资源占用率提高了,多使用了一些LEs。其次,再看Fitter报告里的RAM Summary时,之前被约束的存储器不见了。当然了,这些可能情况必须是在我们所约束的存储器满足特定条件的情况下。


除此以外,关于内部代码综合成片内存储器的相关选项还有Auto ROM Replacement、Auto RAM Replacement等,在RAM Style and ROM Style—for Inferred Memory一小节中也介绍了使用代码注释的方式来强制约束综合的结果。感兴趣的朋友也可以自己到Handbook中搜索一下。


         回到Megawizard中例化的存储器上来,如果非要它们也完全使用逻辑资源实现也还是有办法的。答案和特权同学一开始推测的一样。还是拿FIFO来说,如图5所示的配置页面中,勾选上“Implement FIFO storage with logic cells only, even……”即可。



e56a1bb3-ec12-4a21-a444-d4c920a2f48a.JPG


图5


         到底是使用逻辑资源实现还是嵌入式存储块实现其实本不存在问题,开发工具其实都在做一些很智能的选择和配置。但是在特定的应用场合中,难免会有一些特殊的用法牵涉其中在,这时候就要有一些特殊的方式来重新改变工具默认的处理方法。


 


 

文章评论5条评论)

登录后参与讨论

ilove314_323192455 2010-10-15 17:25

需不需要FIFO要看你的数据流形式,如果数据频率较大超过外部双口RAM的读写频率,那么FIFO是需要的,开多大也是根据他们直接的频率差别来考虑。没有觉得的答案,根据系统需要考虑

用户1409300 2010-10-15 12:39

你好,想请教一个问题,就是我AD转换的数据要存到外部双口RAM中,一定要经过一个内部FIFO缓存才可以存到外部RAM吗,不可以直接就存吗?另外,我那外部RAM范围是256KB,那么在设计一个FIFO时要求的FIFO空间是多少呢,有那些要求呢?还有如果我想把外部RAM的数据通过PCI接口转上PC机,数据也必须经过一个FIFO吗?谢谢!!!! 另外,有没有一些相关的资料可以推荐我看看的呢,有的话可以发到我邮箱吗,谢谢!!! xixizhouxixi@163.com

ilove314_323192455 2010-10-15 08:13

浮点数的存储本质上和整型数是一样的,你只要把他们放大缩小看就行了

用户142112 2010-10-14 23:04

一般项目里会把可能用到的RAM,FIFO或者ROM之类的预先定义好,放在库里,而且定义好的存储器的名字后会加上后缀BRAM或是DRAM,来表示是块存储器或者是分布式的存储器,这样在使用的时候,各个模块使用多少,使用那种类型的存储器会有一个分配,利于掌握资源的分配。

用户1083553 2010-10-14 15:05

特权兄,你好!向你请教一个问题,我在用simulink做DSP模型仿真时用到其中的乘法器,假如我指定乘法器的输入为fixed point signed类型,字长16bit,小数部分为14bit,这样MSB为符号位,次高位为整数位,本来两个16位的数相乘最多需要32bit来表示,但是我可能用不到那么高的精度,而且也为了考虑节省资源,我将输出格式设置为Fixed Point signed类型,字长17bit,小数部分仍然为14bit,MSB为符号位,接下来的两位用作整数位。我的问题是:在用FPGA实现这个乘法器的时候,如何去截取乘法器输出位呢?
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
5
8
关闭 站长推荐上一条 /2 下一条