【问题标题】:VHDL: Assigning a smaller std_logic_vector to a bigger oneVHDL:将较小的 std_logic_vector 分配给较大的
【发布时间】:2016-09-14 16:45:55
【问题描述】:

我正在尝试将较小的std_logic_vector 分配给较大的std_logic_vector,如下所示:

library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;

entity subarray_tb is
end subarray_tb;


architecture VERHALTEN of subarray_tb is 

signal big : std_logic_vector(15 downto 0) := x"A5A5";
signal small : std_Logic_vector(7 downto 0) := x"F0";

begin

  big <= small;

end VERHALTEN;

正如预期的那样,我从 Modelsim 中收到以下错误:

** 错误(可抑制):C:/altera/15.1/subarray_tb.vhd(19): (vcom-1272) 预期长度为 16;实际长度为8。

我知道如何解决这个问题,但我对结果不满意,因为它看起来很不可读:

big(big'LEFT downto (big'LEFT-small'LENGTH+1)) <= small;

我不想在括号中使用固定范围,因为我的真正问题有点复杂。较小的数组是不同 std_logic_vector 的串联,所以我希望解决方案灵活。

有没有人更易读的更好的解决方案?

【问题讨论】:

  • 将不可读的内容包装在适当命名的函数中。这并不完全是重复的,因为提问者显然想要部分更新,保持big 的低位不变(或未定义)。
  • 你可以声明一个别名big。例如。 alias big_upper : std_logic_vector is big(15 downto 8);
  • @scary_jeff 我有一个简单的测试来确定另一个问题是否重复:所谓的重复问题的答案是否回答了原始问题?在这种情况下他们不会。
  • @Paebbels 这正是我推荐的攻击方式。很好的建议。

标签: range vhdl assign human-readable


【解决方案1】:

您可以使用命名范围。你定义一个subtype

subtype big_upper is integer range big'LEFT downto (big'LEFT-small'LENGTH+1);

然后用它代替范围:

big(big_upper) <= small;

http://www.edaplayground.com/x/2Pcn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多