我想使用动态范围的数组,所以使用" 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。如果我试图以错误的方式实施,请如此善意地指导我。
答案 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)
我相信你只能在一个进程中拥有一个通用的数组约束。否则,编译器无法详细说明。
在函数或过程中,您可以拥有真正可变的数组边界。