Forum: FPGA, VHDL & Co. lattice ecp2 mico32 ram


von Ber P. (pfiff)


Lesenswert?

hi,

ich habe einen lattice ecp2 50e 672 in den ich den mico32 core einbinden 
möchte, weiters noch ein Ram welches im FPGA liegt auf das jedoch beide 
Seiten (FPGA und Mico32) Zugriff haben sollen.
Dieses Ram soll 8 bit Tief und min. 1k groß sein.
Kann mir irgendjemand vielleicht erklären wie man da beginnt bwz. ein 
example posten?
Bin FPGA Anfänger habe jedoch jahrelangen c Hintergrund...

Herzlichen Dank im Voraus
mfg
pfiff

von ROFL (Gast)


Lesenswert?

Ich nehme an du benötigst dafür ein "dual-port" RAM.
Unter "Tools"->"IPexpress"->"Module"->Memory_Modules" wirst du fündig.
Mit dem Button "Customize" stellst du das Modul auf die von dir 
benötigten Parameter ein.
ispLever bindet dir dann ein Template in dein Projekt ein, was du aus 
Verilog bzw. VHDL wie jedes andere Modul ansprechen kannst. Simulation 
ist damit auch möglich.
Beim Compilieren wird dann automatisch das FPGA RAM für dieses Modul 
verwendet.

von Ber P. (pfiff)


Lesenswert?

Hi,
erstmal vielen Dank für deine Antwort.
Ich habe schon ein Dual Port Ram mit IPexpress generiert und das .lpc 
file in mein Projekt eingebunden, habe jetzt aber das Problem das ich 
nicht weiß wie ich die Ports nun verdrahten muss/soll damit auch der 
Mico32 darauf Zugriff hat. Ich vermisse irgendwie wo ich die Adresse des 
RAMs einstellen kann, oder denke ich da komplett falsch?
Im Mico32 gibts ja auch die Möglickeit ein RAM einzubauen wo die Adresse 
einstellbar ist, nur wie bringe ich das dann dem FPGA bei, damit er weiß 
wo er die Daten reinschreiben soll?!

Herzlichen Dank,
pfiff

von ROFL (Gast)


Lesenswert?

Naja, ich glaube du bist mental noch nicht so ganz darauf eingestellt, 
dass du hier die Hardware an sich zusammenbaust.
Das RAM hat Adress- und Datenleitungen, die du mit deinen CPU modulen 
verknüpfen musst.
Die Anzahl der Adressen hängt dann davon ab, wieviele Adressleitungen du 
definiert hast (2^n).
Und es geht immer bei 0 los.

Der Trick um ein kleineren Speicherbereich in einen größeren Adressraum 
auf einem Bus einzuklinken besteht darin, die CS Leitung des RAMs auf 
eine hohe Adressleitung zu legen.

Ich glaube du müsstest dich erstmal prinzipiell etwas mit 
Computerhardwarearchitektur auseinandersetzen. Ist nicht so ganz einfach 
zu verstehen, wenn man von der Softwareseite kommt.

von Lupinus Digitalus (Gast)


Lesenswert?

Servus,

so schwierig ist das Ganze gar nicht. Der Mico32 spricht die Peripherie 
üer den Wishbone Bus an. D.h. dein Dual Port Memory braucht einen 
Wrapper, der für den einen Port die Wishbone Signale umsetzt und zudem 
den anderen Port nach oben führt.

Wenn Du das Memory in Verilog erzeugst bietet der MSB sogar eine 
graphische Menüführung an, um dieses Modul einzubinden. Die kannst Du in 
der MSB View im Fenster Available COMPONENTS (auf der linken Seite) mit 
dem Knopf "PFEIL nach unten" (IMPORT CREATE CUSTOM COMPONENT) starten.

Also kein Grund in der Mico32 Hardware selber rumzubasteln.

Gruss

Lupi

von Ber P. (pfiff)


Lesenswert?

Hallo,

ich habe das Dual Port Ram im FPGA aufgesetzt und es funkt sogar.
Habe jetzt natürlich mehrere Leitung wie z.B.: WrAddress, RdAddress, 
RdClock, WrClock, Q usw.
diese Signal sind mir von der Funktion her klar was sie machen.
Muss ich jetzt im Mico32 mit GPIO Ports die Verbindungen einzeln 
herstellen (also ein GPio Port mit 1 Bit für WrADdress usw, bzw. für Q 
16 Bit und für WrAddress und RdAddress 9 bit)?
Oder kann man das irgendwie anders machen?
Wenn ich diese Verbindung so mache wie oben beschrieben über GPIO's 
läuft das ganze dann schon über den Wishbone Bus?

Herzlichen Dank
mfg
pfiff

