mikrocontroller.net

Forum: FPGA, VHDL & Co. Verständnisfrage: SW->PicoBlaze->HDL->FPGA


Autor: Petra K. (petra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leidensgenossen und Profis,

mein erstes eigenes Design läuft natürlich nicht!
Mal in Kurzform wie ich es verstanden habe, von einem Programm auf dem 
Picoblaze schließlich die Hardware im Spartan anzusprechen.
Einfache Aufgabe: Die LEDs des 3A Starter Kits anzusprechen:

Da gibt es erst mal die UCF-Datei zum Projekt, die mir beschreibt, 
welche Pins des FPGA wofür verwendet werden (geklaut aus der 
"s3astarter.ucf"):
NET "LED<0>"        LOC = "R20"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | 
SLEW = SLOW
...
NET "LED<7>"        LOC = "W21"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | 
SLEW = SLOW ;

Jetzt muß ich im meinem (Verilog) Top-Modul die Schnittstelle 
beschreiben:
module test_led (
   ...
  output wire  [7:0] LED,
   ...
  );
Damit müsste die Verknüpfung zu den HW-Pins geschaffen sein.
Weiterhin in diesem Modul beschreibe ich ein Register, das mir die Daten 
hält:
 reg   [7:0] led_out;
und weise es den Pins zu:
 assign LED = led_out;
jetzt sorge ich dafür, dass dieses Register aus PicoBlaze über einen 
"output"-Befehl (Port 0x27) geschrieben werden kann:
  always @(posedge clk)
  begin
    if (write_strobe)
    begin
      if (port_id == 8'h27) led_out <= out_port;
    end
  end
"port_id", "write_strobe", "out_port" sind dabei in der Schnittstelle zu 
PicoBlaze definiert.
(Teilweise aus "boarddemo" übernommen)

Natürlich funkts nicht, hatte ich aber auch nicht ernsthaft erwartet.
Nur - was habe ich falsch beschrieben?
(Ich wäre schon glücklich, wenn ich das irgendwo mal "am Stück" eklärt 
finden würde.)

Vielen Dank, viele Grüße
Petra

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Überlegungen sind soweit richtig, aber aus den Codeschnipseln kann 
man so noch nicht genug rauslesen. Wenn möglich poste bitte mal die 
Verilog-Dateien, UCF und Picoblaze-Assembler-Quellcode (ausgenommen die 
HDL-Datei für den Picoblaze selbst, die ist bekannt und darst du nicht 
posten).

Autor: Petra K. (petra)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Morin,

ich habe nichts anderes gemacht als den "Terminal"-Teil aus dem 
"boarddemo"-Projekt für das 3A Starter Kit gemommen und leicht 
modifiziert bzw. gekürzt.
Auch vermute ich, dass Assemblierung und Impact richtig arbeiten, ich 
bekomme nach jedem Lauf unterschiedliche Ergebnisse. Mal brennt eine 
LED, mal reagiert sogar eine auf eine Taste, aber es funktioniert nicht 
so wie gedacht.

Im ZIP sind die UCF, das Top-Modul und ein kurzes PicoBlaze-Programm. Im 
Top-Modul habe ich die ergänzten Zeilen mit einen "/*PK*/" vorweg 
markiert.

Viele Grüße
Petra

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich das sehe:

In deinem Assembler-Programm liest du von Port 25h und schreibst das 
Ergebnis nach Port 27h, und das immer wieder. Port 25h kommt von 
Keyboard-Controller. Du bekommst also in schneller abfolge die Scancodes 
vom Keyboard auf den LEDs zu sehen, und danach nichts mehr (genau 
genommen: das was der Keyboard-Controller ausgibt wenn er leer ist).

War das so gedacht, dass die LEDs vom Keyboard gesteuert werden?

Autor: Petra K. (petra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Morin,

danke für Deine Mühe.
Richtig, im Programm ist der falsche Port angesteuert, die typische 
Betriebsblindheit, wenn man tagelang rumprobiert.
Jetzt habe ich den Port 20 eingesetzt, für die Switches.
Leider funktioniert es eben so wenig, es brennt nur LD2 permanent, alle 
anderen sind aus.
Eine einfache Ausgabe eines hochzählenden Registers auf die LEDs klappt 
im übrigen auch nicht, daher vermute ich, dass schon in der Ausgabe auf 
die LEDs eine Macke ist.

Viele Grüße
Petra

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm langsam gehen mir die Ideen aus. Leider hab ich auch kein solches 
Board und kann es deshalb nicht ausprobieren. Poste zur Sicherheit mal 
das Programm mit dem Zähler - ich habe mehr Hoffnung, das zum Laufen zu 
bringen, weil die Switches als Fehlerquelle ausgeschlossen sind.

Autor: Petra K. (petra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nun ja, wirklich nicht weiter schwer:

CONSTANT switches         , 20    ; switch input port
CONSTANT led_out          , 27    ; led control
;;====================================================================== 
======
loop:
                LOAD     s0, switches
                OUTPUT   s0, led_out
                JUMP     loop

Inzwischen habe ich auch einfach nur eine Schleife laufen lassen, die s0 
incrementiert und auf "led_out" ausgibt, auch hie rpassiert nicht das 
gewünschte:

loop:
                ADD      s0, 01
                OUTPUT   s0, led_out
                JUMP     loop

Vermutlich habe ich irgendwo einen ganz anderen Fehler gemacht, z.B. in 
der Initialisierung des PicoBlaze oder in der Takt-Erzeugung.
Dass noch ein Fehler im Handling auf dem Weg vom Assemblieren bis zur 
Erzeugung des bit-Files liegt schließe ich langsam aus, das habe ich 100 
Mal überprüft, auch nachgesehen ob sich der Inhalt ändert, wenn ich die 
Sourcen geändert habe, aus dem Spartan zurückgelesen und verglichen usw.

Was ich auch nicht verstehe: Es muß doch irgendwo in diesem ganzen 
Internet einige einfache Beispiel-Projekte geben, an denen man sich 
orientieren kann.

Verzweifelte Grüße
Petra

Autor: bko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht läuft die DCM (DCM_SP) nicht richtig ?
Geb doch mal das Signal "locked" an einen (LED-)Pin
aus und schau nach ob es stabil auf 1 ist.
Genauer: nach dem Download ist "locked" auf 0, nach einigen
 externen Takten sollte es auf 1 wechseln und dann
 dort bleiben.
Wenn "locked" nicht 1 bleibt, dann stimmt evtl. um
die DCM was nicht.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
also der erste Versuch (die Schalter einlesen) kann so nicht 
funktionieren, da wurde für den Zweck ein falscher Befehl verwendet.

Die Zeile "LOAD s0, switches" lädt das Register s0 mit der Konstanten 
"switches", hier also 20h, deswegen leuchtet nur eine Led. Gebraucht 
wird aber "INPUT s0, switches" was dann das Register s0 mit den Daten 
vom Input 20h == "switches" lädt. Damit sollte der erste Versuch 
funktionieren.

Die zweite Sache mit dem Zähler schaut erstmal richtig aus und ich nehm 
auch einfach mal an, dass das Resultat stimmt. Nur wirklich zählen kann 
man da nichts sehen. Der Picoblaze läuft in dem Design mit 50 MHz, damit 
schafft der 25 MIPS. Also läuft der 8-bit-Zähler, der die Leds direkt 
bedient mit 3,125 MHz über. Das heißt das die acht Leds auf dem Board 
mehr als drei Millionen mal alle Zustände annehmen die möglich sind! 
Also ich könnte da auch nichts erkennen ;)

Versuch doch mal bei dem Zählerversuch eine Verzögerung einzubauen. Also 
zum Beispiel drei oder vier verschachtelte 8-Bit-Zähler die immer wenn 
einer überläuft den nächsten incrementieren. Also im Endeffekt ein 
wesentlich breiter Zähler. (Du musst es irgendwie zerlegen da der 
picoBlaze nur 8Bit-Register hat). Wenn du dann am langsamsten Zählerteil 
die Leds ankoppelst, dann siehst du auch das Zählen in einer menschlich 
erfassbaren Geschwindigkeit.

mfg Felix

Autor: Petra K. (petra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Zeile "LOAD s0, switches" lädt das Register s0 mit der Konstanten
Oh, das ist nun wirklich ein Anfänger-Fehler.

>Nur wirklich zählen kann man da nichts sehen.
Ja, das war mir denn doch klar. An den LEDs habe ich deswegen mit dem 
Oszi gemessen, ohne nennenswertes Ergebnis.

Gestern habe ich immerhin das NEXYS_PBLAZE Projekt auf dem Spartan 3A 
Starter Kit zum Laufen bekommen, durch anpassen der UCF. Funktionierte 
prächtig.
Heute hänge ich wieder dumm da, dieses Projekt,dass gestern lief, läuft 
heute nicht mehr, obwohl ich nichts verändert habe und inzwischen sogar 
alles nochmals von Anfang an neu aufgezogen habe.
Auch "Cleanup Project Files" habe ich nicht vergessen und mit einem 
zweiten Starter Kit gegengetestet.
Vielleicht sollte ich diesen Job aufhgeben.

Viele Grüße
Petra

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.