【问题标题】:Is the below VHDL code considered as BRAM or LUT in my FPGA board?以下 VHDL 代码在我的 FPGA 板中是否被视为 BRAM 或 LUT?
【发布时间】:2023-01-07 09:47:29
【问题描述】:

我已经编写了一个 vhdl 代码来将数据存储在 BRAM 中。该内存组件有时会从文本文件中导入数据并将其写入 BRAM,然后在必要时使用 read_address 读取。在其他情况下,我将使用 write_add(来自前一个组件的数据)将数据存储到 BRAM,并在 2 或 3 个周期后,我将开始读取(但 write_add 和 read_add 将不同)下一个组件。

我的问题是,在我的 ZYBO Z20 FPGA 板中,以下 vhdl 代码是否被视为 BRAM 或 LUT?因为,我使用了这个内存组件的近 60-100 倍(每个数据宽度 32 位和深度数据变化 784,30 和 10 取决于)。模拟后,实施给出了错误,即 LUT 的使用量超过了可用量。

请查看下面的代码,以及如果我多次使用相同的组件,它在实现中是如何处理的。


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use ieee.math_real.all;
use IEEE.std_logic_signed.all;
use work.fixed_pkg.all;
use std.textio.all;


entity weight_memory is
    generic (
        numWeight  : integer :=3 ;
        neuronNo : integer :=5  ;
        layerNo  : integer :=1;
        addressWidth : integer:=10 ;
        dataWidth : integer:=16; 
         weightFile: string := "");
    Port ( 
        clk, wen, ren : in std_logic ;
        wadd, radd : in std_logic_vector(addressWidth-1 downto 0);
        win : in std_logic_vector(dataWidth-1 downto 0);
        wout : out std_logic_vector(dataWidth-1 downto 0)
            );
end weight_memory;

architecture Behavioral of weight_memory is
type mem is array(0 to numWeight-1) of bit_vector(dataWidth-1 downto 0);
    impure function InitRamFromFile (RamFileName : in string) return mem is
    FILE RamFile : text is in RamFileName;
    variable RamFileLine : line;
        variable RAM : mem;
     begin
        for I in mem'range loop
            readline (RamFile, RamFileLine);
            read (RamFileLine, RAM(I));
        end loop;
    return RAM;
     end function;
    signal weightmem : mem := InitRamFromFile(weightFile);
begin
    
process(clk)

begin

    if clk'event and clk = '1' then
       if wen = '1' then
         weightmem(to_integer(unsigned(wadd))) <= to_bitvector(win);
        end if;
     end if;

end process;
    
process(clk)

begin

    if clk'event and clk = '1' then
       if ren = '1' then
        wout <= to_stdlogicvector(weightmem(to_integer(unsigned(radd))));
       end if;
    end if;
end process;
    
end Behavioral;

【问题讨论】:

  • 综合报告告诉你。实例化一次或两次,看看报告的使用部分有什么变化。请注意,您可能需要注册地址​​或输出或两者以进行综合以映射到 BRAM 而不是 LUT; BRAM 通常实现为同步 RAM。
  • 你的第二段不清楚。你是说ZYBO Z7-20吗?什么FPGA设备?和深度数据变化 784,30 和 10 取决于不清楚。在消耗完所有可用的 BRAM 后,Vivado 将消耗 LUT 资源。您有三个 use 子句,其声明未在所示设计说明中引用。所示内存符合 UG901 第 4 章:HDL 编码技术简单双端口块 RAM 与单时钟 (VHDL)。
  • 是的,它的 ZYBO Z7-20 FPGA 板。
  • 上面的代码,我正在使用的是我在完全连接的神经网络中的项目。有层,第一层有30个神经元,每个神经元有784个32位宽的数据。同样,第二层有 30 个神经元,每个神经元有 30 个 32 位宽的数据。继续下一层,有 10 个神经元和 10 个数据。
  • XC7Z020-1CLG400C PL 中有 49 Mb 的块存储器,由 (140) 个 36 Kb BRAM 组成。

标签: memory vhdl fpga ram vivado


【解决方案1】:

内存模型将综合为 bram 而不是寄存器,因为您没有使用重置。使用复位将导致存储器由寄存器/FF 组成,因为 BRAM 硬件没有复位引脚。

查看用于推断存储器的 VHDL 和 Verilog 编码模板的 Vivado 综合指南。特别是“RAM HDL 编码指南”部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多