【问题标题】:Unsigned in VHDL在 VHDL 中未签名
【发布时间】:2017-02-19 22:24:49
【问题描述】:

我有一个 VHDL 代码。 Modelsim 给我报错

"预期长度为 32;实际长度为 31"

如何编写代码,它是正确的,我不写向量的长度。 我希望它像在 Verilog 中一样工作: Verilog

reg [30:0] smth1 = 2735*12;
reg [15:0] smth2 = 12*11;
reg [31:0] smth1_s; 
always (*)
begin 
smth1_s <= smth1+smth2;
end 

VHDL:

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

entity top is 
end entity; 

architecture top of top is  
    signal smth1 : unsigned(30 downto 0) := to_unsigned(2735,16) * to_unsigned(12,15);      --reg [31:0] smth1 = 12'hAAF * 12; 
    signal smth2 : unsigned(15 downto 0) := to_unsigned(12,16) / to_unsigned(11,16);        --reg [15:0] smth2 = 12*11;                 
    signal smth1_s : unsigned(31 downto 0);     

begin                           
        smth1_s <= smth1 + smth2;                               
end architecture; 

【问题讨论】:

  • "+" on Unsigned 接受输入并返回相同长度的输出。一种方法是对输入进行签名扩展:对于无符号,即smth1_s &lt;= '0' &amp; smth1 + '0' &amp; smth2;

标签: vhdl unsigned


【解决方案1】:

+ 的结果长度是两个参数中最长的,即 30 位,分配给 31 位目标,因此是错误。

可以使用调整大小,以适应有符号或无符号的参数,但您需要在加法之前调整大小以扩展进位位的结果,正如我假设的那样。

所以通用和可维护的代码可能是这样的,您可以在其中添加合适的注释来描述调整大小的目的:

smth1_s <= resize(smth1, smth1_s'length) + resize(smth2, smth1_s'length);

一个好的综合工具,就像今天的大多数工具一样,会优化电路,因此只使用最少数量的全加器,即使看起来由于调整大小而添加了更多位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多