【问题标题】:VHDL- vector slicingVHDL-向量切片
【发布时间】:2014-06-10 05:41:48
【问题描述】:

我输入了 (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; 

提前致谢。

【问题讨论】:

  • 1000字节不均匀除以128位
  • 是的。在我的代码的另一部分,我已经解决了这个问题。我已经控制了这个“不可均分”的问题!为简单起见,想象一下可以除以 128 的数字。

标签: vhdl


【解决方案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;

【讨论】:

  • 这有点令人困惑,因为在问题中,X 是输入的上限,而不是输入本身的名称。因此,我认为块数组范围和循环范围应该是 0 到 X/128-1。
  • 在我的解决方案中,X 只是 128 位块的数量。
  • 非常感谢,非常感谢您的帮助。你的回答很有帮助。
  • 不客气。作为新用户,请验证我的答案,如果它是您喜欢的答案。这就是堆栈溢出的游戏规则!
【解决方案2】:

您有几种选择来完成此操作。一种是使用选择性切片的扁平一维数组,如@JCLL 所示。另一种选择是创建一个新类型,它是数组的数组。

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;

此解决方案跳过一维切片所需的算术运算,但受限于 word_vec 元素需要约束类型。最后一个限制在 VHDL-2008 中被取消,您可以执行以下操作:

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

最佳解决方案取决于您的任务是什么,以及您在未来更改尺寸时需要多大的灵活性。

最后一个不太吸引人的选择是使用二维数组,但当您需要的不仅仅是按位访问时,它会变得很丑。

【讨论】:

  • 非常感谢您提供的有用信息,我使用了@JCLL 的方法,但我将它与您在回答中提到的“不受约束的新类型”结合起来。
【解决方案3】:

是的,您可以将大型逻辑向量的一部分分配给另一个较小的向量。我不确定你的具体实现(你没有提供信号类型和大小——大向量是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 2023-01-11
    • 2012-05-09
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多