【问题标题】:Why couldn't I convert this integer into a logic_vector?为什么我不能将此整数转换为 logic_vector?
【发布时间】:2016-03-24 16:31:01
【问题描述】:

我一直在尝试将此整数类型的信号转换为 std_logic 向量,并将转换后的值分配给另一个与 VHDL 整数具有相同宽度的信号

signal temp : std_LOGIC_VECTOR(31 downto 0) := (others => '0'); 
signal FrameCumulative : integer :=0;

temp <= to_stdlogicvector(to_unsigned(FrameCumulative));

但是我得到了这个错误:

错误 (10346):vga.vhd(107) 处的 VHDL 错误:正式端口或参数 "SIZE" 必须有实际值或默认值

我正在使用use IEEE.NUMERIC_STD.ALL;use IEEE.STD_LOGIC_1164.ALL;

首先我犯了一个错误,没有检查 VHDL 中的整数大小,并试图将一个整数分配到一个 14 位向量中,但在我考虑了一下之后,我承认了我的错误。

现在根据许多在线资源,我正在做的应该可以工作,但我的合成器抱怨它。

如果您确实知道造成这种情况的原因,您会介意详细说明您的答案,而不仅仅是发布正确的代码,谢谢!

【问题讨论】:

  • 没有给出FrameCumulative的声明。您的示例代码声明了AccumelatedFrameVals。请编辑您的问题。

标签: vhdl hardware


【解决方案1】:

必须为函数to_unsigned 提供一个参数,指定您希望它生成的向量的宽度。函数to_stdlogicvector 也不是正确的使用方法。您的行应如下所示:

temp <= std_logic_vector(to_unsigned(FrameCumulative, temp'length));

函数to_unsigned是一个转换函数,必须提供目标宽度。在这里,正如@BrianDrummond 所建议的,宽度是通过从目标向量本身(temp)获取length 属性来指定的。 std_logic_vector 是一个类型转换,其中unsigned 值直接解释为std_logic_vector

【讨论】:

  • 最好使用temp'size 而不是32,以后需要维护的东西少了。
  • 感谢您解决了这个问题。我应该先查看函数参数! temp 可以小于 32 位宽吗?因为我不打算使用所有位!
  • @Aboudi 您可以转换为您想要的任何宽度,但如果您希望它正常工作,您当然需要确保您的预期值范围适合此范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2021-05-09
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多