VHDL-矢量切片

时间:2014-04-24 18:50:06

标签: vhdl

我输入了(0到X)的std_logic_vector。 x的范围是0到1000字节,代码应该支持X的任何值。 我想将输入切片为128位块,以便进一步处理和操作。 a)怎么办? b)有没有办法使下面的伪代码工作?所以我可以采用它来解决a)? 我需要使用循环索引来命名信号,但我想用VHDL(?)

是不可能的
for i in 0 to N loop

  block_i <= input (X, X-127);

end loop; 

提前致谢。

3 个答案:

答案 0 :(得分:1)

这样的东西?

library ieee;
use ieee.std_logic_1164.all;

entity slicer is
  generic(X : natural:=1000);
  port (input : in std_logic_vector(X*128-1 downto 0));
end entity;

architecture rtl of slicer is
  type block_type is array(0 to X-1) of std_logic_vector(127 downto 0);
  signal blocks : block_type;
begin

slicing:for i in 0 to X-1 generate
            blocks(i) <= input(128*(i+1)-1 downto 128*i);
        end generate;

end rtl;

答案 1 :(得分:1)

您可以选择如何完成此操作。一种是使用由@JCLL演示的有选择性切片的扁平1-D阵列。另一个选择是创建一个数组数组的新类型。

subtype word is std_logic_vector(127 downto 0); -- Constrained subtype
type word_vec is array(natural range <>) of word; -- New unconstrained type
...

entity foo is
    port (
        X : in word_vec -- Get our constraint when instantiated
    );
end entity;

...

for i in X'range loop
    blocks(i) <= X(i);
end loop;

该解决方案省略了1-D切片所需的算法,但受到word_vec元素的约束类型的限制。最后一个限制在VHDL-2008中取消,您可以执行以下操作:

-- Both unconstrained arrays
type word_vec is array(natural range <>) of std_logic_vector;

最佳解决方案取决于您的任务是什么以及未来尺寸变化所需的灵活性。

最后不太吸引人的选择是使用2-D数组,但是当你需要多个按位访问时,它会变得很难看。

答案 2 :(得分:0)

是的,您可以将大型逻辑矢量的一部分分配给另一个较小的矢量。我不确定你的具体实现(你没有提供信号类型和大小 - 是大矢量1000字节还是1000位?)。但是,如果您在合成时知道X是什么,请使用泛型,例如

entity foo is
    generic(X : Natural);
    port(input: in std_logic_vector(X-1 downto 0); 
         block_i: out std_logic_vector(127 downto 0));

end entity; 

否则你只需传递一个大小:

entity foo is
    port(input: in std_logic_vector(X-1 downto 0);
         block_i: out std_logic_vector(127 downto 0);
         X    : in Natural);
    end entity;

然后在为block_i分配零件时使用尺寸。

请注意,您需要为循环使用泛型或硬编码常量(即:更糟糕的情况下为1000)。 VHDL不喜欢可变循环范围。你可以解决这个问题,但我通常不需要(参见:Using FOR loop in VHDL with a variable