VHDL-矢量切片

VHDL-矢量切片,vhdl,Vhdl,我输入了(0到X)的标准逻辑向量。 x的范围是0到1000字节,代码应该支持x的任何值。 我想将输入分为128位块,以便进一步处理和操作。 a) 怎样才能做到呢? b) 有没有办法让下面的伪代码正常工作?所以我可以用它来解决问题? 我需要使用循环索引来命名信号,但我想用VHDL(?)是不可能的 0到N循环中的i的 像这样的东西 library ieee; use ieee.std_logic_1164.all; entity slicer is generic(X : natural:=1

我输入了(0到X)的标准逻辑向量。 x的范围是0到1000字节,代码应该支持x的任何值。 我想将输入分为128位块,以便进一步处理和操作。 a) 怎样才能做到呢? b) 有没有办法让下面的伪代码正常工作?所以我可以用它来解决问题? 我需要使用循环索引来命名信号,但我想用VHDL(?)是不可能的

0到N循环中的i的

像这样的东西

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;
ieee库;
使用ieee.std_logic_1164.all;
实体切片器是
通用(X:自然值=1000);
端口(输入:标准逻辑向量(X*128-1向下至0));
终端实体;
切片器的rtl体系结构是
类型block_type是标准逻辑_向量(127到0)的数组(0到X-1);
信号块:块_型;
开始
切片:为0到X-1中的i生成

块(i)是的,您可以将一个大逻辑向量的部分分配给另一个较小的向量。我不确定您的具体实现(您没有提供信号类型和大小——大向量是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;
然后在将零件指定给块i时使用尺寸


请注意,对于循环,您需要使用通用常量或硬编码常量(即:1000表示更坏的情况)。VHDL不喜欢可变循环范围。您可以解决这个问题,但我通常不需要(请参阅:)

您有几个选项可以完成此任务。一种是使用平坦的一维数组,该数组被选择性地切片,如@JCLL所示。另一个选项是创建一个新类型,即数组的数组

子类型字是标准逻辑向量(127到0);--约束子类型
type word_vec是单词的数组(自然范围);——新的无约束类型
...
实体foo是
港口(
X:在word_vec中——实例化时获取我们的约束
);
终端实体;
...
对于X'range循环中的i

块(i)1000字节不被128位平均除真。在代码的另一部分中,我已经修复了这个问题。我已经控制了这个“不可平均分割”的问题!为了简单起见,想象一下可以被128平均除的数字。这有点让人困惑,正如在问题中,
X
是输入的上限,而不是输入本身的名称。因此,我认为块数组范围和循环范围应该是0到X/128-1。在我的解决方案中,X只是128位块的数量。非常感谢,我非常感谢您的帮助。你的回答很有帮助,不客气。作为一个新用户,请验证我的答案,如果它是你喜欢的。这就是堆栈溢出的游戏规则!非常感谢您提供的有用信息,我使用了@JCLL的方法,但我将其与您在回答中提到的“无约束新类型”结合起来。
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;