Forum: FPGA, VHDL & Co. RAM generisch in VHDL, wie initialisieren?


von berndl (Gast)


Lesenswert?

Hallo VHDL Spezl,

ich baue gerade die Instantiierung eines RAMs auf 'simple VHDL' um (da 
Plattformunabhaengig und schneller in der Simulation mit GHDL). Nur, wie 
initialisiere ich dieses RAM am einfachsten? Die 'zu Fuss Methode' folgt 
hier:
1
   
2
   type t_ram is array (0 to 255) of std_logic_vector (31 downto 0);
3
   signal ram : t_ram := (x"00018021",    --          00
4
                          x"00018001",    --          01
5
                          x"00018021",    --          02
6
                          x"00018011",    --          03
7
                          x"00018021",    --          04
8
                          x"00018031",    --          05
9
                          x"00000000",    --          06
10
                          x"00000000",    --          07
11
                          ...
12
                          ...             -- hier iss alles 0 oder don't care
13
                          ...             -- (ist halt 'ne Fleissarbeit!)
14
                          ...
15
                          x"00000000",    --          FB
16
                          x"00000000",    --          FC
17
                          x"00000000",    --          FD
18
                          x"00000000",    --          FE
19
                          x"00000000"     --          FF
20
                         );
Also ich will nur ein paar Eintraege initialisieren, der Rest ist Null 
(bzw. sogar don't care). Ich denke, das muss doch mit irgendeinem 
Konstrukt ala
1
(others => (others => '0'))
zu loesen sein, oder?
Das RAM wird teilweise (bei mir so ca. 40 Eintraege) als 
ROM/Codespeicher verwendet und muss deshalb richtig initialisiert 
werden, der Rest des RAMs ist wirklich zum Datenaustausch gedacht 
(dual-ported RAM halt)...

Hat da jemand den Zauberspruch fuer mich? Ich stehe gerade voll auf dem 
Schlauch...

von Rufus (Gast)


Lesenswert?

Probier mal folgendes:
1
signal ram(0 to 39) : t_ram := ...

Oder so ähnlich ;-)

von Rufus (Gast)


Lesenswert?

Sorry, ich meinte das:
1
signal ram : t_ram;
2
ram          <= (others => (others => '0'));
3
ram(0 to 39) <= (...);

von Bastler (Gast)


Lesenswert?

Ich hab hier sowas:
1
architecture Xilinx of DualPortRAM is
2
   type ram_type is array(natural range 0 to ((2**BRAM_W)/4)-1) of unsigned(WORD
3
_SIZE-1 downto 0);
4
5
shared variable ram : ram_type:=
6
(
7
     0 => x"0b0b0b0b",
8
     1 => x"82700b0b",
9
     2 => x"0b97800c",
10
     3 => x"3a0b0b0b",
11
     4 => x"94c70400",
12
     5 => x"00000000",
13
     ...
14
others => x"00000000"
15
);

von berndl (Gast)


Lesenswert?

Rufus schrieb:
> signal ram : t_ram;
> ram          <= (others => (others => '0'));
> ram(0 to 39) <= (...);

hmm, in der 'architecture' die Deklaration und nach dem 'begin' 
Zuweisungen? Na, ich bin da skeptisch (aber wenn kein anderer Vorschlag 
kommt probier ich das mal aus!)

von Rufus (Gast)


Lesenswert?

berndl schrieb:
> hmm, in der 'architecture' die Deklaration und nach dem 'begin'
> Zuweisungen?

Ja, so ist das gemeint.

berndl schrieb:
> Na, ich bin da skeptisch (aber wenn kein anderer Vorschlag
> kommt probier ich das mal aus!)

So in der Art habe ich das gemacht und es funktioniert.

Bei dem Vorschlag von Bastler stört mich, dass man für jedes Wort die 
Adresse mit angeben muss. Das soll der Compiler doch selber machen... 
;-)

von berndl (Gast)


Lesenswert?

Bastler schrieb:
> (
>      0 => x"0b0b0b0b",
>      1 => x"82700b0b",
>      2 => x"0b97800c",
>      3 => x"3a0b0b0b",
>      4 => x"94c70400",
>      5 => x"00000000",
>      ...
> others => x"00000000"
> );

Jepp, das laeuft zumindest syntaktisch durch (Simulation laeuft gerade). 
Da hab' ich irgendwie zu kompliziert gedacht... Merci!

von berndl (Gast)


Lesenswert?

Rufus schrieb:
> So in der Art habe ich das gemacht und es funktioniert.
>
> Bei dem Vorschlag von Bastler stört mich, dass man für jedes Wort die
> Adresse mit angeben muss. Das soll der Compiler doch selber machen...
> ;-)

ahhhh ja, aber ich habe gerne Deklaration und Implementierung 
'eindeutig', da gefaellt mir der 'Bastler' Vorschlag ganz gut. Aber 
merci fuer den Tipp! Muss ich mir merken!

von Bastler (Gast)


Lesenswert?

Rufus schrieb:
> Bei dem Vorschlag von Bastler stört mich, dass man für jedes Wort die
> Adresse mit angeben muss. Das soll der Compiler doch selber machen...
> ;-)

Macht ein Konverterscript, welches aus dem binary die init-strings 
erzeugt.
Wird doch kaum einer die Daten von Hand eingeben, 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.