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;