mikrocontroller.net

Forum: FPGA, VHDL & Co. ROM Laden


Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann man denn das blockrom eines spartan3 laden?

ich versuche einen 8051 in vhdl in den spartan zu laden. dieser soll
sinnigerweise mit einem c programm geladen werden. jetzt habe ich im
internet ein programm gefunden das ein intelhex file in ein dualfile
umwandeln kann. mit diesem dualfile kann ich aber nicht viel anfangen,
da der speicher mit einem *.coe file geladen werden muss.

mit tricks und dem memorytool ist es möglich ein *.coe file über ein
*.csv file zu erstellen.

das problem ist nur das das memorytool jetzt behauptet, das es
teilweise zu falschem speicheransprechen kommt.

was mache ich falsch? bin ich überhaupt auf dem richtigem weg?
wer kann mir helfen??

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in die Appnote XAPP463 von Xilinx zum Block-RAM rein. Da steht
beschrieben wie das geht. AFAIK geht das über das Contraints-File oder
über VHDL-Attribute.

http://direct.xilinx.com/bvdocs/appnotes/xapp463.pdf

ciao, Stefan.

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat mir leider nicht viel weitergeholfen...bin auch nicht so gut in
englisch.....

:((

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lerne Englisch! :-)

Also es gibt verschiedene Arten das Block-RAM zu initialisieren. Ich
beschreibe hier mal den Weg innerhalb des VHDL-Quellcodes.

component RAMB4_S16
  generic(
    INIT_00, INIT_01, INIT_02, INIT_03,
    INIT_04, INIT_05, INIT_06, INIT_07,
    INIT_08, INIT_09, INIT_0A, INIT_0B,
    INIT_0C, INIT_0D, INIT_0E, INIT_0F: bit_vector(255 downto 0) :=
X"0000000000000000000000000000000000000000000000000000000000000000");
  port(
    EN   : in  std_logic;
    WE   : in  std_logic;
    RST  : in  std_logic;
    CLK  : in  std_logic;
    ADDR : in  std_logic_vector(7 downto 0);
    DI   : in  std_logic_vector(15 downto 0);
    DO   : out std_logic_vector(15 downto 0));
end component;


In der Instanziierung des Block-RAM werden dann die Daten geladen:

ram0: RAMB4_S16
  generic map(
    INIT_00 =>
X"00000000000000000000680A680900007303134013440A045103492050004840",
    INIT_01 =>
X"0000000000000000000000000000000000000000000000000000000000000000")
  port map(
    WE => logic0, EN => logic1, RST=> logic0,
    CLK => CLK, ADDR => ADDR, DI => DIN, DO => DATA);


Wichtig ist, daß die Daten in umgekehrter Reihenfolge stehen. Der
RAM-Inhalt in dem Beispiel sieht also so aus:

0: 4840
1: 5000
2: 4920
....


Man kann das auch über die UCF-Datei machen, da weiß ich aber leider
nicht wie das geht.

ciao, Stefan.

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ui und ich habe geglaubt das nicht verstehe weil ich kein englisch kann
:)

werd mich da mal durchlesen/arbeiten.

das rom/ram habe ich ja generieren lassen vom corgen...

... nur ohne daten hilft das beste rom nix :)

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich von einem intelhexfile ausgehe ( von keilµvision generiert)

müsste ich dann auch die daten "verkehrt" einschreiben?

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe nochmal in die Appnotes reingeschaut. Wenn Du den Core-Generator
benutzt, dann schau Dir Seite 11 Content Initialization an. Die Option
heißt "Load Init File", da kannst Du die .coe-Datei einlesen.

ciao, Stefan.

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie komme ich zu einer .coe datei?

habe versucht über das memorytool vom coregen versucht so einen datei
zu erstellen, weiss aber nicht was ich genau eintragen soll.

habe das intel-hex file einfach zertrennt

bsp.

aus :01002F00EFE1  wurde  01 00 2F 00 EF E1

hat aber dann nicht funktioniert...warum auch immer.......

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal an, wie das Intel HEX aufgebaut ist. Das sind nicht nur
einfach die Bytes hintereinandergereiht.

ciao, Stefan.

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also in meinem hex-file werde ich nicht wirklich schlau :)

:04000F007590552271
:03000000020003F8
:0C000300787FE4F6D8FD75810702000F3D
:00000001FF

habe versucht es zu verstehen aber keinen ahnung

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja aus diesem programmcode ist es generiert worden
sollte nur dienen ob das funktioniert

#include <REG517A.H>

void main()
{

  P1=0x55;
}

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich benutze einen spartan2 und hab das ganze auch mal gemacht.
8051-core von oregano mit blockram. Initialisiert habe ich den z.B. mit


INST i_mc8051_rom_U_ROM1 INIT_00 =
0000000000000000000000000000FE80A3D2A2C2A1D2A0C282C281C280D20000;

im ucf-file. Das Beispiel setzt einfach ein paar pins high oder low.

Das erstellen des ucf-files laesst sich automatisieren mit den
Programmen hex2bin und bin2blockram. Musste mal guggn in the google
drin. Über den aufbau des hex-files musste dir dann keine gedanken mehr
machen.

Was mich noch interessieren würde: Wie viele blockrams verwendest du
fuer den Programmspeicher. Wenn mehr als einen, würde mich der
vhdl-code interessieren, um dieses zu realisieren.

Ansonsten : Noch schoen den HSV-Sieg feiern ;)

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
verwende den automatischen speichergenerator im coregen, da kann man
einstellen was man alles haben möchte.

zum laden des roms habe ich ein c file geschrieben das mir das hexfile
in ein csv file richtig zerlegt

dannach importiere ich das csv file in das memorytool und generiere ein
coe file

das coe file wird dann in das rom geladen

ist doch ganz schön kompliziert oder ? :)

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.