von Davor (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich brauche Hilfe zur Integration eines mico32 Mikroprozessors in ein 
fpga.
Ich habe zwar ein Tutorial, aber ich habe ein ganz anderes demoboard und 
somit kann ich nicht laut tutorial arbeiten.

Eigenschaften meines demoboards:
# EV-Board bestückt mit LFE2-12E-5TN144C
# TQFP-144 mit 0,5 mm Finepitch
# serielles 8MBit Flash
# externe Spannungsversorgung (5 - 20 V)
# linearer 3V3-Spannungsregler
# Step-Down-Converter für 1V2
# ext. 25 MHz Oszillator
# RS232 mit 2 RX und 2 TX
# 8 LEDs an einem Port
# 2V5 lin. Spannungsregler für LVDS
# 4 SMB-Buchsen für LVDS
# 3 Status-LEDs
# 2 Taster, 4-fach DIP-Schalter
# Verpolungsschutz
# JTAG (10pol + 8pol)


Dabei frage ich mich, welche Komponenten ich im MSB hinzufügen muss.
Im Tutorial wurde z.B. asynchron SDRAM hinzugefügt, den ich nicht habe
Ich weiß auch nicht, wie ich dazu ein c-programm schreiben soll
z.B. LEDTest - z.B. ein LED-Lauflicht

Ich bin kein guter c-programmierer und deshalb brauch ich hilfe.
Wenn es unter euch für das thema experten gibt, dann bitte ich euch um 
hilfe.


Ihr könnt mir eine E-mail schicken: davor_hrkac@hotmail.com

herzlichen Dank im voraus

Mit freundlichen grüßen

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Bernhard,

einiges ist einfacher als Du denkst, einiges aber auch etwas komplexer.

Es gibt prinzipiell 2 Möglichkeiten zur Lösung Deiner Aufgabe.

Variante 1:
Du erstellst mit IPExpress das Modul für das Dualport RAM. Im MSB vom 
MICO32 fügst Du den 'Asynchronous SRAM Controller' ein. Dort kannst Du 
auch die Basisadresse sowie den Adressbereich festlegen, in der Dein RAM 
liegen soll. An die Ports dieses SRAM Controllers kannst Du dann in 
Deinem Verilog Toplevel das Memorymodul anschließen. In diesem Fall 
"funktioniert" der SRAM Controller als Wishbonewrapper.

Variante 2:
Du programmierst ein eigenes Verilogmodul, welches Dein Dualport RAM 
enthält mit eigenem Wishboneslaveport (gut zum Lernen und auch zum 
Kopieren ist der "LatticeMico32 On-Chip Memory Controller", dort musst 
Du "nur" die PMI-RAM-Definitionen anpassen). Diese neue eigene 
Komponente kannst Du dann als Custom Kompomente im MICO32 einbinden. 
Eine sehr gute Anleitung zur Einbindung von Custom Komponenten ist seid 
SP1 im "LatticeMico32 Software
 Developer User Guide" ab S. 87ff (prinzipiell) und S.131ff (ein gutes 
Beispiel, mit wirklich allen kleinen Schritten, die notwendig sind) und 
NICHT im "Creating Components in LatticeMico32 System", ist verrückt, 
aber so ist es halt.

Wenn man dann mehrmals positive Erfahrungen mit Variante 2 gesammelt 
hat, dann möchte man es nie wieder anders machen.

Viele Grüße
Arndt

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Davor,

um ein Gefühl (und das erste Erfolgserlebnis) für den MICO32 zu 
bekommen, schlage ich vor, dass wir versuchen eine LED mit dem MICO32 
zum Blinken zu bringen (dann braucht man nur eine Minimalausstattung)

Es geht mit dem o.g. Board, allerdings kann das MICO32 System viel 
einfacher ausfallen!!!

Zuerst muss eine neue MICO32 Plattform angelegt werden (mit "Blank" 
starten). Diese sollte nur folgende Komponenten enthalten:
LM32 -> Ohne Caches, mit Debugport, kein Inline Memory
-> Location of Exception Handlers auf die Anfangsadresse des 
"On-Chip-Memorys" legen (0x00004000)
On-Chip-Memory -> 16kB
GPIO-Port -> Eine Augsangsleitung reicht

Nacheinander "A" "I" "D" "G" Buttons drücken, dann sollten alle Adressen 
korrekt vergeben und der Prozessor (als Verilogcode) erzeugt sein.

Den Verilogcode (im soc Verzeichnis die *.v Datei (nicht die *_inst.v)) 
dieses Prozessors im ispLever Projektnavigator als Verilogtoplevel 
einbinden.

