【发布时间】: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