Forum: FPGA, VHDL & Co. MACHXO2 in system update


von Thomas W. (donka)


Angehängte Dateien:

Lesenswert?

Moin,

Ich wollte mir die Möglichkeit offenhalten einen MACHXO2 im System 
updaten zu können. Mangels genügend GPIO Ports, möchte ich das Schema im 
Anhang (Statt TDC sollte da TCK stehen) verwenden. Ich denke wenn man 
während des Normalbetriebes TMS auf '1' hält kann eigntlich nichts 
anbrennen weil der JTAG Controller im XO2 im Resetzustand verweilt. Das 
Wackeln der Signale an TCK und TDI sollte doch dann nicht stören. Oder 
habe ich da was übersehen?

von Pat A. (patamat)


Lesenswert?

Hallo Thomas,

als erstes: Du hast völlig Recht. Solange TMS auf '1' gehalten wird, 
bleibt oder kommt der TAP-Controller in den "TEST LOGIC RESET"-Zustand. 
In diesem Zustand können an TCK und TDI beliebige Signale anliegen ohne 
den TAP-Controller zu aktivieren. Auch TDO ist im Tristate-Zustand.

Ich bin jetzt nicht der große MachXO2-Spezialist, aber ich meine mich zu 
erinnern, dass es bei diesem Type eine externe Steuerleitung zum 
(de-)aktivieren des TAP-Controllers gibt. Nach Deaktivierung können die 
4 JTAG-Signale als ganz normale IOs verwendet werden. Das würde dir 
nochmals FGPA-IOs sparen.

Eine weitere Möglichkeit wäre, I2C fürs Firmwareupdate zu verwenden. 
Bräuchte nur 2 Leitungen.

Hth, Pat a Mat

von Lattice User (Gast)


Lesenswert?

Pat A Mat schrieb:

> Ich bin jetzt nicht der große MachXO2-Spezialist, aber ich meine mich zu
> erinnern, dass es bei diesem Type eine externe Steuerleitung zum
> (de-)aktivieren des TAP-Controllers gibt. Nach Deaktivierung können die
> 4 JTAG-Signale als ganz normale IOs verwendet werden. Das würde dir
> nochmals FGPA-IOs sparen.

Ja den Pin gibt es, aber nur wenn man JTAG in der XO2 Konfiguration 
disabled um die JTAG Pins selbst als IO's zu verwenden. Dann kann man 
mit diesem Pin die Funktion der 4 JTAG Pins zwischen IO und JTAG Mode 
umschalten.

Allerdings sind hier offensichtlich nicht die XO2 Pins knapp, sondern 
die am µC.

>
> Eine weitere Möglichkeit wäre, I2C fürs Firmwareupdate zu verwenden.
> Bräuchte nur 2 Leitungen.
>
Insgesamt sind trotzdem 5 Pins am µC nötig, hat aber den Vorteil dass 
I/O und Konfiguration unabhängig voneinander sind.
Wenn man noch andere I2C Devices auf dem Board hat, spart man natürlich.

von Thomas W. (donka)


Lesenswert?

Pat A Mat schrieb:

> ... Auch TDO ist im Tristate-Zustand.

Da war ich mir nicht sicher, da ich noch kein Dokument gefunden habe wo 
das geschrieben steht. Der IEEE Standard ist mir zu teuer nur um das 
rauszubekommen. Aber wenn dem so ist, da kann ich ja den TDO und 
Data_out auch zusammenlegen und bräuchte somit nur 4 GPIO Ports am µC.

Lattice User schrieb:
> Allerdings sind hier offensichtlich nicht die XO2 Pins knapp, sondern
> die am µC.

So ist es.

Gegenüber der Lösung mit I2C hätte meine vorgeschlagene Variante den 
Vorteil das sich damit auch ein jungfräulicher XO2 programmieren ließe.

: Bearbeitet durch User
von Lattice User (Gast)


Lesenswert?