Im Designplanner die 3 Leitungen (clk_i, reset_n, gpioPIO_OUT_0) am FPGA 
an den richtigen Pins anschließen, Spannungspegel angeben und globalen 
Takt für die Taktleitung angeben und speichern. Anschließend den 
kompletten Flow durchlaufen lassen (bis zum PROM-File).

Dieses Design kann dann in das FPGA geladen werden (als *.bit temporär 
oder mit dem *.mcs ins Flash mit dem FPGALoader). Dann ist der Prozessor 
tatsächlich schon real vorhanden und wartet nur noch auf seinen 
Programmcode.

Dazu im Mico32 ein Mico32 managed C Projekt anlegen, mit folgendem Code:
--
#include "DDStructs.h"
#include "LookupServices.h"
#include "stdio.h"
#include "MicoUtils.h"

int main(void)
{

    /* wir sind faul und lassen uns die Adresse geben */
  MicoGPIOCtx_t *led = (MicoGPIOCtx_t *)MicoGetDevice("gpio");

    // Blinkomat
  while(1){
    *((volatile unsigned int *)(led->base)) = 0x1;
    MicoSleepMilliSecs(100);
                *((volatile unsigned int *)(led->base)) = 0x0;
                MicoSleepMilliSecs(100);
                }
}
--

Dieses Programm compilieren und mit dem MICO32 Debugger hochladen 
(erfolgt automatisch in das BlockRAM des FPGAs) und ausführen lassen 
(nach dem Start die "play" Taste drücken).

Achja, obercool wird es, wenn man eine printf Zeile einfügt. Die printf 
Ausgaben erscheinen in der Console des Debuggers!!!!

Kombinieren lässt sich das dann auch noch mit dem Reveal, will heissen, 
man kann wirklich sehen, wie der Prozessor mit der Peripherie 
zusammenarbeitet.

Viel Erfolg
Arndt

P.S.:
Wenn das geklappt hat, kann man versuchen die anderen externen Memorys 
und IOs einzubinden.
--

von Davor (Gast)


Lesenswert?

DANKE
Ich bin bis zum Design Planner gekommen, doch nun komme ich nicht 
weiter, weil ich nicht weiß welche PINS ich anschließen soll.

Es werden Pins gefunden, welche leider nicht existieren (z.B.Pin M25 not 
found)

Wo kann ich sehen, welche pin ich anschließen muss?

Danke

von Ber P. (pfiff)


Lesenswert?

Hallo Arndt,
erstmal vielen Dank für deine Antwort.
Ich habe mittlerweile "meine" Version ausprobiert und die funktioniert 
ganz gut, habe das mit dem Sram Controller aber noch nicht ganz 
verstanden.
Wenn ich jetzt mit IPExpress ein DualPortRam erstelle sagen wir mal 
Adresstiefe 512 und Datentiefe 8 (muss DMX empfangen, sind 8 bit Daten 
und 512 Bytes gibts), dann auf Generate --> Fertig.
Die Einbindung habe ich im Top schon gemacht (mache aber in VHDL und 
nicht Verilog), funktioniert auch.
Wenn ich jetzt im Mico32 einen Asynchronous SRAM Controller einbaue, 
welche Adresse muss/soll ich dann einstellen? Ist die vorgegeben oder 
kann ich die frei wählen?
Wie kann ich dann über den Asynchronous SRAM Controller mein Ram 
ansprechen im Mico und im FPGA?
Wenn du ein Beispiel für eine RAM Einbindung hättest wär voll super 
wennst mir das schicken könntest!! (pfiff69@gmx.at)

Herzlichen Dank im Voraus
lg
Bernhard

von Davor (Gast)


Angehängte Dateien:

Lesenswert?

Hier habe ich einen Plan meiner Pinbelegung, doch welche Pins sind dabei
clk_i und reset_n?

Mit feundlichen Grüßen

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Davor

clk_i wäre Pin 14
reset_n wäre Pin 130 mit PULLUP!!!

Viele Grüße
Arndt

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Bernhard,

Bernhard P. wrote:
> ...
> Wenn ich jetzt im Mico32 einen Asynchronous SRAM Controller einbaue,
> welche Adresse muss/soll ich dann einstellen? Ist die vorgegeben oder
> kann ich die frei wählen?

Ja, bzw. Du kannst Sie vom MSB auch automatisch zuteilen lassen ("A" 
drücken), solltest Sie aber dann locken, denn die Anfangsadresse musst 
Du für den C-Code kennen. Die Größe des Adressraums ist immer die Größe 
in Bytes. Je nachdem, wie Du Dein RAM angebunden hast, kann es sein, 
dass eine Adresse Deines RAMs auf ein 32 Bit Datum des Prozessors 
gemappt wird (von den 32 Bit werden dann z.B. nur die unteren 8 Bit 
bentutzt), Du musst dann aber für den Adressbereich eben 32 Bit bzw. 4 
Byte pro Eintrag reservieren.

