2016-10-11 3 views
1

Ich habe einen VHDL-Code. Modelsim gibt Fehler mirUnsigned in VHDL

„Länge der erwarteten 32; Länge der tatsächlichen 31“

Wie Code zu schreiben, dass es richtig war, und mir nicht Länge von Vektoren zu schreiben. Ich möchte, das wie in Verilog funktioniert: 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; 
+0

'" + "' an Unsigned nimmt Eingaben und gibt eine Ausgabe der gleichen Länge zurück. Ein Ansatz besteht darin, die Eingaben zu erweitern: Für Unsigned bedeutet das einfach 'smth1_s <=' 0 '& smth1 +' 0 '& smth2; ' –

Antwort

1

Die Länge des Ergebnisses aus + ist die längste der beiden Argumente, also 30 Bits, die zugeordnet ist ein 31-Bit-Ziel, also der Fehler.

Die Größenanpassung, die sich entweder als vorzeichenbehaftet oder vorzeichenlos an das Argument anpasst, kann verwendet werden, aber Sie müssen die Größe vor dem Hinzufügen ändern, um das Ergebnis für das Übertragsbit zu erweitern, wie ich annehme.

So generic und wartbaren Code sein kann, wie, wo Sie einen geeigneten Kommentar hinzufügen können, den Zweck der Redimensionierung zu beschreiben:

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

Ein guten Synthese-Tool, wie die meisten heute wird die Schaltung optimieren, so dass nur Es wird die minimale Anzahl von Volladdierern verwendet, obwohl es aussieht, als würden aufgrund der Größenänderung mehr Bits hinzugefügt.