Forum: FPGA, VHDL & Co. Objekte von bestehendem Design verdreifachen


von Daniel C. (danny1)


Lesenswert?

Hallo liebe mikrocontroller - Community,

Ich beschäftige mich noch nicht allzu lange mit VHDL und hätte da mal 
eine ganz grundsätzliche Frage.
Folgende Problemstellung: Ich habe meinen ersten Testentwurf von meinem 
Design und möchte diesen jetzt ganz einfach erweitern. Dabei ist es so, 
dass mein Design jetzt so erweitert werden soll, dass die bestehenden 
Komponenten meist 3-mal identisch benötigt werden (3 Phasen). Sprich es 
sollen die bestehenden Komponenten (also es sind Counter, EdgeDetectroen 
und StateMachine) einfach 3-mal parallel laufen, natürlich mit 3 
unterschiedichen Eingängen.

Ich frage mich jetzt gerade ob ich meine Etities jetzt einfach um 2 
zusätzliche Processes erweitern soll oder ob es besser ist für die 
weiteren 2 Komponenten jeder Art (also es sind Counter, EdgeDetectroen 
und StateMachine) jeweils einen neue Entity anzulegen welche ich alle in 
meiner Top-level Entity instanziiere?

Was wären die Vor- bzw Nachteile der beiden Herangehensweisen?

LG,
Daniel

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel C. schrieb:
> Was wären die Vor- bzw Nachteile der beiden Herangehensweisen?
Du legst ein Modul (=Entity) an, das 1 Phase bedient. Von dieser 
instatiierst du in einem zweiten (Top-Level-)Modul die nötigen 3 
Komponenten. Etwa so wie ich das mit der Totzeit-Generierung hier für 2 
Phasen gemacht habe:
http://www.lothar-miller.de/s9y/archives/58-Totzeit-fuer-H-Bruecke.html

Dann musst du nämlich nur 1 Phase komplett durchsimulieren und kannst 
diese dann als "bereits fertig" in deinem Design mehrfach einsetzen.

: Bearbeitet durch Moderator
von cfgardiner (Gast)


Angehängte Dateien:

Lesenswert?

Oder du packst die ganze Logik für eine Phase in einem Entity und dann 
instantiierst den Phasen-Block in einem Generate Statement:

e.g. im Anhang

von Mehmet K. (mkmk)


Lesenswert?

Lothar, als blutiger Anfaenger haette ich eine vermutlich banale Frage 
zu Deinem Beispiel:
1
architecture Behavioral of Totzeit is
2
   signal delay : integer range 0 to tdead-1 := 0;
3
begin
Warum ist delay vom Typ signal? Ich dachte signal wird nur dann 
eingesetzt, wenn die Schnittstelle damit mit der Aussenwelt 
kommuniziert. In deinem Beispiel tut delay dies aber nicht.
Haette man delay auch als variable deklarieren können?

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Hätte man, ja.

von Duke Scarring (Gast)


Lesenswert?

Mehmet K. schrieb:
> Haette man delay auch als variable deklarieren können?
Hier der Link zum Klassiker:
Beitrag "Variable vs Signal"

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mehmet K. schrieb:
> Ich dachte signal wird nur dann eingesetzt
Nein. Variablen sind es, die nur ausnahmsweise und gezielt 
eingesetzt werden. Auch wenn sie so ein "schönes" Verhalten haben und 
den neuen Wert "sofort" übernehmen.

Oder kurz: VHDL-Anfänger aus der Softwareecke setzen die Dinger gern 
ein, weil man damit so einfach "programmieren" kann.

: Bearbeitet durch Moderator
von Markus K. (markus-)


Lesenswert?

Ich bin zwar nicht der TO, aber auch Anfänger.

Lothar M. schrieb:
>> Ich dachte signal wird nur dann eingesetzt
> Nein. Variablen sind es, die nur ausnahmsweise und gezielt
> eingesetzt werden. Auch wenn sie so ein "schönes" Verhalten haben und
> den neuen Wert "sofort" übernehmen.

Aber warum denn? Den von Duke Scarring verlinkten Artikel habe ich 
gelesen, aber darin kann ich keine überzeugenden Argumente für Signale 
finden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus K. schrieb:
> aber darin kann ich keine überzeugenden Argumente für Signale finden.
Drehen wir den Spieß mal um: wenn du darin keine überaus überzeugenden 
Argumente für Variablen findest, dann nimm Signale.

Oder andersrum:
Ein Signal ist der übliche Informationsträger in VHDL. Variablen haben 
"Sonderfunktionen".

