www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Latch bei Berechnung mittels FSM


Autor: Martina M. (xaiven-be)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss eine recht komplexe Berechnung in HW realisieren. Hier als 
Lernbeispiel (num1*num2)+(num3*num4). Darf dafür nur einen 
Multiplizierer und einen Addierer verwenden. Habe jetzt mit der ISE 
10.1.03 einen IP-Core für die Multiplikation erstellt und den in mein 
Hauptfile (angehängt) eingebunden. Die sequentielle Berechnung erledige 
ich mit einer FSM, die nacheinander die Signale verteilt. Jetzt habe ich 
einige Fragen an die Profis.

1. Ist das eine gute und saubere Methode, diese Berechnung 
[(num1*num2)+(num3*num4)] durchzuführen?
2. Kann ich das dann so auch auf die Hardware bringen?
3. Werden mir die Latches zum Problem (Fehlerbericht hängt am nächsten 
Post)?

In der Simulation klappt das ja ganz gut... (Shot im nächsten Post)

Da ich heute schon einmal viel Hilfe erfahren habe, nochmals vielen 
Danke für die Antworten!

Viele Grüße
Martina

Autor: Martina M. (xaiven-be)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier der Fehlerbericht.

Autor: Martina M. (xaiven-be)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
... und hier die Sim-Ergebnisse.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich zitiere mal deinen output:
<One or more signals are missing in the process sensitivity list.
Daher würde ich auf deine SIM nichts geben.

Aber sag, was ist das für ein gigantisch schneller Core, der eine 
komplette ADDMUL-Operation in nur 6us schafft?

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast irgendwie keinerlei rücksetzung der signale drin, durch nen 
reset oder so, dadurch könnten die latches entstehen.

obs inner handware so geht solltest rausfinden, wenne mal 
durchsynthetisierst und dann vielleicht nochmal simulierst.

Autor: Martina M. (xaiven-be)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich bin für alle Vorschläge offen. Dachte, so kann ich das mit 
einer Art von FSM machen...

Später soll das auf einem Virtex4 laufen. Der hat diesen XtremeDSP48, 
aber wie schnell der das schafft, habe ich mir noch keine Gedanken 
gemacht. Habe einfach nur eine Testbench draufgelegt (im Anhang).

Martina

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz einfach: In einem kombinatorischen Prozess (also ohne 
rising_edge(CLK)) muss jedes Signal in jedem Fall (hier: in jedem 
when-statement) zugewiesen werden, sonst -> Latches, timing-Probleme, 
Aerger.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Du hast keine Defaultwerte für mu1_a, mu1_b...
--> Latch, weil in kombinatorischem Prozess.

Vergiss die 2 Prozess-Schreibweise. Das geht viel übersichtlicher (und 
automatisch ohne Latches) in 1 Prozess (Anhang). Ich verwende (ohne 
jetzt irgendwelche Glaubenskriege hervorrufen zu wollen) nur noch 
1-Prozess SM, und das Leben ist einfacher und übersichtlicher geworden.

Ein Tipp:
Sieh dir mal die NUMERIC_STD Lib an. Die ist herstellerunabhängig und 
für Berechnungen viel besser geeignet.

EDIT:
Das mit der Simulation hatte ich schon im anderen Post erwähnt. Mein 
Verdacht hat sich bestätigt (dein kombinatorischer Prozess). Mit der 
1-Prozess SM Schreibweise passiert sowas nicht.

EDIT2:
Im angehängten File ist noch ein Typo. Die Startbedingung muß korrigiert 
werden. Richtig ist:
      :
      when st0_idle =>
        if (num1 /= (others=>'0') ) then
--           state <= st0_idle;     FALSCH
           state <= st0_calc1;
        end if;
      when st1_calc1 =>
      :
Aber diese Startbedingung ist sowieso etwas zwielichtig ;-)

Autor: Martina M. (xaiven-be)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen, vielen Dank!
Habs jetzt gleich mal versucht, bekomme aber zwei Fehlermeldungen:

Zeile:
if (num1 /= (others=>'0') ) then
Fehler:
Can not determine the "others" values in aggregate. (LRM 7.3.2.2)
mit num1/= "0" gehts.

Aber hier:
result <= result12 + result34;
Fehler:
+ can not have such operands in this context.
... das verstehe ich jetzt gar nicht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> use IEEE.NUMERIC_STD.ALL;
Mea Culpa: stell das (vorübergehend) wieder auf deine "alten" Libs um.
NUMERIC_STD kann nicht mit STD_LOGIC_VECTOR rechnen.
Dafür gibts dann UNSIGNED und SIGNED.

Autor: Martina M. (xaiven-be)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mit den libs habe ich gerade auch gesehen. Mit den alten gehts. 
SUPER!!! Vielen, vielen Dank!!!!

Die Startbedingung hatte ich mir so überlegt, dass mit die SM nicht 
einfach "davonläuft", sondern erst anfängt, wenn ein Signal kommt. Jetzt 
muss ich bei deiner Version nur noch schnell einen Endstatus einbauen, 
sonst fängt die gleich wieder von vorne an und die Signal haben in 
meiner Testbench gar keine Zeit.