> Wie kann ich dann über den Asynchronous SRAM Controller mein Ram
> ansprechen im Mico und im FPGA?

Im Mico ist es erschreckend einfach:
unsigned int *baseram;
baseram = 0x Deine Basisadresse;
*(baseram+offset) = ein Byte (bzw. 32 Bit) zum Schreiben;
ein Byte (bzw. 32 Bit) zum Lesen = *(baseram+offset);

Auf der FPGA Seite die rausgeführten RAM-Leitungen anschließen und 
benutzen.

Viele Grüße
Arndt

von Davor (Gast)


Lesenswert?

Hallo Arndt

danke für die Hilfe, doch ich komme wieder nicht weiter.
Das Problem ist dabei, dass ich den Flow nicht komplett
durchlaufen lassen kann.
Es gibt eine Fehler meldung und der Flow wird angehalten.

Ich versteh nicht wieso, da ich die Pins richtig angeschlossen habe.

Kannst du mir sagen, ob du vielleicht jemanden in der umgebung von
wien kennst, der die Integration des mico32 in den fpga gut beherrscht?

ich wohne in der umgebung von wien und bräuchte dringend hilfe  zu 
diesem
thema - natürlich gegen bezahlung


ach ja - da ich einen 8MBit SPI Flash habe, möchte ich bitte wissen wie 
man das mit dem Flash macht - z.B. eine LED blinken lassen.

