Forum: FPGA, VHDL & Co. Mehrfache Instanziierung ein Komponente


von Frank M. (duesentrieb72)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

bin dabei, die ersten "Gehversuche" mit VHDL zu machen.
Habe praktisch keine wirkliche Erfahrung mit VHDL/FPGA.
Benutze das Xilinx ISE Web 14.2 für einen Spartan-6.

Habe ein Problem bei der mehrfachen Instanziierung einer Komponente.

In dem angehängten Programm (ADC_Clock_Generator) habe ich eine Zähler 
("Counter" in einem separaten VHDL-File) mehrfach verwenden wollen.

Habe also die Komponenete "Counter" eingefügt und sie zwei mal 
Instanziiert, wo ich die Ein-/Ausgangssignale verknüpft habe.

In der Design-Hirarchy bekomme ich auch beide Instanzen angezeigt.

Das Ergebnis in der Simulation ist leider, dass immer nur eine Instanz 
des Zählers verwendet wird, obwohl die Signale zur anderen Instanz 
zeigen...

Was habe ich falsch getan?

Danke und Gruß,
Duesentrieb72

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


Lesenswert?

1
use ieee.std_logic_unsigned.all;
2
use ieee.std_logic_arith.all;
3
use ieee.numeric_std.all;
Na toll...
Muss eigentlich jeder jeden Fehler immer selber machen?
Sieh dir mal das an:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und das:
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

> Das Ergebnis in der Simulation
Mit welcher Testbench?

> Benutze das Xilinx ISE Web 14.2 für einen Spartan-6.
Und dann: wozu unnötigerweise eine Variable für ein speicherndes 
Element?
1
   variable zaehler : ZaehlerStand := 0;
Die Variable kannst du mit ISIM nämlich nicht mal ansehen... :-/

Lies mal den Beitrag "Variable vs Signal"

BTW: über Teiler werden in FPGAs keine (zusätzlichen) Takte erzeugt!
Hier mal meine Postulate:
1
Ein Design (insbesondere ein Anfängerdesign) hat genau 1 Takt, 
2
der immer auf dieselbe Flanke aktiv ist. 
3
Es gibt keinen (und schon gar keinen asynchronen) Reset.
4
Externe Signale werden über 2 Flipflops einsynchronisiert.
5
Jede Abweichung von diesen Regeln muß fundiert begründet werden können.

> bin dabei, die ersten "Gehversuche" mit VHDL zu machen.
> Habe praktisch keine wirkliche Erfahrung mit VHDL/FPGA.
Hast du die blinkende LED schon gemacht, und das Lauflicht?
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
Das wäre ein guter Einstieg...

von Frank M. (duesentrieb72)


Lesenswert?

Hallo Lothar,

vielen Dank für Deine Antworten.

> use ieee.std_logic_unsigned.all;
> use ieee.std_logic_arith.all;
> use ieee.numeric_std.all;
> Na toll...
> Muss eigentlich jeder jeden Fehler immer selber machen?
Nun ja, das wird exakt so im Xilinx IP Core Generator verwendet. Daher 
bin ich mal davon aus gegangen, dass das so falsch nicht sein kann...
Habs' geändert, ändert aber nichts an der nicht funktionierenden, 
zweiten Counter-Instanz (die übrigens die erste Instanz ist. Es wird 
immer die zweite Instanz im Simulator verwendet. Die "Verdrahtung" dahin 
stimmt scheinbar. Der Clock arbeitet, das LOAD-Signal wird übergeben und 
der LOAD-Wert wird auch übergeben, wird aber nicht übernommen).

> Mit welcher Testbench?
Mit der "eingebauten" ISim und dem realen Board + Scope(MSO4104).
Da funktioniert das Ganze im Prinzip schon fast wie gewollt.
Nur der zweite Zähler zählt halt nicht.

> Und dann: wozu unnötigerweise eine Variable für ein speicherndes
> Element?
Weil ich das genau so in einem VHDL-Grundkurs (vor einiger Zeit) gezeigt 
bekommen habe und es dort in der Übung so verwendet wurde.
Als Beginner muss ich davon aus gehen, dass das wohl richtig ist.

