VHDL中的动态Arrray大小

时间:2015-05-25 04:22:52

标签: vhdl ram xilinx vivado

我想使用动态范围的数组,所以使用" N"用于将输入矢量信号转换为整数。使用特定的传入端口"大小"给我一个错误,而固定矢量产生完美的输出。

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。如果我试图以错误的方式实施,请如此善意地指导我。

2 个答案:

答案 0 :(得分:2)

您无法在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;

答案 1 :(得分:0)

我相信你只能在一个进程中拥有一个通用的数组约束。否则,编译器无法详细说明。

在函数或过程中,您可以拥有真正可变的数组边界。