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
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...
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
>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
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
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.
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... :-(
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?
> Siehst du in der Waveform was auf der adc_clk Leitung wackeln?
Ja, genau so, wie gewünscht.
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! :(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.