> Hast du die blinkende LED schon gemacht, und das Lauflicht?
Bei allem Respekt, aber hast Du Dir wirklich mein Programm angesehen?
Das ist nämlich die blinkende LED (als "Lebenszeichen" des Boards)auch 
mit dabei.

> BTW: über Teiler werden in FPGAs keine (zusätzlichen) Takte erzeugt!
Nun, hab schon in diversen Systemen, in die ich "hineinschnuppern" 
durfte, gesehen. Die hatten sich für alle möglichen Funktionen 
verschieden, vom Systemclock abgeleitete, Clocks erzeugt.
Mit dem Thema werde ich mich aber ganz sicher noch gesondert 
auseinandersetzen müssen!

Aber warum funktioniert die Instanziierung des Counters nicht, wie 
gewünscht?

Danke und Gruß,
Duesentrieb72

von Ralf (Gast)


Lesenswert?

>Mit der "eingebauten" ISim und dem realen Board + Scope(MSO4104).
>Da funktioniert das Ganze im Prinzip schon fast wie gewollt.
>Nur der zweite Zähler zählt halt nicht.

Woher weisst du das?

>Aber warum funktioniert die Instanziierung des Counters nicht, wie
>gewünscht?

Woher sollen wir das wissen, wenn du uns nur ein Teil deines
Quellcodes zeigst.
Vielleicht liegt der Fehler in Clk_Gen_48MHz.

Also bitte auch die restlichen Teile sowie eine ordentliche
Testbench dazu, dann kann man auch nach Fehler suchen.


Ralf

von Frank M. (duesentrieb72)


Angehängte Dateien:

Lesenswert?

Hallo Ralf,

> Woher weisst du das?
Das lässt sich im ISim beobachten.
Im entsprechenden (richtigen) Zähler wird das LOAD-Signal wird auf '1' 
gesetzt, der LOAD-Wert wird richtig gesetzt und der CLOCK auch 
getoggelt, aber es wird nicht die Instance1, sondern Instance2 (links, 
schwarz markiert, beim Step-by-Step-Durchlauf) wird ausgeführt. Der 
LOAD-Wert wird nicht in der Instance1 als Zählerstand übernommen.

> Woher sollen wir das wissen, wenn du uns nur ein Teil deines
> Quellcodes zeigst.
> Vielleicht liegt der Fehler in Clk_Gen_48MHz.
Der Clk_Gen_48MHz ist ein IP Core (Clocking Wizard), der scheinbar 
richtig funktioniert. Vom 100MHz System-Clock werden 48MHz erzeugt.
Habe mir das Signal auch mal auf einen Pin geschaltet und mit dem Scope 
betrachtet.
Das Signal "adc_clk", was dieser ausgibt, wird im ISim auch richtig 
angezeigt.

> Also bitte auch die restlichen Teile
Ausser der Testbench, dem UserType und dem IP Core gibts' nicht mehr.
Was braucht Ihr da noch?

> sowie eine ordentliche Testbench dazu
Habe ich angehangen.
Ob die allerdings "ordentlich" ist, kann ich leider nicht beurteilen.
Ich bekomme zumindest die Signale soweit (recht plausiebel)im ISim 
angezeigt.

Bitte verteht mich nicht falsch, ich bin für jede Hilfe sehr dankbar.

Danke und Gruß,
Duesentrieb72

von T. M. (xgcfx)


Lesenswert?

Frank M. schrieb:
> Das Ergebnis in der Simulation ist leider, dass immer nur eine Instanz
> des Zählers verwendet wird, obwohl die Signale zur anderen Instanz
> zeigen...

Mhm, was meinst du damit?

Ich habe eben mal deinen Code aufgeräumt, eine Testbench geschrieben, 
den ominösen ClockGenerator auskommentiert und mit ghdl simuliert. Ich 
sehe da 2 Instanzen, die sich auch unterschiedlich verhalten. Also muss 
dein  Fehler irgendwo anders liegen.

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


Lesenswert?

