不同类型的 VHDL 数组串联
VHDL array concatenation of varying types
我正在做一些涉及 VHDL 编码的本科生研究,我几乎没有这方面的经验。我 运行 遇到了一些问题,希望得到一些帮助:
我需要读入一个信号("std_logic_vectors" 的数组),并对其执行逻辑移位。我的想法是将一个 0 数组与一个包含输入相关部分的数组连接起来。这是我所做的:
Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.SignalGen.all;
entity Shifter is
Port ( xsig_in : in SignalGen;
shift : in integer;
clk : in STD_LOGIC;
x_out1 : out SignalGen;
x_out2 : out SignalGen);
end Shifter;
architecture Behavioral of Shifter is
type x_in_type is array (0 to (1024-shift) of std_logic_vector;
type zeroes_type is array(0 to shift) of std_logic_vector;
signal x_shifted: SignalGen;
signal x_in : x_in_type := xsig_in(1024 downto shift); -- This is line 37
signal zeroes : zeroes_type := (others => (others => '0'));
begin
process(clk)
begin
x_shifted <= zeroes & x_in; -- This is line 49
end process;
end Behavioral;
了解 SignalGen 是什么类型很重要,所以这是我的声明:
type SignalGen is array (0 to 1024) of STD_LOGIC_VECTOR(15 downto 0);
如您所见,我创建了一个类型 "zeroes_type",它是所需班次的长度。它用于生成一个用零填充的信号 "zeroes"。另外x_in的类型是x_in_type,是输入信号的长度减去移位量,初始化为信号减去移出的值。
当我尝试将它们连接在一起时,出现以下错误:
Line 37: Indexed name is not a x_in_type
Line 49: found '0' definitions of operator "&", cannot determine exact overloaded matching definition for "&"
行号包含在代码发布的注释中。几个小时以来,我一直在修补这个片段,但我尝试做的任何事情都无法修复它。
如果有人能阐明这件事,或者给我一个更好的方法来做我想做的事情,我将非常感激!谢谢!
我认为你离你需要去的地方还有很长的路要走。就面积而言,这不是一个有效的实现:您将拥有 16,000 多个触发器。但是,此解决方案应该更接近您需要的位置:
Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.SignalGen.ALL;
entity Shifter is
Port ( xsig_in : in SignalGen;
shift : in integer;
clk : in STD_LOGIC;
x_out1 : out SignalGen;
x_out2 : out SignalGen);
end Shifter;
architecture Behavioral of Shifter is
begin
process(clk)
variable V : SignalGen;
begin
if rising_edge(clk) then
V := xsig_in;
for I in 1 to xsig_in'RIGHT loop
if I <= shift then
V := "0000000000000000" & V(0 to xsig_in'RIGHT-1);
end if;
end loop;
x_out1 <= V;
end if;
end process;
end Behavioral;
http://www.edaplayground.com/x/8AQ
正如您在我的示例中看到的那样,变量、循环和串联在进行移位时通常很有用。当你完成转换时,你可以跳出循环(使用 exit
),但根据我的经验,你这样做可能会有更多的逻辑,即:
if I <= shift then
V := "0000000000000000" & V(0 to xsig_in'RIGHT-1);
else
exit;
end if;
您的代码中有很多错误。同时,我相信只要发布答案,您就会从我这里学到一些东西,这里有一些关于您所看到的错误的解释:
type x_in_type is array (0 to (1024-shift)) of std_logic_vector;
您缺少右手括号,此行依赖于您使用 VHDL 2008,因为内部维度不受约束。但即便如此,您仍然无法基于非静态量 (shift
) 定义类型。
signal x_in : x_in_type := xsig_in(1024 downto shift);
你的数组按原样受到约束,你需要跳过外部维度来约束内部维度。在 VHDL 2008 中,您可以跳过这样的约束维度:
signal x_in : x_in_type := xsig_in(open)(1024 downto shift);
我正在做一些涉及 VHDL 编码的本科生研究,我几乎没有这方面的经验。我 运行 遇到了一些问题,希望得到一些帮助:
我需要读入一个信号("std_logic_vectors" 的数组),并对其执行逻辑移位。我的想法是将一个 0 数组与一个包含输入相关部分的数组连接起来。这是我所做的:
Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.SignalGen.all;
entity Shifter is
Port ( xsig_in : in SignalGen;
shift : in integer;
clk : in STD_LOGIC;
x_out1 : out SignalGen;
x_out2 : out SignalGen);
end Shifter;
architecture Behavioral of Shifter is
type x_in_type is array (0 to (1024-shift) of std_logic_vector;
type zeroes_type is array(0 to shift) of std_logic_vector;
signal x_shifted: SignalGen;
signal x_in : x_in_type := xsig_in(1024 downto shift); -- This is line 37
signal zeroes : zeroes_type := (others => (others => '0'));
begin
process(clk)
begin
x_shifted <= zeroes & x_in; -- This is line 49
end process;
end Behavioral;
了解 SignalGen 是什么类型很重要,所以这是我的声明:
type SignalGen is array (0 to 1024) of STD_LOGIC_VECTOR(15 downto 0);
如您所见,我创建了一个类型 "zeroes_type",它是所需班次的长度。它用于生成一个用零填充的信号 "zeroes"。另外x_in的类型是x_in_type,是输入信号的长度减去移位量,初始化为信号减去移出的值。
当我尝试将它们连接在一起时,出现以下错误:
Line 37: Indexed name is not a x_in_type
Line 49: found '0' definitions of operator "&", cannot determine exact overloaded matching definition for "&"
行号包含在代码发布的注释中。几个小时以来,我一直在修补这个片段,但我尝试做的任何事情都无法修复它。
如果有人能阐明这件事,或者给我一个更好的方法来做我想做的事情,我将非常感激!谢谢!
我认为你离你需要去的地方还有很长的路要走。就面积而言,这不是一个有效的实现:您将拥有 16,000 多个触发器。但是,此解决方案应该更接近您需要的位置:
Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.SignalGen.ALL;
entity Shifter is
Port ( xsig_in : in SignalGen;
shift : in integer;
clk : in STD_LOGIC;
x_out1 : out SignalGen;
x_out2 : out SignalGen);
end Shifter;
architecture Behavioral of Shifter is
begin
process(clk)
variable V : SignalGen;
begin
if rising_edge(clk) then
V := xsig_in;
for I in 1 to xsig_in'RIGHT loop
if I <= shift then
V := "0000000000000000" & V(0 to xsig_in'RIGHT-1);
end if;
end loop;
x_out1 <= V;
end if;
end process;
end Behavioral;
http://www.edaplayground.com/x/8AQ
正如您在我的示例中看到的那样,变量、循环和串联在进行移位时通常很有用。当你完成转换时,你可以跳出循环(使用 exit
),但根据我的经验,你这样做可能会有更多的逻辑,即:
if I <= shift then
V := "0000000000000000" & V(0 to xsig_in'RIGHT-1);
else
exit;
end if;
您的代码中有很多错误。同时,我相信只要发布答案,您就会从我这里学到一些东西,这里有一些关于您所看到的错误的解释:
type x_in_type is array (0 to (1024-shift)) of std_logic_vector;
您缺少右手括号,此行依赖于您使用 VHDL 2008,因为内部维度不受约束。但即便如此,您仍然无法基于非静态量 (shift
) 定义类型。
signal x_in : x_in_type := xsig_in(1024 downto shift);
你的数组按原样受到约束,你需要跳过外部维度来约束内部维度。在 VHDL 2008 中,您可以跳过这样的约束维度:
signal x_in : x_in_type := xsig_in(open)(1024 downto shift);