0

我想使用数组的动态范围,因此使用“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。如果我试图以上述错误的方式实施,请指导我。

4

2 回答 2

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;
于 2015-05-25T05:25:03.230 回答
0

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

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

于 2015-05-25T04:53:52.890 回答