Frank M. schrieb:
>> Mit welcher Testbench?
> Mit der "eingebauten" ISim und dem realen Board + Scope(MSO4104).
Eine "Testbench" ist ein VHDL-Modul (entity), die keine Ports nach 
aussen hat. Da steht dann gern so ein tb_ davor. Sieh dir z.B. mal den 
http://www.lothar-miller.de/s9y/categories/45-SPI-Master an. Dort ist 
die zweite Datei die Testbench.

> Nun ja, das wird exakt so im Xilinx IP Core Generator verwendet.
Tja, dumm, sowas...

> Nun, hab schon in diversen Systemen, in die ich "hineinschnuppern"
> durfte, gesehen. Die hatten sich für alle möglichen Funktionen
> verschieden, vom Systemclock abgeleitete, Clocks erzeugt.
Aber hoffentlich nicht einfach durch einen Zähler abgeleitet, sondern 
über PLL oder DCM generiert.

>> Und dann: wozu unnötigerweise eine Variable für ein speicherndes
>> Element?
> Weil ich das genau so in einem VHDL-Grundkurs (vor einiger Zeit) gezeigt
> bekommen habe und es dort in der Übung so verwendet wurde.
Reines Interesse: wer hat den Kurs gegeben? Wurde da was zur Verwendung 
von Variablen und die resultierende Gefahr gesagt?

Wichtig (ganz wichtig!) ist aber, dass dir klar ist:
        >>>>   VHDL ist nicht FPGA!   <<<<

In einem VHDL Kurs kannst du vieles lernen, was VHDL kann. Und vieles 
davon kannst du oder darfst niemals in einem FPGA umsetzen. Ich schreibe 
dir eine geläufige VHDL-Zeile, die kein Synthesizer auf ein FPGA 
bekommt:
1
    wait for 1 ms;



EDIT: zu spät abgeschickt...  :-(

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


Lesenswert?

Frank M. schrieb:
> Der Clk_Gen_48MHz ist ein IP Core (Clocking Wizard), der scheinbar
> richtig funktioniert.
Siehst du in der Waveform was auf der adc_clk Leitung wackeln?

von Frank M. (duesentrieb72)


Lesenswert?

> Siehst du in der Waveform was auf der adc_clk Leitung wackeln?
Ja, genau so, wie gewünscht.

von Frank M. (duesentrieb72)


Lesenswert?

Noch ein Nachtrag:

Habe eben, eher zufällig, die Simulation länger betrachtet.
Ich lasse ja eine Schrittkette ablaufen.
Beim betrachten mehrere Schritten-Durchläufe fällt auf, dass bei jedem 
zweite Durchlauf richtig gezählt wird.
Habe leider bisher immer nur den ersten Durchlauf betrachtet und 
festgestellt, dass nicht richtig gezählt wird.
Das ändert das Bild klar.
Habe den Grund zwar noch nicht gefunden, aber es stellt das ganze 
Prinzip nicht mehr in Frage!

Sorry, das war klar meine (Anfänger-?)Fehler! :(

von Frank M. (duesentrieb72)


Lesenswert?

Nochmals herzlichen Dank an Euch für Eure Hilfe,

ich muss leider feststellen, dass ich bei VHDL und FPGA noch seeehr viel 
(in seeehr kurzer Zeit) lernen muss :(
Das ist doch eine ganz andere Welt für mich, in der ich mich erst 
zurechtfinden muss!

Es ist, wie Ihr schon vermutet hattet, nicht ein Problem der 
Instanziierung der Komponente "Counter", sondern ein Timing-Problem.
Die beiden Zähler werden schon richtig angesprochen, nur (manchmal) zum 
falschen Zeitpunkt.

Ich habe die beiden Timing-Diagramme verglichen und klar ein 
Timing-Problem ausmachen können!
Da muss ich das Ganze noch einmal komplett überdenken!
Zumindest weiss ich jetzt, in welche Richtung ich arbeiten muss...

Ich hoffe, Ihr verzeiht einem Anfänger ;)

Danke und Gruß,
Duesentrieb72

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.