2017-04-23 5 views
0

Ich benutze VHDL für die Beschreibung eines 32-Bit-Multiplikator, für ein System auf einem Xilinx FPGA implementiert werden, fand ich im Web, dass die Faustregel ist, dass wenn Sie haben Eingänge von N-Bits Größe, muss der Ausgang (2 * N) -Bits der Größe haben. Ich benutze es für ein Feedback-System, ist es möglich, einen Multiplikator mit einer Ausgabe der gleichen Größe seiner Eingänge zu haben ?.VHDL Multiplikator, der Ausgang hat die gleiche Seite seiner Eingänge

Ich schwöre, sobald ich eine FPGA-Anwendung gefunden, die VHDL-Code hat Addierer und Multiplikatoren Blöcke mit Signalen der gleichen Größe verdrahtet. Die Person, die den Code geschrieben hat, sagte mir, dass Sie nur das Ergebnis des Produkts auf ein 64-Bit-Signal setzen müssen und dann muss der Ausgang die signifikantesten 32 Bits des Ergebnisses erhalten (was nicht notwendigerweise auf den höchstwertigen 32 Bits lag) des 64-Bit-Signals).

ich ein System Zu der Zeit bauen (anscheinend funktioniert), um den nächsten Code verwendet:

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

entity Multiplier32Bits is 
    port(
     CLK: in std_logic; 
     A,B: in std_logic_vector(31 downto 0); 
     R: out std_logic_vector(31 downto 0) 
    ); 
end Multiplier32Bits; 

architecture Behavioral of Multiplier32Bits is 
signal next_state: std_logic_vector(63 downto 0); 
signal state: std_logic_vector(31 downto 0); 

begin 

    Sequential: process(CLK,state,next_state) 
    begin 
     if CLK'event and CLK = '1' then 
      state <= next_state(61 downto 30); 
     else 
      state <= state; 
     end if; 
    end process Sequential; 

    --Combinational part 
     next_state <= std_logic_vector(signed(A)*signed(B)); 

    --Output assigment 
    R <= state; 

end Behavioral; 

ich aber, da sie arbeitet an der Zeit, die ich den Block hatte Aktiv-HDL-FPGA-Simulator simuliert mit, aber weiß, dass ich das gesamte 32-Bit-System mit iSim von der Xilinx ISE Design Suite simuliere. Ich fand heraus, dass meine Ausgabe einen großen Unterschied zu dem realen Produkt von A- und B-Eingängen hat, von dem ich nicht weiß, ob es nur die Genauigkeit ist, wenn 32 Bits übersprungen werden oder mein Code einfach schlecht ist.

+0

ok, wo ist die Frage? – Staszek

+0

Und geben Sie Zahlen, die Sie für die Simulation verwendet haben. – Staszek

+0

Wahrscheinlich möchten Sie nach dem Verschieben das Ergebnis ausrichten. Und Sie haben signierte Festkomma-Eingabe verwendet. – JHBonarius

Antwort

0

Ihr Code hat einige Probleme:

  1. next_state und state gehören nicht in die Sensitivitätsliste
  2. Die Schrift CLK'event and CLK = '1' sollte rising_edge(CLK)
  3. state <= state; ersetzt hat keine Wirkung und verursacht einige Tools wie ISE das Muster falsch zu lesen. Entfernen Sie es.
  4. Platz um Bediener herum tut nicht weh, verbessert aber die Lesbarkeit.
  5. Warum erwarten Sie das Ergebnis von a * b in Bits 30 bis 61 statt 0 bis 31?
  6. state und next_state repräsentieren keine Zustände einer Zustandsmaschine. Es ist nur ein Register.

Verbesserte Code:

architecture Behavioral of Multiplier32Bits is 
    signal next_state: std_logic_vector(63 downto 0); 
    signal state: std_logic_vector(31 downto 0); 
begin 
    Sequential: process(CLK) 
    begin 
    if rising_edge(CLK) then 
     state <= next_state(31 downto 0); 
    end if; 
    end process Sequential; 

    --Combinational part 
    next_state <= std_logic_vector(signed(A) * signed(B)); 

    --Output assigment 
    R <= state; 
end architecture Behavioral; 
+0

'state' gehört ebenfalls nicht in die Empfindlichkeitsliste. Und 'rising_edge (CALL)' -> 'rising_edge (CLK)' ... Obwohl das nicht wirklich erforderlich ist. Es wird so synthetisieren, wie es jetzt ist. – JHBonarius

+0

Ist es nicht besser, rising_edge (CLK) zu haben, da es prüft, ob es wirklich steigende Flanke ist, und zum Beispiel nicht von hoher Impedanz auf "1" wechselt? – Staszek

0

Ich bin vollkommen einverstanden mit allem, was Paebbels schreiben. Aber ich werde Ihnen diese Dinge über die Anzahl der Bits im Ergebnis erklären. Also werde ich es durch Beispiele in der Basis 10.

9 * 9 = 81 (two 1 digit numbers gives maximum of 2 digits) 
99 * 99 = 9801 (two 2 digit numbers gives maximum of 4 digits) 
999 * 999 = 998001 (two 3 digit numbers gives maximum of 6 digits) 
9999 * 9999 = 99980001 (4 digits -> 8 digits) 

Und so weiter ... Es ist völlig das gleiche für binäre erklären. Deshalb ist die Ausgabe (2 * N) -bits der Größe der Eingabe.

Aber wenn Ihre Zahlen kleiner sind, dann in gleicher Anzahl von Ziffern passen führen, als Faktoren:

3 * 3 = 9 
10 * 9 = 90 
100 * 99 = 990 

Und so weiter. Wenn Ihre Zahlen also klein genug sind, wird das Ergebnis 32 Bit betragen. Natürlich, wie Paebbels schon geschrieben hat, wird das Ergebnis in den wenigsten bedeutenden Teil des Signals sein.

Und wie J.H.Bonarius bereits darauf hingewiesen hat, wenn Ihre Eingabe nicht aus ganzzahligen, sondern aus festen Zahlen besteht, müssten Sie nach dem Verschieben arbeiten.Wenn dies der Fall ist, schreibe es in den Kommentar und ich werde erklären, was zu tun ist.

+0

Danke Staszek !!, Ja, es ist mein Fall, ich verwende beide Festkommazahlen und signiert, so dass das MSBit als Vorzeichenbit verwendet wird, 2 Bits für den ganzzahligen Teil (der Ausgabebereich liegt zwischen -1 und 1), und der Rest der 32 Bits für den Bruchteil. Da ich nicht sicher war, nach dem Verschieben, ich wählte die MSBytes für die Antwort, ich verliere die LSBytes aus dem Bruch Teil wird nicht die Dynamik des Systems, in dem der Multiplikator verwendet wird. Aber der Punkt von J.H. Bonarius scheint bei der Genauigkeit zu helfen und wird daher die Dynamik des Systems verbessern. Vielen Dank! :) – Tebi

+0

Eigentlich liegt der Ausgabebereich zwischen -4 und 3. (9);) – Staszek