Demnach kann man solche solche Berechnungn in dieser Art machen, ohne 
dass Profis gleich die Hände über dem Kopf zusammenschlagen?

EDIT:
jetzt habe ich noch ein Problem, das
when st2_calc2 =>
        result12 <= mu1_product;  
        state <= st3_calc3;
wird nicht von result12 übernommen. Das Problem hatte ich bei meiner 
Version auch schon. Als ich dann clk in die Sensitiv-List übernommen 
habe, hats geklappt.

Autor: Martina M. (xaiven-be)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh.. jetzt kann ich meinen Post nicht mehr editieren...

habs jetzt hinbekommen. Das liegt wohl an dem DSP. Wenn ich
wait until falling_edge(clk);
verwende, dann klappt das alles!!

Mensch super. Kann euch gar nicht genug danken. Nach so einem 10h Tag 
ist das ein gutes Gefühl wenn alles (zumindest der erste Schritt) 
funktioniert. Und mit nur einer Warnung (Instantiating black box module 
<mult20x20>), die wohl nicht besonders wichtig ist.

Einen schönen Abend dem ganzen Board.

Martina

EDIT:
habs gerade hier im Forum gefunden.
Matthias wrote:
> Das eine Warnung, keine Fehlermeldung. Und sie sagt genau das richtige
> aus, nämlihc das die Komponenten nicht synthetisiert werden, weil sie
> eben schon fertig als Hardware vorliegen, und dann im späteren Map
> Schritt einfach verwendet werden.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> habs jetzt hinbekommen. Das liegt wohl an dem DSP. Wenn ich
>> wait until falling_edge(clk);
> verwende, dann klappt das alles!!
Naja, ein wenig riechen tut das schon noch... :-/
Wieviele Takte braucht dein Multiplier?

Autor: Martina M. (xaiven-be)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe mich den ganzen Morgen mit den Timing beschäftigt. Falls ich das 
Datenblatt richtig verstanden habe (Anhang, copyright by Xilinx) braucht 
ein DSP 3 Takte. Allerdings werden für die 20x20 Bit Berechnung 4 DSPs 
benötigt, die hintereinander beschaltet sind.
Ich habe ja bis jetzt nur eine Behavioral-Simulation laufen lassen. Die 
sagt mir ja wenig darüber aus, wie lange das wirklicht dauert. Oder?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Warum verwendest du nicht einfach einen generischen Multiplizierer?
Sowas z.B.:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Multiply20x20 is
    Port ( clk : in  STD_LOGIC;
           val1 : in  STD_LOGIC_VECTOR (19 downto 0);
           val2 : in  STD_LOGIC_VECTOR (19 downto 0);
           res : out  STD_LOGIC_VECTOR (39 downto 0));
end Multiply20x20;

architecture Behavioral of Multiply20x20 is
begin
   res <= std_logic_vector(unsigned(val1) * unsigned(val2));
end Behavioral;
> Maximum combinational path delay: 16.151ns
Damit ergibt sich eine rechnerische Taktfrequenz von 62MHz.


Mit ein paar Pipeline-Rgistern wird das Ganze schon schneller, 
allerdings auf Kosten von 2 Takten Latency.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Multiply20x20 is
    Port ( clk : in  STD_LOGIC;
           val1 : in  STD_LOGIC_VECTOR (19 downto 0);
           val2 : in  STD_LOGIC_VECTOR (19 downto 0);
           res : out  STD_LOGIC_VECTOR (39 downto 0));
end Multiply20x20;

architecture Behavioral of Multiply20x20 is
signal resreg1, resreg2 : STD_LOGIC_VECTOR (39 downto 0);
begin
   process begin
      wait until rising_edge(clk);
      resreg1 <= std_logic_vector(unsigned(val1) * unsigned(val2));
      resreg2 <= resreg1;
      res     <= resreg2;
   end process;
end Behavioral;
> Minimum period: 4.844ns (Maximum Frequency: 206.447MHz)
Na, wer sagts denn ;-)

Autor: Martina M. (xaiven-be)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

so langsam werde ich mit der ISE vertraut. Habe im Synthesis Report 
gefunden, wie schnell ich mit dem DSP-Core arbeiten kann:

>Minimum period: 2.675ns (Maximum Frequency: 373.825MHz)
>Minimum input arrival time before clock: 2.847ns
>Maximum output required time after clock: 3.753ns
>Maximum combinational path delay: No path found

Habe jetzt ein paar Mal eine Post-Route Sim laufen lassen (dauert leider 
immer 15 Minuten...), wobei ich aber mindestens eine clk-Periode von 5ns 
brauche.
Mit 4, 3 oder gar 2.675ns bekomme ich das Ergebnis nicht.
Werde jetzt das Design mal mit den generischen Multiplizierer testen, 
ist dann vielleicht "durchsichtiger".

Möchte mich an dieser Stelle noch einmal ausdrücklich für die super 
und ausdauernde Hilfe hier bedanken ! Macht den Einstieg erheblich 
einfacher und effizienter. Freut mich sehr, dass Anfänger hier so nett 
und kompetent geholfen wird!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.