Vhdl:无约束数组和大小实例化
Vhdl: unconstrained arrays and size instaniation
我正在尝试将数组大小(整数 ArraySize)从顶级文件传递到组件,但出现错误:
[Synth 8-561] 范围表达式无法解析为常数 [/UnconArray.vhd":39]
我想知道是否有办法做到这一点。另外,如果非约束数组必须定义为常量,那有什么意义呢?
UnconstrainedTest.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity UnconstrainedTest is
Port ( clk : in std_logic;
reset: in std_logic;
LED0 : out std_logic := '0';
LED1 : out std_logic := '0'
);
end UnconstrainedTest;
architecture Behavioral of UnconstrainedTest is
component UnconArray is
port( clk_1 : in std_logic;
ArraySize : in integer;
LED_0 : out std_logic
);
end component;
begin
A1: UnconArray port map (
clk_1 => clk,
ArraySize => 12,
LED_0 => LED0
);
A2: UnconArray port map (
clk_1 => clk,
ArraySize => 8,
LED_0 => LED1
);
end Behavioral;
组件UnconArray.vhd
begin
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity UnconArray is
-- generic (depth : integer := 2);
Port ( clk_1 : in std_logic;
ArraySize : in integer;
LED_0 : out std_logic
);
end UnconArray;
architecture Behavioral of UnconArray is
type Array_type is array (integer range <>) of integer;
signal MyUnconArray : Array_type (0 to ArraySize);
-- type Array_type is array (0 to ArraySize) of integer;
-- signal MyUnconArray : Array_type;
begin
MyUnconArray <= (1, 2, 3);
process (clk_1)
begin
if rising_edge(clk_1) then
if ( MyUnconArray(0) = 1 )then
LED_0 <= '1';
else
LED_0 <= '0';
end if;
end if;
end process;
end Behavioral;
在用 VHDL 编写实际硬件模型时,您必须为数组使用恒定大小。信号就像电路板上的电线 - 您不能动态添加或删除它们。
如果您想使用此代码,则必须使用泛型(这是一个局部常量)来声明向量的大小。您实际上已经在代码中对此进行了注释,但它应该如下所示:
entity UnconArray is
generic (
depth : integer := 2
);
port (
clk_1 : in std_logic;
LED_0 : out std_logic
);
end UnconArray;
architecture Behavioral of UnconArray is
type Array_type is array (integer range <>) of integer;
signal MyUnconArray : Array_type (0 to depth);
...
然后当你实例化组件时:
A1: UnconArray
generic map (
depth => 2
)
port map (
clk_1 => clk,
LED_0 => LED0
);
但是,如果您不将通用深度设置为 3,您仍然会遇到错误,因为您在分配数据时将其视为固定大小。您也只使用元素 0,因此在综合最小化期间将删除数组的其余部分。
无约束数组的要点是您可以在声明信号时设置它们的大小,这可能会减少您需要声明的类型数量。
例如,假设您想在代码中使用 2 个不同的整数数组,其中包含不同数量的元素。您可以声明 2 个不同大小的约束数组类型或 1 个无约束数组。
我正在尝试将数组大小(整数 ArraySize)从顶级文件传递到组件,但出现错误:
[Synth 8-561] 范围表达式无法解析为常数 [/UnconArray.vhd":39]
我想知道是否有办法做到这一点。另外,如果非约束数组必须定义为常量,那有什么意义呢?
UnconstrainedTest.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity UnconstrainedTest is
Port ( clk : in std_logic;
reset: in std_logic;
LED0 : out std_logic := '0';
LED1 : out std_logic := '0'
);
end UnconstrainedTest;
architecture Behavioral of UnconstrainedTest is
component UnconArray is
port( clk_1 : in std_logic;
ArraySize : in integer;
LED_0 : out std_logic
);
end component;
begin
A1: UnconArray port map (
clk_1 => clk,
ArraySize => 12,
LED_0 => LED0
);
A2: UnconArray port map (
clk_1 => clk,
ArraySize => 8,
LED_0 => LED1
);
end Behavioral;
组件UnconArray.vhd
begin
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity UnconArray is
-- generic (depth : integer := 2);
Port ( clk_1 : in std_logic;
ArraySize : in integer;
LED_0 : out std_logic
);
end UnconArray;
architecture Behavioral of UnconArray is
type Array_type is array (integer range <>) of integer;
signal MyUnconArray : Array_type (0 to ArraySize);
-- type Array_type is array (0 to ArraySize) of integer;
-- signal MyUnconArray : Array_type;
begin
MyUnconArray <= (1, 2, 3);
process (clk_1)
begin
if rising_edge(clk_1) then
if ( MyUnconArray(0) = 1 )then
LED_0 <= '1';
else
LED_0 <= '0';
end if;
end if;
end process;
end Behavioral;
在用 VHDL 编写实际硬件模型时,您必须为数组使用恒定大小。信号就像电路板上的电线 - 您不能动态添加或删除它们。
如果您想使用此代码,则必须使用泛型(这是一个局部常量)来声明向量的大小。您实际上已经在代码中对此进行了注释,但它应该如下所示:
entity UnconArray is
generic (
depth : integer := 2
);
port (
clk_1 : in std_logic;
LED_0 : out std_logic
);
end UnconArray;
architecture Behavioral of UnconArray is
type Array_type is array (integer range <>) of integer;
signal MyUnconArray : Array_type (0 to depth);
...
然后当你实例化组件时:
A1: UnconArray
generic map (
depth => 2
)
port map (
clk_1 => clk,
LED_0 => LED0
);
但是,如果您不将通用深度设置为 3,您仍然会遇到错误,因为您在分配数据时将其视为固定大小。您也只使用元素 0,因此在综合最小化期间将删除数组的其余部分。
无约束数组的要点是您可以在声明信号时设置它们的大小,这可能会减少您需要声明的类型数量。
例如,假设您想在代码中使用 2 个不同的整数数组,其中包含不同数量的元素。您可以声明 2 个不同大小的约束数组类型或 1 个无约束数组。