> Den von Duke Scarring verlinkten Artikel habe ich gelesen, aber darin
> kann ich keine überzeugenden Argumente für Signale finden.
Lies ihn nochmal und frag, wenn du etwas nicht verstehst.

Mal eine Frage:
Was gefällt dir an Variablen so gut?

von Markus K. (markus-)


Lesenswert?

Lothar M. schrieb:
> Mal eine Frage:
> Was gefällt dir an Variablen so gut?

Es ist so wie Du sagst: Wenn man einen Softwarebackground hat, dann 
fühlen die sich sehr viel natürlicher an als Signale. Ich bin gerne 
bereit Signale zu verwenden, wenn diese Vorteile haben. Bis jetzt sehe 
ich die Vorteile aber eher bei den Variablen. Insbesondere auch, dass 
man dabei komplexere Ausdrücke einfach aufspalten kann und der Compiler 
macht die Hilfsvariablen dann hinterher wieder weg.

Um auf den empfohlenen Thread einzugehen:
Hier Beitrag "Re: Variable vs Signal" argumentiert 
Falk, dass die beiden unterschiedliches Zuweisungsverhalten haben und 
das Anfänger verwirre.

Ich denke, ich habe das schon verstanden: Bei Signalen gewinnt die 
letzte Zuweisung und bei Variablen darf man den Wert sofort verwenden. 
Ich sehe es eigentlich eher so, dass Signale Anfänger verwirren und 
nicht die Variablen.

Hier Beitrag "Re: Variable vs Signal" argumentierst 
Du, dass die Simulation fehlerhaft wird, wenn man einen Wert von 
Variable auf Signal umstellt und dabei die Sensitivity-Liste nicht 
erweitert und auch noch die Compilerwarnung ignoriert.

Ja, muss man halt drauf achten. Danke für den Hinweis. Deswegen aber auf 
Variablen (weitgehend) zu verzichten halte ich für übertrieben.


Hier Beitrag "Re: Variable vs Signal" hast Du ein 
Beispiel, bei dem die Variante mit Variablen[1] schneller ist als die 
Variante mit Signalen[2]. Erst die ausformulierte Variante mit 
Signalen[3] wird auch parallelisiert. Das deute ich eher als Argument 
für Variablen.

Diesen Beitrag Beitrag "Re: Variable vs Signal" habe 
ich nicht verstanden. Allerdings hatte ich auch nicht vor, solchen Code 
zu schreiben, sondern die Signale immer am Ende des Prozesses zuzuweisen 
und immer eine clock zu verwenden.
Ich vermute, dass das
1
 process(din)
2
   variable var: std_logic;
3
   begin
4
      res1 <= var;
5
      var  := din;
6
      res2 <= var;
7
   end process;

das Gleiche ist wie das da:
1
 process(din)
2
   variable var: std_logic;
3
   begin
4
      var  := din;
5
      res1 <= var;
6
      res2 <= var;
7
   end process;

Jedenfalls was die Synthese angeht. Die Simulation sieht das wohl 
anders.



Insgesamt kann ich nicht wirklich Argumente gegen Variablen erkennen. 
Man muss zwei verschiedene Werte-Verhalten lernen und beim Umstellen von 
Variablen auf Signale aufpassen was man tut. Im Gegenzug dazu werde ich 
nicht grübelnd vor sowas sitzen (Beispiel auch von Dir):
1
process begin
2
     wait until rising_edge(clk);
3
     signalA <= '1';
4
     if signalA='1' then
5
        signalB <= not signalB;
6
     end if;
7
     signalA <= '0';
8
  end process;

Ich verstehe zwar, was da passiert (oder eben nicht passiert), aber ich 
bin mir auch sicher, dass ich trotzdem früher oder später sowas 
schreiben werde.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus K. schrieb:
> Insgesamt kann ich nicht wirklich Argumente gegen Variablen erkennen.
Ich bin kein "Variablenverkäufer" und muss nicht davon leben, dass 
möglichst viele Variablen verwendet werden.
Aber eines ist klar: der Simulator ist der Debugger eines HDL Designs. 
Und wenn es eine Möglichkeit gibt, in der Simulation etwas falsch zu 
machen, dann lasse ich das bleiben. Aus Erfahrung. Aber da darf gern 
jeder seine eigenen Erfahrungen machen...

> Insgesamt kann ich nicht wirklich Argumente gegen Variablen erkennen.
Mein Ansatz ist andersrum: wenn ich keine spürbaren Vorteile sehe, dann 
nehme ich keine Variablen.
In einem Prozess sind Signale nämlich extrem pflegeleicht, weil ihre 
Abfrage  keine Reihenfolge braucht. Ein Signal bleibt während des 
gesamten Prozesses unverändert.

