zu wenig LED's/Anzeigen auf dem Altera-/Intel-Board?

OP #5816296
Lesenswert?

... kein Problem. Braucht's nicht.

Die Intel-/Altera-FPGAs können das USB-Blaster Interface als 
jtag-Terminal benutzen, man kann also einfach Debug-Ausgaben an den 
Host-Rechner zurückschicken. Mit dem Qsys-/Nios-Geraffel wird das auch 
fleissig benutzt, leider hat Altera/Intel "vergessen" zu dokumentieren, 
wie man das Interface mit "normalem" VHDL nutzen kann:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4

5
entity jtag_uart is
6
    generic
7
    (
8
        LOG2_RXFIFO_DEPTH               : natural;
9
        LOG2_TXFIFO_DEPTH               : natural
10
    );
11
    port
12
    (
13
        clk                             : in std_ulogic;
14
        reset_n                         : in std_ulogic;
15

16
        rx_data                         : out character;    -- received data
17
        rx_ready                        : out std_ulogic;   -- received data valid
18
        rx_data_req                     : in std_ulogic;    -- ask for data
19
        rx_paused                       : out std_ulogic;   -- receive paused
20

21
        tx_data                         : in  character;    -- data to send
22
        tx_start                        : in  std_ulogic;   -- start sending data
23
        tx_idle                         : out std_ulogic    -- we are not busy sending
24
     );
25
end entity jtag_uart;
26

27
architecture rtl of jtag_uart is
28
    component alt_jtag_atlantic
29
        generic
30
        (
31
            INSTANCE_ID                 : integer := 0;
32
            LOG2_RXFIFO_DEPTH           : integer := 0;
33
            LOG2_TXFIFO_DEPTH           : integer := 0;
34
            SLD_AUTO_INSTANCE_INDEX     : string := "YES"
35
        );
36
        port
37
        (
38
            clk                         : in std_ulogic;
39
            rst_n                       : in std_ulogic;
40
            
41
            r_dat                       : in character;                         -- data to send
42
            r_val                       : in std_ulogic;                        -- data is valid
43
            r_ena                       : out std_ulogic;                       -- allow to send data
44
            
45
            t_dat                       : out character;                        -- incoming data
46
            t_dav                       : in std_ulogic;                        -- give us more data
47
            t_ena                       : out std_ulogic;                       -- received data available
48
            t_pause                     : out std_ulogic
49
        );
50
    end component alt_jtag_atlantic;
51

52
begin
53
    i_jtag_uart : component alt_jtag_atlantic
54
        generic map
55
        (
56
            INSTANCE_ID                 => 0,
57
            LOG2_RXFIFO_DEPTH           => LOG2_RXFIFO_DEPTH,
58
            LOG2_TXFIFO_DEPTH           => LOG2_TXFIFO_DEPTH,
59
            SLD_AUTO_INSTANCE_INDEX     => "YES"
60
        )
61
        port map
62
        (
63
            clk                         => clk,
64
            rst_n                       => reset_n,
65

66
            -- alt_jtag_atlantic ports have _very_ strange (backwards) names...
67
            
68
            -- this is the receiving part of alt_jtag_atlantic, the ports
69
            -- we actually *send* data to
70
            r_dat                       => tx_data,
71
            r_val                       => tx_start,
72
            r_ena                       => tx_idle,
73

74
            -- this is the sending part of alt_jtag_atlantic, i.e. the ports
75
            -- we receive data from
76
            t_dat                       => rx_data,
77
            t_dav                       => rx_data_req,
78
            t_ena                       => rx_ready,
79
            t_pause                     => rx_paused
80
        );
81
end architecture rtl;

Mit dieser Komponente kann man Daten (character) über die (ja sowieso 
vorhandene JTAG-Anbindung) an den Host schicken und mit dem (etwas 
versteckten) Programm "nios2-terminal" anzeigen lassen.
Wenn einem die Anzeige nicht paßt, kann man auch eine eigene bauen.

Mir unerklärlich, warum Intel das nicht dokumentiert - schließlich ist 
das ein sehr brauchbares Feature...
Angehängte Dateien:
Gast #5816655
Lesenswert?

