VHDL 中的动态数组大小
Dynamic Arrray Size in VHDL
我想使用数组的动态范围,因此使用 "N" 将传入的矢量信号转换为整数。使用特定的传入端口 "Size" 给我一个错误,而固定向量产生完美的输出。
architecture EXAMPLE of Computation is
signal size :std_logic_vector (7 downto 0);
process (ACLK, SLAVE_ARESETN) is
variable N: integer:=conv_integer ("00000111") ; ---WORKING
--variable N: integer:=conv_integer (size) ; -- Not working
type memory is array (N downto 0 ) of std_logic_vector (31 downto 0 );
variable RAM :memory;
进行此类编码的唯一原因是尽可能多地向 FPGA 发送数据。因为我需要在 vivado 中通过 DMA 将数据从 DDR 发送到自定义 IP,可能超过 100 MB。如果我试图以上述错误的方式实施,请指导我。
我相信您在进程中只能有一个通用的数组约束。否则编译器无法细化
在函数或过程中,您可以拥有真正可变的数组边界。
你不能在 VHDL 中这样做。您的代码会生成什么样的硬件?你不知道,合成器也不会。
做这种事情的方法是把N
设置成你想支持的最大值,在你的逻辑中使用size
来适当地控制你的逻辑。在没有更多信息的情况下很难提供更多指示,但作为示例,您可以使用计数器来寻址您的 ram,并在它大于 size
.
时将其重置
更新
这是一个反例。您必须确保 size
在运行时不会发生变化,否则会陷入未知状态。真正的设计应该具有重置状态以确保正确的行为。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity example is
port (
clk : std_logic;
rst : in std_logic;
size : in unsigned(7 downto 0);
wr : in std_logic;
din : in std_logic_vector(31 downto 0)
);
end entity;
architecture rtl of example is
signal counter : unsigned(7 downto 0);
type ram_t is array(0 to 255) of std_logic_vector(31 downto 0);
signal ram : ram_t;
begin
RAM_WR: process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
counter <= (others => '0');
else
if wr = '1' then
ram(to_integer(counter)) <= din;
if counter = size then
counter <= (others => '0');
else
counter <= counter + 1;
end if;
end if;
end if;
end if;
end process RAM_WR;
end architecture rtl;
我想使用数组的动态范围,因此使用 "N" 将传入的矢量信号转换为整数。使用特定的传入端口 "Size" 给我一个错误,而固定向量产生完美的输出。
architecture EXAMPLE of Computation is
signal size :std_logic_vector (7 downto 0);
process (ACLK, SLAVE_ARESETN) is
variable N: integer:=conv_integer ("00000111") ; ---WORKING
--variable N: integer:=conv_integer (size) ; -- Not working
type memory is array (N downto 0 ) of std_logic_vector (31 downto 0 );
variable RAM :memory;
进行此类编码的唯一原因是尽可能多地向 FPGA 发送数据。因为我需要在 vivado 中通过 DMA 将数据从 DDR 发送到自定义 IP,可能超过 100 MB。如果我试图以上述错误的方式实施,请指导我。
我相信您在进程中只能有一个通用的数组约束。否则编译器无法细化
在函数或过程中,您可以拥有真正可变的数组边界。
你不能在 VHDL 中这样做。您的代码会生成什么样的硬件?你不知道,合成器也不会。
做这种事情的方法是把N
设置成你想支持的最大值,在你的逻辑中使用size
来适当地控制你的逻辑。在没有更多信息的情况下很难提供更多指示,但作为示例,您可以使用计数器来寻址您的 ram,并在它大于 size
.
更新
这是一个反例。您必须确保 size
在运行时不会发生变化,否则会陷入未知状态。真正的设计应该具有重置状态以确保正确的行为。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity example is
port (
clk : std_logic;
rst : in std_logic;
size : in unsigned(7 downto 0);
wr : in std_logic;
din : in std_logic_vector(31 downto 0)
);
end entity;
architecture rtl of example is
signal counter : unsigned(7 downto 0);
type ram_t is array(0 to 255) of std_logic_vector(31 downto 0);
signal ram : ram_t;
begin
RAM_WR: process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
counter <= (others => '0');
else
if wr = '1' then
ram(to_integer(counter)) <= din;
if counter = size then
counter <= (others => '0');
else
counter <= counter + 1;
end if;
end if;
end if;
end if;
end process RAM_WR;
end architecture rtl;