Markus K. schrieb:
> Ich verstehe zwar, was da passiert (oder eben nicht passiert), aber ich
Die Abfrage erfolgt während des gesamten Prozesses auf den initialen 
Wert von a. Die Zuweisungen greifen erst am Prozessende nach den Motto 
"die letzte Signalzuweisung gewinnt".

> bin mir auch sicher, dass ich trotzdem früher oder später sowas
> schreiben werde.
Du willst gar nicht wissen, welche seltsamen Verhaltensweisen damit 
Variablen hinbekommst...

: Bearbeitet durch Moderator
von Strubi (Gast)


Lesenswert?

Markus K. schrieb:
> Ich denke, ich habe das schon verstanden: Bei Signalen gewinnt die
> letzte Zuweisung und bei Variablen darf man den Wert sofort verwenden.
> Ich sehe es eigentlich eher so, dass Signale Anfänger verwirren und
> nicht die Variablen.

Du musst noch einen Denkschritt nachvollziehen: Nämlich dass ein 
Simulator typischerweise eventbasiert arbeitet. D.h. ändert sich ein 
Signal, kümmert sich irgend ein Handler darum (guckst du 'concurrent' 
versus 'sequential' statements in der HDL-Semantik). Und wenn du dann 
nachvollziehst, was der Synthesizer aus diesen Statements macht 
(angefangen mit 'Primitiven' wie : Flipflop, LUT, Multiplexer) stellst 
du fest, dass diese Abstraktion recht nah an der Hardware ist. Und das 
willst du, aus zur Genüge vorgekauten Gründen: Stimmt die Simulation, 
soll auch die HW entsprechend laufen.
Dass da VHDL einem eine Menge Möglichkeiten liefert, sich ins Knie zu 
schiessen, ist wieder so ein Thema, dafür gibts aber Tools, die 
Designregeln überprüfen, obige Konstrukte schmeissen bei mir einen roten 
Blob der schreit: Nix gut.

So generell bin ich ein Freund von: Schreib hin, was es macht (oder 
nutze copy/paste, aber halt' es explizit). Alles andere geht in Richtung 
Obfuscation und macht Kollegen, die deinen Code allenfalls debuggen 
müssen, das Leben schwer.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus K. schrieb:
> Hier Beitrag "Re: Variable vs Signal" hast Du ein Beispiel, bei dem die
> Variante mit Variablen[1] schneller ist als die Variante mit
> Signalen[2]. Erst die ausformulierte Variante mit Signalen[3] wird auch
> parallelisiert.
Das ist noch in der Stufe vor der Optimierung. Letztendlich wird diese 
gesamte Funktion in jedem Fall in 1 einzige LUT gepackt und ist immer 
gleich schnell.

> Das deute ich eher als Argument für Variablen.
Nennt sich auch "schönsaufen"...  ;-)

Nein, im Ernst, das "Hauptproblem" hier ist das übliche: du hast bisher 
Software gemacht und möchtest möglichst im selben erprobten Stil ein 
FPGA "programmieren". Variablen scheinen dir bekannt und deshalb 
geeignet, diese Vorgehensweise umzusetzen. Allerdings wird das (wie hier 
schon mehrmals erlebt) schiefgehen. Je später desto schlimmer.

Mein Vorschlag: du solltest du beim Verfassen einer VHDL-Beschreibung 
explizit versuchen, Signale zu verwenden. Dann fällt dir immer wieder 
mal auf, dass du für die Hardwarebeschreibung andere Mechanismen und 
eine andere Denkweise brauchst.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Nein, im Ernst, das "Hauptproblem" hier ist das übliche: du hast bisher
> Software gemacht und möchtest möglichst im selben erprobten Stil ein
> FPGA "programmieren".

Einer der Gründe dafür, dass ich Hardwarebeschreibungen in VHDL statt 
Verilog erstelle, besteht darin, dass sich VHDL stark von den C-artigen 
Sprachen unterscheidet. Dies führt nämlich dazu, dass die rote Warnlampe 
ständig blinkt: "Achtung, Du beschreibst gerade Hardware!". Bei meinen 
bisherigen FPGA- und CPLD-basierten Designs entwickele ich die 
Hardwarebeschreibung und die zugehörige Microcontroller- oder 
Softcore-Firmware gleichzeitig, d.h. wenn ich z.B. ein 
Peripherieregister definiere, schreibe ich sofort auch die 
entsprechenden Zugriffsfunktionen (in C/C++). Daher wäre mir Verilog an 
dieser Stelle manchmal zu C-artig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.