von Davor (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Arndt
Wenn das mit dem SPI Flash gehen würde, müsste ich die Pins des SPI 
Flash anschließen.
Doch die Pins des SPI Flash haben Namen, welche ich auf meinem Plan 
nicht finde.

Könntest du mir sagen, welche Nummern die Pins des SPI Flash haben.
Ich hab dir einen Screenshot der Pinbelegung gemacht.

Ein paar Pins weiß ich, doch es gibt einige die ich nicht kenne.

Besten Dank

Mit freundlichen Grüßen

von Davor H. (davor)


Lesenswert?

> clk_i wäre Pin 14
> reset_n wäre Pin 130 mit PULLUP!!!

Ich habe diese Pinnummern vergeben, doch ich weiß jetzt nicht, was ich 
sonst noch im Design planner machen muss.

Du hast gemeint, dass ich die Spannungspegel angeben und den globalen
Takt für die Taktleitung angeben und speichern muss.
Doch ich weiß nicht, wie ich diesen Spannungspegel und den globalen Takt 
für die Taktleitung angeben soll.

Wird das auch im Design Planner gemacht???
Und wenn ja, wie????

DANKE IM VORAUS

Mit freundlichen Grüßen

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Davor,

alles halb so schlimm. Es scheint so, als wenn Du in der MICO32 
Plattform ein SPI-Flashcontroller ausgewählt hättest (die ganzen 
Leitungen mit SPI.... kommen von diesem Controller). Den brauchst Du 
nicht!

Wenn der Controller entfernt ist, dann sollten nur noch die 3 Leitungen 
übrig sein.

Den Spannungspegel stellst Du in der Spalte "IO_TYPE" auf LVCMOS33 ein.

Die Seite, bei der man den globalen Takt einstellen kannst, findest Du 
durch anklicken des unteren Tabs "Period/Frequency". Dort dann in dem 
leeren Fenster auf das linke untere Icon der leeren Spalte klicken. Dann 
erscheint die Auswahlmöglichkeit zur Taktvergabe. Dort "Frequency" und 
"Clockports" anwählen, dann sollte der eine Clockport erscheinen, 
anwählen, die gewünschte Frequenz in MHz eintragen und "ADD" drücken. 
Danach die Settings speichern und Design Planner beenden. Dann den Flow 
durchlaufen lassen. Zum Nachlesen siehe "fpga_design_tutor.pdf" von 
Lattice ab S. 11ff.

Viele Grüße und viel Erfolg
Arndt

P.S.:
Wir können Dir auch Fernsupport anbieten, aber ich glaube schon, dass 
wir das hier bald erfolgreich beendet haben.

von Davor H. (davor)


Lesenswert?

> anwählen, die gewünschte Frequenz in MHz eintragen und "ADD" drücken.


Wie groß soll die Frequenz ungefähr sein?

Danke für die Anleitung

von Davor H. (davor)


Lesenswert?

Ich habe eine Frequenz von 20MHz eingestellt, doch ich kann den Flow 
nicht durchlaufen lassen, weil er angehalten wird und eine Fehlermeldung 
angezeigt wird.


Hier die Fehlermeldung:


ispLEVER Auto-Make Log File
--------------------------

Updating: Generate Bitstream Data
Cannot get current project information.
Starting: 'C:\ispTOOLS7_2_STRT\ispfpga\bin\nt\map.exe  -a LatticeECP2 -p 
LFE2-12E -t TQFP144 -s 5 "ledtesting.ngd" -o "ledtesting_map.ncd" -mp 
"ledtesting.mrp" "ledtesting.lpf"'


map:  version ispLever_v72_PROD_Build (44)
Copyright (c) 1991-1994 by NeoCAD Inc. All rights reserved.
     Copyright (c) 1995 AT&T Corp.   All rights reserved.
     Copyright (c) 1995-2001 Lucent Technologies Inc.  All rights 
reserved.
     Copyright (c) 2001 Agere Systems   All rights reserved.
     Copyright (c) 2002-2008 Lattice Semiconductor Corporation,  All 
rights
     reserved.
   Process the file: ledtesting.ngd
   Picdevice="LFE2-12E"
   Pictype="TQFP144"
   Picspeed=5
   Remove unused logic
   Do not produce over sized NCDs.
Part used: LFE2-12ETQFP144, Speed used: 5.
Loading device for application map from file 'ep5a32x56.nph' in 
environment
     C:/ispTOOLS7_2_STRT/ispfpga.
Package: Version 1.23, Status: FINAL

Running general design DRC...
WARNING - map: logical net 'lm32_inst/LM32/jtck' has no driver
WARNING - map: logical net 'lm32_inst/LM32/jrstn' has no driver
WARNING - map: logical net 'lm32_inst/LM32/cpu/adder/addsub/un1_addsub' 
has
     no driver
WARNING - map: logical net 'ep5ahub/tcka' has no driver
WARNING - map: logical net 'ep5ahub/tmsa' has no driver
WARNING - map: logical net 'ep5ahub/tdia' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_1' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_2' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_3' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_4' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_5' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_6' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_7' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_8' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_9' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_10' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_11' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_12' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_13' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_14' has no driver
WARNING - map: logical net 'ep5ahub/er2_tdo_15' has no driver
Removing unused logic...
Optimizing...
312 CCU2 constant inputs absorbed.
WARNING - map: Using local reset signal 'reset_n_c' to infer global GSR
     net.



Design Summary:
   Number of registers:    1706
      PFU registers:    1706
      PIO registers:    0
   Number of SLICEs:          2149 out of  6048 (36%)
      SLICEs(logic/ROM):      2053 out of  4914 (42%)
      SLICEs(logic/ROM/RAM):    96 out of  1134 (8%)
          As RAM:           96 out of  1134 (8%)
          As Logic/ROM:      0 out of  1134 (0%)
   Number of logic LUT4s:     2729
   Number of distributed RAM:  96 (192 LUT4s)
   Number of ripple logic:    129 (258 LUT4s)
   Number of shift registers:   0
   Total number of LUT4s:     3179
   Number of PIO sites used: 3 out of 93 (3%)
   Number of PIO FIXEDDELAY:    0
   Number of DQSDLLs:  0 out of 2 (0%)
   Number of 3-state buffers:   0
   Number of PLLs:  0 out of 2 (0%)
   Number of DLLs:  0 out of 2 (0%)
   Number of block RAMs:  20 out of 12 (167%)
   Number of CLKDIVs:  0 out of 2 (0%)
   Number of GSRs:  1 out of 1 (100%)
   JTAG used :      Yes
   Readback used :  No
   Oscillator used :  No
   Startup used :   No
ERROR - map: The number of embedded RAM blocks needed (20) exceeds the
     number available. This device has at most 12 embedded RAM blocks.
   Notes:-
      1. Total number of LUT4s = (Number of logic LUT4s) + 2*(Number of 
distributed RAMs) + 2*(Number of ripple logic)
      2. Number of logic LUT4s does not include count of distributed RAM 
and ripple logic.

   Number Of Mapped DSP Components:
   --------------------------------
   MULT36X36B          1
   MULT18X18B          0
   MULT18X18MACB       0
   MULT18X18ADDSUBB    0
   MULT18X18ADDSUBSUMB 0
   MULT9X9B            0
   MULT9X9ADDSUBB      0
   MULT9X9ADDSUBSUMB   0
   --------------------------------
   Number of Used DSP Sites:  8 out of 48 (16 %)
   Number of clocks:  3
     Net clk_i_c: 995 loads, 995 rising, 0 falling (Driver: PIO clk_i )
     Net lm32_inst/LM32/jtag_update: 1 loads, 0 rising, 1 falling 
(Driver: lm32_inst/LM32/jtag_cores/jtag_lm32_inst/REG_UPDATE )
     Net jtaghub16_jtck: 41 loads, 0 rising, 41 falling (Driver: 
ep5ahub/genblk0_genblk3_jtagc_u )
   Number of Clock Enables:  55
     Net lm32_inst/gpio/PIO_DATA9: 1 loads, 1 LSLICEs
     Net lm32_inst/ebr/N_89_i: 7 loads, 7 LSLICEs
     Net lm32_inst/ebr/un1_EBR_ACK_O_2_sqmuxa: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/debug_rom/N_29_i: 16 loads, 16 LSLICEs
     Net lm32_inst/LM32/debug_rom/write_enable_RNO: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/debug_rom/state_5_d_i: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/debug_rom/state_nss_1: 16 loads, 16 LSLICEs
     Net lm32_inst/LM32/cpu/eba8: 12 loads, 12 LSLICEs
     Net lm32_inst/LM32/cpu/stall_x_N_5_i: 154 loads, 154 LSLICEs
     Net lm32_inst/LM32/cpu/hw_debug/dc_re6: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/jtag/jtag_reset_1_sqmuxa_1_i: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/cpu/jtag/N_927_i: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/jtag/uart_tx_valid_1_sqmuxa_i_s: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/cpu/jtag/uart_tx_byte_0_sqmuxa: 4 loads, 4 
LSLICEs
     Net lm32_inst/LM32/cpu/jtag/uart_rx_valid_2_sqmuxa: 5 loads, 5 
LSLICEs
     Net lm32_inst/LM32/cpu/jtag/uart_rx_valid_0_sqmuxa_1_i: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/cpu/jtag/jtag_reg_d_1_sqmuxa: 4 loads, 4 LSLICEs
     Net lm32_inst/LM32/cpu/interrupt/im_1_sqmuxa: 16 loads, 16 LSLICEs
     Net lm32_inst/LM32/cpu/interrupt/un1_eie14: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/interrupt/un1_eie12: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/interrupt/un1_non_debug_exception_2: 1 
loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/mc_arithmetic/state_7_d_i: 17 loads, 17 
LSLICEs
     Net lm32_inst/LM32/cpu/N_46_i: 32 loads, 32 LSLICEs
     Net lm32_inst/LM32/cpu/mc_arithmetic/N_141_i: 4 loads, 4 LSLICEs
     Net lm32_inst/LM32/cpu/mc_arithmetic/b_0_sqmuxa: 16 loads, 16 
LSLICEs
     Net lm32_inst/LM32/cpu/N_933_1: 82 loads, 82 LSLICEs
     Net lm32_inst/LM32/cpu/stall_d_2_0_a0_0: 104 loads, 104 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/dcache/N_157_i: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/dcache/N_152_i: 3 loads, 3 
LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/dcache/N_151_i: 14 loads, 14 
LSLICEs
     Net 
lm32_inst/LM32/cpu/load_store_unit/dcache_refill_ready_0_sqmuxa: 16 
loads, 16 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/d_we_o_1_sqmuxa: 16 loads, 
16 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/store_data_m_4_sqmuxa_i: 2 
loads, 2 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/d_cyc_o_1_sqmuxa_1_i: 16 
loads, 16 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/d_cyc_o_0_sqmuxa_1: 3 loads, 
3 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/wb_load_complete_1_sqmuxa_i: 
1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/stall_wb_load_1_sqmuxa_1_i: 
1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/un1_d_adr_o32_2_i_0: 3 
loads, 3 LSLICEs
     Net lm32_inst/LM32/cpu/instruction_unit/state_1_rep1_RNIMQ14_1: 14 
loads, 14 LSLICEs
     Net lm32_inst/LM32/cpu/instruction_unit/state_1_rep1_RNIMQ14: 1 
loads, 1 LSLICEs
     Net 
lm32_inst/LM32/cpu/instruction_unit/icache/un1_restart_request_0_sqmuxa_ 
i:  1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/instruction_unit/N_969_i: 15 loads, 15 
LSLICEs
     Net 
lm32_inst/LM32/cpu/instruction_unit/icache_refill_data_0_sqmuxa: 16 
loads, 16 LSLICEs
     Net lm32_inst/LM32/cpu/instruction_unit/N_926_i: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/memop_pc_w6: 15 loads, 15 LSLICEs
     Net lm32_inst/LM32/cpu/un1_dcache_refill_request_i_i: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/cpu/N_935_i: 2 loads, 2 LSLICEs
     Net lm32_inst/LM32/cpu/N_931_i: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/N_932_i: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/deba8: 12 loads, 12 LSLICEs
     Net lm32_inst/LM32/cpu/data_bus_error_seen_1_sqmuxa_i: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/jtag_cores/jtag_lm32_inst/clk_enable: 6 loads, 6 
LSLICEs
     Net jtaghub16_jupdate: 14 loads, 14 LSLICEs
     Net ep5ahub/id_enable_0_sqmuxa: 1 loads, 1 LSLICEs
     Net ep5ahub/N_45_i: 10 loads, 10 LSLICEs
   Number of local set/reset loads for net reset_n_c merged into GSR: 
35
   Number of LSRs:  9
     Net reset_n_c: 759 loads, 747 LSLICEs
     Net lm32_inst/LM32/cpu/registers_and_0: 16 loads, 16 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/dcache/state_13_d: 2 loads, 
2 LSLICEs
     Net lm32_inst/LM32/cpu/load_store_unit/fb: 1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/instruction_unit/un1_rst_i_i_0: 1 loads, 1 
LSLICEs
     Net 
lm32_inst/LM32/cpu/instruction_unit/icache/genblk31_memories_0__way_0_ta 
g_ram/N_209_i_i:  1 loads, 1 LSLICEs
     Net lm32_inst/LM32/cpu/instruction_unit/icache/state_1: 1 loads, 1 
LSLICEs
     Net lm32_inst/LM32/cpu/registers_and_2: 16 loads, 16 LSLICEs
     Net jtaghub16_jrstn: 40 loads, 40 LSLICEs
   Number of nets driven by tri-state buffers:  0
   Top 10 highest fanout non-clock nets:
     Net reset_n_c: 772 loads
     Net lm32_inst/LM32/cpu/stall_x_N_5_i: 154 loads
     Net lm32_inst/VCC: 134 loads
     Net lm32_inst/LM32/cpu/stall_d_2_0_a0_0: 115 loads
     Net lm32_inst/LM32/cpu/N_933_1: 111 loads
     Net lm32_inst/LM32/cpu/read_idx_1_d_2: 88 loads
     Net lm32_inst/LM32/cpu/read_idx_1_d_3: 87 loads
     Net lm32_inst/LM32/cpu/read_idx_1_d_1: 84 loads
     Net lm32_inst/LM32/cpu/read_idx_1_d_0: 80 loads
     Net lm32_inst/LM32/cpu/read_idx_0_d_0: 78 loads
ERROR - map: Design doesn't fit into device specified, refer to the Map
     report for more details.

   Number of warnings:  22
   Number of errors:    2



INFO: Design contains pre-loadable EBR during configuration that has a 
requirement:
Since the GSR is disabled for the EBR, make sure write enable and chip
enable are inactive during wake-up, so that the pre-loaded 
initialization
values will not be corrupted during wake-up state.

Total CPU Time: 5 secs
Total REAL Time: 6 secs
Peak Memory Usage: 73 MB

Done: failed with exit code: 0002.

von Davor H. (davor)


Lesenswert?

> Wir können Dir auch Fernsupport anbieten, aber ich glaube schon, dass
> wir das hier bald erfolgreich beendet haben.


Wie meinst du das mit Fernsupport?
Ich habs noch immer nicht hingekriegt, hast Du schon mal so eine Fehler 
meldung wie im letzten Eintrag beschrieben gehabt?

DANKE

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Fernsupport, im Moment durch das Forum.

Die Fehlermeldung sagt, dass Du zuviel BlockRAM belegst. Das kann kommt 
vermutlich dadurch, dass Du zuviel OnChip Memory angefordert hast.

Im MSB beim Onchipmemory als Zahl: 16384 eintragen
Bei der CPU Caches deaktivieren und KEIN Inline Memory nehmen.

Viele Grüße
Arndt

von Davor H. (davor)


Angehängte Dateien:

Lesenswert?

> Fernsupport, im Moment durch das Forum.

Fernsupport ist echt hilfreich wenn man nicht so der Experte ist.

Ich wollte jetzt anfangen zu debuggen, doch es erscheint folgende 
Fehlermeldung (Bild oben)

Weißt Du wie man den lösen kann?

DANKE nochmals

Mit freundlichen Grüßen

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Ja, dann stelle ich mal die Frage, die Dir auch der Rechner stellt.

Hast Du im LM32 im MSB das Debug Modul aktiviert?
Hast Du das entstandene .bit File mit ispvmSystem ins FPGA geladen (fürs 
erste reicht Fastprogramm direkt ins RAM des FPGAs).
Hast Du den USB Programmer?

Wenn alle Fragen mit ja beantwortet werden können und der Debugger immer 
noch diese Meldung bringt, kann es sein, dass der JTAG Server 
abgeschmiert ist (der reagiert sehr empfindlich auf Störungen). Da hilft 
leider nur ein Ein- und Ausschalten des Rechners.

Viele Grüße
Arndt

von Davor H. (davor)


Angehängte Dateien:

Lesenswert?

Arndt Bußmann wrote:
> Ja, dann stelle ich mal die Frage, die Dir auch der Rechner stellt.
>
> Hast Du im LM32 im MSB das Debug Modul aktiviert?
> Hast Du das entstandene .bit File mit ispvmSystem ins FPGA geladen (fürs
> erste reicht Fastprogramm direkt ins RAM des FPGAs).
> Hast Du den USB Programmer?
>
> Wenn alle Fragen mit ja beantwortet werden können und der Debugger immer
> noch diese Meldung bringt, kann es sein, dass der JTAG Server
> abgeschmiert ist (der reagiert sehr empfindlich auf Störungen). Da hilft
> leider nur ein Ein- und Ausschalten des Rechners.


Stimmt die Einstellung des LM32 im MSB (Bild oben) fürs debugen?

oder gehört "Enable Debugging Code in Flash oder ROM" auch angekreuzt?

DANKE NOCHMALS

Mit freundlichen Grüßen

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

So ist der LM32 ok.

von Davor H. (davor)


Lesenswert?

Arndt Bußmann wrote:
> So ist der LM32 ok.

OK dann werd ich das mit dem Wiedereinschalten des Rechners versuchen.

DANKE NOCHMALS

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

War das Programmieren mit ispvmSystem denn erfolgreich?

Im Notfall kann ich Dich auch kurz anrufen, kannst mir ja eine Nachricht 
mit Deiner Nummer schicken.

von Davor H. (davor)


Lesenswert?

Arndt Bußmann wrote:
> War das Programmieren mit ispvmSystem denn erfolgreich?
>
> Im Notfall kann ich Dich auch kurz anrufen, kannst mir ja eine Nachricht
> mit Deiner Nummer schicken.

YES ES HAT JETZT GEKLAPPT

DANKE DANKE DANKE

Jetzt wärs noch cooler ein Lauflicht zu machen. Ist das viel schwerer?

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Für das Lauflicht solltest Du dem GPIO mehr outputs gönnen und diese 
natürlich mit den LEDs verdrahten (im Designplanner die richtigen Pins 
wählen). Danach schlägt die Stunde des C Programmierers ;-)