FPGA zum Spass schrieb im Beitrag #5816492:
> Markus F. schrieb:
>> Wenn einem die Anzeige nicht paßt, kann man auch eine eigene bauen.
>
> Und wie?
> Gibts Sourcecode für den PC?
>
> Ich würde das gerne nutzen, aber nicht als Anzeige sondern als RS232
> Ersatz.

Dann schau dir mal das hier an:
http://idle-logic.com/2014/07/12/virtual-com-port-connection-de0-nano-vj-uart/
und das hier:
http://idlelogiclabs.com/2012/04/15/talking-to-the-de0-nano-using-the-virtual-jtag-interface/
Gast #5937246
Lesenswert?

Nein, kein Terminal, echten Datentransfer mit höheren Datenraten als 
RS232 aus eigener Applikation heraus.

Hat sich aber erledigt, nutze jetzt ein FTDI PMOD mit 3 fliegenden 
Drähten auf Stiftleiste verbunden(TX/RX/GND).
Für ~10€ bekomme ich so echte ~250Kbyte/s bei Blocktransfers mit 
geringstmöglichem Programmieraufwand.
Gast #5937599
Lesenswert?

Der FT232h kann 480 Mbit/s, allerdings wird das mit fliegenden Drähten 
sicherlich schwierig, außerdem wirst du das nicht gemeint haben.

Über die JTAG Leitung lassen sich theoretisch 12Mbit erreichen bei dem 
USB-Blaster.
Praktisch habe ich das aber noch nicht gesehen.
Auch das Demo Tool von Terasic, was beim DE2-115 dabei ist, erreicht das 
nichtmal im Ansatz.

Das Demo-Github Projekt hat leider genau bei hohen Datenraten offene 
Probleme.

Hat denn mal jemand tatsächlich solche Datenraten damit erreicht?
Wenn ja wechsle ich liebend gerne.
OP #5937609
Lesenswert?

FPGA zum Spass schrieb im Beitrag #5937599:
> Hat denn mal jemand tatsächlich solche Datenraten damit erreicht?
> Wenn ja wechsle ich liebend gerne.

Etwa 1 MB/s (MAX 10 mit USB-Blaster auf dem Board) sind drin, wenn ich 
mich nicht verrechnet habe. Das verlinkte github-Projekt scheint sich 
mit den Handshake-Signalen bei hohen Datenraten irgendwie zu verheddern, 
das ist mir mit meinem eigenen Code noch nicht passiert: 
https://github.com/mfro0/jtag_terminal
Gast #5938474
Lesenswert?

Markus F. schrieb:
> Etwa 1 MB/s (MAX 10 mit USB-Blaster auf dem Board) sind drin, wenn ich
> mich nicht verrechnet habe...das ist mir mit meinem eigenen Code noch nicht 
passiert:
> https://github.com/mfro0/jtag_terminal

Du nutzt aber auch keine hohen Datenraten, oder?

Ich glaub, ich werds dann doch mal selbst probieren müssen was man 
rausholen kann.

Wenn ich 200Kbyte/s erreiche würde ich schon nutzen, dann brauch ich das 
frei fliegende PMOD nicht mehr....auch wenn ich ungern damit von Altera 
abhängig werde.
OP #5938505
Lesenswert?

FPGA zum Spass schrieb im Beitrag #5938474:
> Du nutzt aber auch keine hohen Datenraten, oder?

ich hab's nur einmal mit einem kleinen Testprogramm den Durchsatz 
gemessen und kam dabei - wenn ich mich nicht täusche - wie oben 
beschrieben auf etwa 1 MB/s.

Das Programm ist auch auf github.
Gast #5939103
Lesenswert?

Kannst du mir bitte mal verraten was das für ein Protokoll sein soll?

Ich habe jetzt einfach mal nur den rx_data Port mit 8 LEDs verbunden, 
weil ich davon ausgegangen bin das bei "character" 8 Bits pro 
Lesezugriff rauskommen.

Ergebnis:

Wenn ich mit dieser Schleife jedes mögliche Byte runter schreibe, dann 
kommt ab und zu mal 1 an und meistens 0.
Hä?


Allgemein, das man nichtmal zum alt_jtag_atlantic Doku findet...
Kann ich überhaupt 100 Mhz als clk benutzen?
Darf man, so wie du das machst wirklich dauerhaft rx_data_req auf 1 
lassen bis etwas kommt?
1
while (true)
2
{
3
   for (int i = 0; i < 255; i++)
4
   {
5
      char* sendbytes = new char[1];
6
      sendbytes[0] = i;
7
      jtagatlantic_write(atlantic, sendbytes, 1);
8
   }
9
}
OP #5939168
Lesenswert?

