Forum: FPGA, VHDL & Co. ROM Laden


von markus (Gast)


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??

von Stefan May (Gast)


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.

von markus (Gast)


Lesenswert?

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

:((

von Stefan May (Gast)


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.

von markus (Gast)


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

von markus (Gast)


Lesenswert?

wenn ich von einem intelhexfile ausgehe ( von keilµvision generiert)

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

von Stefan May (Gast)


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.

von markus (Gast)


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

von Stefan May (Gast)


Lesenswert?

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

ciao, Stefan.

von markus (Gast)


Lesenswert?

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

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

habe versucht es zu verstehen aber keinen ahnung

von markus (Gast)


Lesenswert?

achja aus diesem programmcode ist es generiert worden
sollte nur dienen ob das funktioniert

#include <REG517A.H>

void main()
{

  P1=0x55;
}

von Stefan May (Gast)


Lesenswert?


von udo (Gast)


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

von markus (Gast)


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 ? :)

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.