Kannst ja auch mal ein printf einbauen. Ich finde es cool, wenn man das 
FPGA so debuggen kann. Auch parallel den Reveal testen ist interessant.

Weiterhin noch viel Erfolg
Arndt

von Davor H. (davor)


Lesenswert?

Arndt Bußmann wrote:
> Für das Lauflicht solltest Du dem GPIO mehr outputs gönnen und diese
> natürlich mit den LEDs verdrahten (im Designplanner die richtigen Pins
> wählen). Danach schlägt die Stunde des C Programmierers ;-)
>
> Kannst ja auch mal ein printf einbauen. Ich finde es cool, wenn man das
> FPGA so debuggen kann. Auch parallel den Reveal testen ist interessant.


Benutze folgendes Programm für das Lauflicht und es funktioniert sogar:


#include "DDStructs.h"
#include "LookupServices.h"
#include "stdio.h"
#include "MicoUtils.h"

const char *LED_GPIO_INSTANCE = "LED";
const unsigned int uiBlink = 1;

int main(void)
{
  unsigned int iValue = 0x1;
  unsigned int iShiftLeft = 1;

    /* Fetch GPIO instance named "LED" */
  MicoGPIOCtx_t *leds = (MicoGPIOCtx_t 
*)MicoGetDevice(LED_GPIO_INSTANCE);
    if(leds == 0){
        printf("failed to find GPIO instance named LED\r\n");
        return(0);
    }
    printf("found GPIO instance named LED\r\n");


    /* if we're not to blink, return immediately */
    if(uiBlink == 0)
        return(0);

    /* scroll the LEDs, every 100 msecs forever */
  while(1){
    *((volatile unsigned int *)(leds->base)) = ~iValue;
    MicoSleepMilliSecs(100);
    if(iShiftLeft == 1){
      iValue = iValue << 1;
      if(iValue == 0x100){
        iValue = 0x40;
        iShiftLeft = 0;
      }
    }else{
      iValue = iValue >> 1;
      if(iValue == 0){
        iValue = 0x02;
        iShiftLeft = 1;
      }
    }
  }


    /* all done */
  return(0);
}



Das einzige Problem ist, dass ich nicht verstehe, wieso es nur bis zur 
sechsten LED geht und dann wieder zurück, obwohl ich 8 LED verwende.


DANKE DANKE NOCHMALS FÜR DEINE HILFE

Mit freundlichen Grüßen

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.