【问题标题】:VHDL multiple std_logic_vector to one large std_logic_vectorVHDL 多个 std_logic_vector 到一个大 std_logic_vector
【发布时间】:2015-10-14 15:55:19
【问题描述】:

我有四个 std_logic_vector(15 downt 0)并想将它们堆叠成一个 std_logic_vector(63 downt 0)所以我找到了一种方法,但它是正确的方法还是有更优化和正确的方法做吗?

signal slv16_1,slv16_2,slv16_3,slv16_4 : std_logic_vector(15 downto 0);
signal slv64 : std_logic_vector(63 downto 0);

slv64(15 downto 0) <= slv16_1;
slv64(31 downto 16) <= slv16_2;
slv64(47 downto 32) <= slv16_3;
slv64(63 downto 48) <= slv16_4;

【问题讨论】:

  • 也许 VHDL 别名可以替代您。别名可用于为 64 位向量的部分赋予新名称,而所有操作都在原始信号上执行。
  • 感谢这是解决问题的好方法。

标签: vhdl


【解决方案1】:

一个简单的方法是使用连接运算符&amp;。它实现了与您在上面所做的相同的事情,但所需的代码更少。

slv64 <= slv16_4 & slv16_3 & slv16_2 & slv16_1;

【讨论】:

  • VHDL-2008 还支持由元素切片以及数组基本类型的元素组成的聚合。在某些极端情况下,使用聚合可以克服连接运算符的重载解析歧义,而聚合是基本操作。
【解决方案2】:

由于源向量具有唯一的名称,因此我看不到自动化的方法。您可以尝试的是永远不要使用 16 位向量,而是使用较大的 64 位向量的切片。所以不要像这样分配:

slv16_1 <= "0101110000111010";

使用

slv64(15 downto 0) <= "0101110000111010";

或者不是像这样连接slv16_2 的实体实例化:

output_port => slv16_2,

使用

output_port => slv64(31 downto 16),

我确实需要查看更多您的代码以了解最有效的方法,但我的基本答案是“首先使用较大的向量”。

如果由于某种原因您不能这样做,另一种方法是将您的 16 位向量声明为数组数组:

type slv16_array_type is array (integer range <>) of std_logic_vector(15 downto 0);
signal slv16_array : slv16_array_type(3 downto 0);

然后您可以像这样分配给元素:

slv16_array(0) <= "0101";

您可以将这种类型的元素与生成循环组合:

slv16_combine : for i in 0 to 3 generate
  slv64((16*(i+1))-1 downto 16*i) <= slv16_array(i);
end generate;

【讨论】:

    【解决方案3】:

    VHDL 指南说这个应该可以工作:

    slv64 <= (slv16_4, slv16_3, slv16_2, slv16_1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多