【问题标题】:FPGA Ram design issueFPGA Ram设计问题
【发布时间】:2014-01-30 01:50:58
【问题描述】:
attribute ram_style: string;
attribute ram_style of ram : signal is "distributed";

type dist_ram is array (0 to 99) of std_logic_vector(7 downto 0);
signal ram : dist_ram := (others => (others => '0'));

begin

--Pseudocode 
PROCESS(Clk)
BEGIN
    if(rising_edge(Clk)) then
            ram(0) <= "0";
            ram(2) <= "1";
            ram(3) <= "2";
            ram(4) <= "3";
            ram(5) <= "1";
            ram(6) <= "2";
    ...
    ...
        ram(99) <= "3";
    end if; 
END PROCESS;

在上述场景中,完整的 ram 在 1 个时钟周期内更新,但是如果我使用 Block ram,我将需要至少 100 个时钟周期来更新整个内存,而不是用作 1 个时钟周期分布式内存。

我也明白不建议将分布式内存用于大型 内存,因为它会占用 FPGA 资源。 那么,为了实现最佳吞吐量,这种情况下的最佳设计是什么(比如几 KB 内存)。

假设 Xilinx FPGA,我应该使用块 ram 还是分布式 ram。非常感谢您的建议。

谢谢你的回复,让我说得更清楚一点。 我的目的不是为了 ram 初始化, 我有 100 x 20(8 位)内存块,需要在之后更新 一定的计算。 在这些计算之后,我必须存储然后将其用于下一次迭代。 这是一个迭代过程,预计我将完成至少 2 次迭代 在 3000 个时钟周期内。 如果我使用块 ram 来存储这些系数,那么只需读写 我需要至少(100 * 20)个周期和一些延迟,这不符合我的要求 要求。 那么在这种情况下我应该如何进行设计。

【问题讨论】:

    标签: vhdl fpga xilinx


    【解决方案1】:

    你想达到什么目的?您真的需要在 1 个时钟周期内更新整个 RAM,还是可以将其分成多个时钟周期?

    如果你可以把它分成许多时钟,你可以这样做:

    PROCESS(Clk)
    BEGIN
      if(rising_edge(Clk)) then
        ram(index) <= index;
        index <= index + 1;
      end if; 
    END PROCESS;
    

    您也可以初始化块内存。具体情况取决于您的 FPGA 供应商。因此,对于 Xilinx FPGA,请查看这篇文章:

    http://www.xilinx.com/itp/xilinx10/isehelp/pce_p_initialize_blockram.htm

    如果你真的不能把它分成多个时钟并且你想多次“初始化”它,那么你将需要像上面那样使用分布式内存。

    【讨论】:

    • 确实如此。普通的“大容量”内存技术不是为大规模并行计算而设计的,而只是为顺序访问而设计的。如果发布者想尝试混合计算和存储以进行大规模并行操作,那么 FPGA 分布式存储在有限的通用方式中可能还不错……至少它比 ASIC 便宜。
    • 我刚刚想到的另一件事是您可以并行使用多个块 RAM 来实现您的目标。
    • 除非有理由需要许多顺序更新的并行更新组,否则使用分布式 RAM 会更好。与可以支持 100 个分布式字节宽 RAM 单元或与简单逻辑混合的寄存器的 FPGA 相比,具有 100 个块 RAM 的 FPGA(如果您在 32 位模式下使用 4 个字节宽,甚至 25 个)将非常昂贵 - 甚至目前最便宜的 FPGA 可能可以做到这一点。
    • @powernest:解决方案应该由目的驱动,我假设分配是用于初始化(init)。由于分布式 RAM 对资源的要求最高,因此只有在需要单周期初始化时才应使用它。如果多次需要 init,那么您可以像 Russell 建议的那样制作一个 init 电路,但如果只在上电时完成,则使用 RAM init 并保存 init 电路。 => 顺便说一句。如果有任何答案有用,您应该考虑将之前问题中的一些答案标记为“已接受”,因为这是有价值答案的一个很好的指示。
    • 您能告诉我们更多关于您的最终目标是什么吗?正如@MortenZdk 指出的那样,如果您仅在初始化时需要所有这些分配,则可以使用块 RAM 来解决它。但是如果你想在每个周期更新整个 RAM,你的输入数据来自哪里,它是用来做什么的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多