Thomas W. schrieb:>
>
> Gegenüber der Lösung mit I2C hätte meine vorgeschlagene Variante den
> Vorteil das sich damit auch ein jungfräulicher XO2 programmieren ließe.

Auch ein jungfräulicher XO2 kann über I2C programmiert werden.
(und auch über SPI)

von Günter (. (dl4mea)


Lesenswert?

Lattice User schrieb:
> (und auch über SPI)

Genau das möchte ich machen: Ein MachXO2 über SPI von einem Atmel SAMxx 
aus programmieren.

Ich kenne "MachXO2 Programming and
Configuration Usage Guide"
http://www.latticesemi.com/~/media/Documents/ApplicationNotes/MO/MachXO2ProgrammingandConfigurationUsageGuide.pdf?document_id=39085
aber ich will nicht das JEDEC-File mit in den SAMxx einbinden. Meiner 
Meinung nach müsste es reichen wenn man nur das kleine Bitfile über SPI 
lädt. Die Zusatzinformationen im JEDEC-File, z.B. Feature Row, sollten 
sich ja nur ganz ganz selten ändern.

Hier
http://www.latticesemi.com/~/media/Documents/UserManuals/MQ/ProgrammingToolsUserGuide31.pdf?document_id=50445
im Kapitel "Slave SPI embedded" ist näheres beschrieben, aber der 
zugehörige Code (den man in 
\lscc\diamond\3.4\embedded_source\spiembedded findet, liest JEDEC und 
erscheint mir etwas aufgeblasen.

Hier:
Beitrag "Lattice MachXo2 embedded programming"
hat wohl schon mal einer ähnliches gefragt, aber es wurde nicht zuende 
gebracht.

Da ich hier sicher nicht der erste bin, wollte ich mal frage ob es 
irgendwo schon ein kleines Stück Code gibt, welches einfach nur das 
(kleine) MachXO2 Bitfile nimmt und über SPI in den MachXO2 reinlädt?

Ich habe die zitierten Quellen aufgrund ihres Umfangs nicht alle 
vollständig gelesen, allerdings gängige Suchmaschinen ausgiebig bemüht 
und nichts gefunden. Es kann also sein ich hab hier was übersehen, 
überlesen oder falsche Annahmen getroffen und bin daher auch dankbar 
wenn mich diesbezüglich weiterbringt.

Danke, Günter

von Lattice User (Gast)


Lesenswert?

Günter (dl4mea) schrieb:

> aber ich will nicht das JEDEC-File mit in den SAMxx einbinden. Meiner
> Meinung nach müsste es reichen wenn man nur das kleine Bitfile über SPI
> lädt. Die Zusatzinformationen im JEDEC-File, z.B. Feature Row, sollten
> sich ja nur ganz ganz selten ändern.
>

Das vom Diamomd erzeugte Bitfile ist für einen exterenen SPI Flash 
gedacht.

Das interne Flash muss Pageweise (je 16 Byte) programmiert werden, 
vielleicht erscheint es dir deswegen etwas umständlich.
Jede Zeile im Jedecfile ist genau 128 Bit, d.h. eine Page. Es hindert 
dich niemand daran, das in ein etwas kompakteres Format zu konvertieren.

von Thomas W. (donka)


Lesenswert?

Thomas W. schrieb:
> Pat A Mat schrieb:
>
>> ... Auch TDO ist im Tristate-Zustand.
>
> Da war ich mir nicht sicher, da ich noch kein Dokument gefunden habe wo
> das geschrieben steht. Der IEEE Standard ist mir zu teuer nur um das
> rauszubekommen. Aber wenn dem so ist, da kann ich ja den TDO und
> Data_out auch zusammenlegen und bräuchte somit nur 4 GPIO Ports am µC.

Das habe ich dann auch mal ausprobiert und zu meiner Überraschung 
festgestellt, dass an Data_out auch weiterhin aktiv Signale getrieben 
werden obwohl sich der XO2 im JTAG-Mode befindet (TMS ist Low). Somt ist 
schon die Abfrage der Device ID fehlerhaft. Ich dachte bisher, dass sich 
während des Programmiervorgangs alle User I/O's im Tristate Zustand 
befinden sollten. Oder kann man diesen Zustand irgendwie erzwingen?

von Lattice User (Gast)


Lesenswert?

Thomas W. schrieb:
> Thomas W. schrieb:
>> Pat A Mat schrieb:
>>
>>> ... Auch TDO ist im Tristate-Zustand.
>>
>> Da war ich mir nicht sicher, da ich noch kein Dokument gefunden habe wo
>> das geschrieben steht. Der IEEE Standard ist mir zu teuer nur um das
>> rauszubekommen. Aber wenn dem so ist, da kann ich ja den TDO und
>> Data_out auch zusammenlegen und bräuchte somit nur 4 GPIO Ports am µC.
>
> Das habe ich dann auch mal ausprobiert und zu meiner Überraschung
> festgestellt, dass an Data_out auch weiterhin aktiv Signale getrieben
> werden obwohl sich der XO2 im JTAG-Mode befindet (TMS ist Low). Somt ist
> schon die Abfrage der Device ID fehlerhaft. Ich dachte bisher, dass sich
> während des Programmiervorgangs alle User I/O's im Tristate Zustand
> befinden sollten. Oder kann man diesen Zustand irgendwie erzwingen?

Wenn du die JTAG Pins als User I/O verwendest, wird JTAG in der Feature 
Row
abgschaltet, das betrifft alle 4 JTAG Pins einschliesslich TMS und TCK
Umschalten zwischen Usermode on JTAG-Mode tut man dann mit dem JTAGEN 
Pin.

von Thomas W. (donka)


Lesenswert?

Lattice User schrieb:
> Wenn du die JTAG Pins als User I/O verwendest, wird JTAG in der Feature
> Row
> abgschaltet, das betrifft alle 4 JTAG Pins einschliesslich TMS und TCK
> Umschalten zwischen Usermode on JTAG-Mode tut man dann mit dem JTAGEN
> Pin.

Ja das ist mir schon klar, dass man das so machen kann. Ist ja auch ein 
Super Feature bei diesen Bausteinen. Aber das bedingt, dass ich 5 
Leitungen dafür benötige. Ich wollte aber gerne mit nur 4 auskommen und 
habe deshalb den JTAG Pins jeweils ein User I/O parallel geschaltet.

Inzwischen habe ich auch einen Workaround für mein Problem gefunden. Der 
mit dem TDO verschaltete I/O muss halt initial Tristate sein. So kann 
die User Logic während des JTAG-Modes nicht mehr dazwischenfunken. Erst 
im Usermode, wenn über den dem TDI parallel geschalteten I/O "User 
Daten" kommen und die interne FSM synchronisiert ist, wird der Pin dann 
freigeschaltet. Somit läuft nun alles wie ich es wollte.

Danke an allen, die mit nützlichen Tipps geholfen haben.

von Lattice User (Gast)


Lesenswert?

Thomas W. schrieb:
> Lattice User schrieb:
>> Wenn du die JTAG Pins als User I/O verwendest, wird JTAG in der Feature
>> Row
>> abgschaltet, das betrifft alle 4 JTAG Pins einschliesslich TMS und TCK
>> Umschalten zwischen Usermode on JTAG-Mode tut man dann mit dem JTAGEN
>> Pin.
>
> Ja das ist mir schon klar, dass man das so machen kann. Ist ja auch ein
> Super Feature bei diesen Bausteinen. Aber das bedingt, dass ich 5
> Leitungen dafür benötige. Ich wollte aber gerne mit nur 4 auskommen und
> habe deshalb den JTAG Pins jeweils ein User I/O parallel geschaltet.
>

Ein nicht ganz unwesentliches Detail.

Der MachXO2 (und auch andere Lattice FPGA) schaltet die User Pins erst 
bei Empfang des ISC_ENABLE Commands auf Tri-State.

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.