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


von Petra K. (petra)


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

von Morin (Gast)


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).

von Petra K. (petra)


Angehängte Dateien:

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

von Morin (Gast)


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?

von Petra K. (petra)


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

von Morin (Gast)


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.

von Petra K. (petra)


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

von bko (Gast)


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.

von Felix (Gast)


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

von Petra K. (petra)


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

von Robert Beekhuijzen (Gast)


Lesenswert?

Hallo Petra,

Ich bin auf der Suche nach eine File"NEXYS_PBLAZE" dat gehört zu eine 
Artikel auf www. echelonembedded.com. Leider is die Website 
verschwunden. Der einzige Link den ich zu diesen fFile gefunden habe 
führte mich zu diese Seite.

Wenn du diesen File nog besizts, kan Ich davon eine Kopie bekommen?

Mit Freundlichem Gruß,

Robert

P.S.
Entschuldige mein Deutsch, ist schon lange her...

von Duke Scarring (Gast)


Lesenswert?

Robert Beekhuijzen schrieb:
> Ich bin auf der Suche nach eine File"NEXYS_PBLAZE" dat gehört zu eine
> Artikel auf www. echelonembedded.com.
Bei Webarchive finden sich von der Webseite nur Fragmente:
http://web.archive.org/web/*/http://echelonembedded.com/*

Aber die Picoblaze-Dateien gibt es hier:
https://www.xilinx.com/products/intellectual-property/picoblaze.html#design

Die Anpassung an das Nexys-Board sollte nicht schwierig sein.
Wenn es dabei Probleme gibt, eröffne bitte einen neuen Beitrag mit 
folgenden Punkten:
- Was möchte ich erreichen?
- Was habe ich bisher dafür getan?
- Welches unlösbare Problem trat dabei für mich auf?

Duke

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.