FPGA zum Spass schrieb im Beitrag #5939103:
> Kann ich überhaupt 100 Mhz als clk benutzen?

ich denke, man kann.

> Darf man, so wie du das machst wirklich dauerhaft rx_data_req auf 1
> lassen bis etwas kommt?
> while (true)
> {
>    for (int i = 0; i < 255; i++)
>    {
>       char* sendbytes = new char[1];
>       sendbytes[0] = i;
>       jtagatlantic_write(atlantic, sendbytes, 1);
>    }
> }

ich denke, das kann so nicht wirklich funktionieren, ohne den Empfänger 
bzw. den Sendepuffer zu überfahren.

Du solltest den Rückgabewert von jtagatlantic_write() abfragen und wenn 
der 0 oder -1 ist, nochmal versuchen, zu senden.

Jedenfalls sehe ich keine andere Möglichkeit zu ermitteln, ob die andere 
Seite empfangsbereit ist/war.
Gast #5939209
Lesenswert?

ich lasse das im Einzelschritt im Debugger laufen, 1 Byte alle paar 
Sekunden, im FPGA wird dauerhaft versucht zu lesen, genau wie in deinem 
jtag_terminal_cy3.vhd

Sehe nicht wie es da überfahren könnte....

Den Rückkanal bekomme ich auch nichts ans laufen, da ist nie ein Byte 
drinne.

Keine Ahnung woran das liegt...
- vielleicht an meinem Board(DE2-115 mit Cyclone 4)
- vileleicht daran, das ich auf Windows mit Quartus 11 arbeite
- vielleicht daran, das ich  mir die jtag_atlantic.lib aus der .dll 
selbst erzeugen musste

Das einzige was aktuell geht ist das jtagatlantic_open, was nur dann 
nicht null zurückliefert wenn im FPGA tatsächlich der Core drin ist.
OP #5939243
Lesenswert?

FPGA zum Spass schrieb im Beitrag #5939209:
> ich lasse das im Einzelschritt im Debugger laufen, 1 Byte alle
> paar
> Sekunden, im FPGA wird dauerhaft versucht zu lesen, genau wie in deinem
> jtag_terminal_cy3.vhd
>
> Sehe nicht wie es da überfahren könnte....
>
Das war in deinem Post nicht erkennbar.

> Den Rückkanal bekomme ich auch nichts ans laufen, da ist nie ein Byte
> drinne.
>
Du tust aber schon was rein, oder?


> - vileleicht daran, das ich auf Windows mit Quartus 11 arbeite
> - vielleicht daran, das ich  mir die jtag_atlantic.lib aus der .dll

Keine Ahnung. Ich selbst habe (Linux) Quartus 13.0, 13.1 und 18.1 
erfolgreich getestet. Funktioniert das nios2-terminal (das dieselbe 
Funktionalität verwendet) bei dir bzw. gibt's das in der 11 überhaupt 
schon?
Gast #5939456
Lesenswert?

Naja, das Terasic Demo Tool was beim Board dabei ist läuft über die 
Schnittstelle.
Das verwendet allerdings andere DLLs.

Markus F. schrieb:
> Funktioniert das nios2-terminal

Weiß ich nicht, kenne ich nicht.


Markus F. schrieb:
> Du tust aber schon was rein, oder?

Ja, wobei vielleicht zu schnell, immer wenn IDLE = '1'. Selbst wenn das 
zu schnell ist, dann sollte aber zumindest mehr wie Garnichts ankommen.

Ich probiere jetzt mal noch exakt dein Design für das DE2-115 
umzusetzen. Wenns auch nicht geht lad ichs als zip hoch, vielleicht 
sieht ja jemand was.
OP #5939864
Lesenswert?

Nicht beim eben mal drübergucken - sieht aus wie das, was bei mir 
funktioniert.

Möglicherweise ist dein Quartus (jtag libs) tatsächlich zu alt?

Hast Du mal in die Release Notes der Folgeversionen reingeschaut, ob da 
die Behebung eines jtag-Fehlers beschrieben ist?
Gast #5940194
Lesenswert?

