我是靠谱客的博主 美好哑铃,最近开发中收集的这篇文章主要介绍如何用 verilog 综合出 RAM 和 ROM,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如何用 verilog 综合出 RAM 和 ROM (使用 Block RAM)

  (2006-07-28 10:41:20)
转载
  分类: verilog

之前看过一个 xilinx 的分析报告,说最早的 FPGA 主要用作逻辑接口,后来集成度高了,逐渐开始被用来做 DSP。作逻辑接口的时候,对 RAM 或者 ROM 的需求不明显,所以就用多个逻辑单元的寄存器,组合成分布式的存储,这样做既浪费了逻辑单元,而且拼凑出来的存储器的速度也很低。所以当有需求拿 FPGA 做 DSP 开始,FPGA 就开始集成专用 RAM 了。

我开始用的第一块 FPGA 是 altera 的 Max10K10, 已经集成了三块专用 RAM,每块 256 bytes。当时用 schematic 的方式输入,拿一块做了 51 core 的 register file。

在设计中引入专用 RAM,面临的问题包括:

  1. 如何写可综合代码
  2. 如果是 ROM,如何初始化内存单元的值
  3. 如何参与仿真
可综合出 RAM 或 ROM 的代码

按照 xilinx 和 synplify 的说法,异口同声要求实例化 Block RAM。这样做好处是效率高,可以肯定综合结果是什么。坏处当然是没有移植性,拿到 altera 就玩不转。所以 xilinx 网站上只有这一种方式。搁着 synplify 这么好的综合工具,不让它去自动综合也对不起它啊。

综合 RAM 比较简单:
reg [width-1:0] ram [length-1:0];
这样就 ok。前提是 length 要足够长,如果只有很少的单元,它还是会综合到逻辑单元里头。如果希望让 synplify 更智能一点,就加上指示:
 
手册里面还有更多的细节。
初始化ROM

把 $readmem 放在 initial 里面可以初始化 RAM,不过这仅限于仿真。synplify 根本就 ignore initial,所以综合器还都不支持用 $readmem 初始化存储器。synplify 提供更聪明的办法综合 ROM。写法如下:

reg [7:0] data_out ;
always @(posedge clk)
  if (en)
    case (address)
      8'd0 : data_out = 8'd101;
      8'd1 : data_out = 8'd251;
      8'd2 : data_out = 8'd112;


如果综合成功,会提示:
Packed ROM ... to Block SelectRAM
综合的结果 Technology View 截到下图,点击查看完整图:

以上的方法综合的结果可以直接支持仿真。如何用 <wbr>verilog <wbr>综合出 <wbr>RAM <wbr>和 <wbr>ROM <wbr>(使用 <wbr>Block <wbr>RAM)

 

最后

以上就是美好哑铃为你收集整理的如何用 verilog 综合出 RAM 和 ROM的全部内容,希望文章能够帮你解决如何用 verilog 综合出 RAM 和 ROM所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部