FPGA zum Spass schrieb im Beitrag #5939494:
> So, habs jetzt nochmal mit dem Loopback aus jtag_terminal_cy3 probiert.

In Deinem Code lese ich was von "JTAGATLANTIC". Dieses Atlantic ist m.W. 
der allererste Bus den Altera in einem SOPC verwendet hat.

Warum lese ich erst heute von solchen Ausgabeoptionen?
Gast #5940759
Lesenswert?

Wollte mich erstmal für die schroffen Antworten gestern entschuldigen.
War etwas genervt, weil so etwas scheinbar einfaches soviele Probleme 
macht.

Schade das du auch nichts siehst, hatte noch die Hoffnung das ich 
irgendwo zu blind war.

Ich bin mir aber sicher das dein Code funktioniert, das tut er 
schließlich auch bei Anderen, also liegt der Fehler bei mir oder 
Quartus11 oder Windows oder was auch immer.

Wäre ich noch auf dem alten, lahmen rs232, dann wäre mein Druck groß 
genug jetzt weiter zu forschen, aber so werde ich hier aufgeben. Es 
bleibt leider im Hobby nicht unendlich viel Zeit.

Trotzdem danke für die Hilfe. Sollte ich es mal irgendwann es schaffen 
auf Linux zu wechseln, dann probiere ich es noch einmal. Sollte anhand 
der verfügbaren Quellen ja dann wenig Aufwand sein.
Gast #5957284
Lesenswert?

Hallo,

ich hatte gestern Zeit um nochmals an dem Problem mit Q18.x 
weiterzuarbeiten.

Der Fehler der von der libjtagatlanic.dll zurkommt ist

"No UART matching the specified device/instance" und nicht der in meinem 
früheren Betrag erwähnte (Falsche Dekodierung Zahl => Ausgabe).


Aus Experimenten mit dem Core habe ich festgestellt, dass ab der Q18.x 
das Generic SLD_AUTO_INSTANCE_INDEX anscheinend keine Verwendung mehr 
hat bzw. immmer SLD_AUTO_INSTANCE_INDEX="YES" angenommen wird.

Ich hatte meinen Core mit SLD_AUTO_INSTANCE_INDEX="NO" und 
INSTANCE_ID=253
parametrisiert. Unter Q<=17.x hat das problemlos funktioniert. Sprich 
ich konnte mit dem Index 253 bei der Funktion jtagatlantic_open(0, -1, 
253) arbeiten.

Wie schon erwähnt funktioniert das bei Q18.x nicht mehr und ich muss 0 
verwenden. Füge ich noch z.B. einen jtag_uart Core hinzu (verwendet 
intern auch ein alt_jtag_atlantic Core), hat dieser den Index 1.

Q18 scheint einfach den Index um 1 zu erhöhen, sobald ein File mit eine 
Core in der Synthes verarbeitet wird.

Ich kann mich erinnern, das Quartus X in einem Report gezeigt wie die 
Kodierung ist. Finde das aber bei Q18.x nicht.
OP #5957578
Lesenswert?

Ehrlich gesagt habe ich nie probiert, einen JTAG UART mit einem 
speziellen Index zu erzeugen.

In der 18.1-Dokumentation (z.B. bei altsource_probe, das ja 
wahrscheinlich denselben Mechanismus verwendet) ist 
SLD_AUTO_INSTANCE_INDEX allerdings noch dokumentiert. Dort steht auch, 
dass das ignoriert (und stattdessen ein fortlaufender Index vergeben) 
würde, wenn es jenen schon im Design gibt.

Kann es sein, dass das bei dir der Fall ist?

Für die 18.1 (die ich übrigens - was die Qualität angeht - nicht 
unbedingt für Intel's Glanzstück halte) gibt es mittlerweile einen 
ziemlich dicken Patch - hast Du den installiert?
Gast #5957978
Lesenswert?

Den von Dir in der Doku gefundenen Hinweis beschreibt gerade mein 
Verhalten. Danke !
Ich habe den aktuellsten Patch installiert, das Verhalten ist laut 
deinem Hinweis korrekt.

Blöd ist, dass der meiner Meinung nach hilfreiche Core in keiner Doku 
offizeiell erwähnt wird.Sonsr wäre mir das veilleicht selbst 
aufgefallen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren