Hallo alle zusammen!
Ich stehe gerade etwas auf dem Schlauch...
Folgendes Szenario:
Ich habe in meinem hypothetischen FPGA noch 10 RAM-Blöcke mit einer
breite von je 8-bit und jeweils 1024 Einträgen (=1kB pro Block) übrig
und möchte die jetzt zusammenfassen und als 'einen' Speicherblock
nutzen.
Als Address-Signal habe ich ein 14-bit breites Signal - also genug
Zustände (=16384) um alle 10*1024=10240 Einträge anzusprechen.
Wie konvertiere bzw. addressiere ich jetzt mein RAM-Array ohne dass mir
die Simulation um die Ohren fliegt??
Definition des RAMs:
1 | type ram_t is array (0 to (10*1024)-1) of std_logic_vector(7 downto 0);
|
2 | signal ram : ram_t;
|
3 | signal addr_int : integer;
|
Der Lese-Prozess (behavioral, ich möchte keine Primitives explizit
instantieren):
1 | addr_int <= to_integer(unsigned(addr_i(13 downto 0)));
|
2 |
|
3 | ram_read : process(clk_i)
|
4 | begin
|
5 | if rising_edge(clk_i) then
|
6 | read_data <= ram(addr_int);
|
7 | end if;
|
8 | end process ram_read;
|
Ich habe schon versucht mit "range" für das Signal addr_int zu arbeiten
um den Wertebereich virtuell zu begrenzen, aber ich bekomme in der
Simulation immer wieder den Fehler "14336 out of bound 0 to 10239" -
wahrscheinlich weil addr_int durch die Konvertierung des 14-bit Signals
eben auch größere Werte als 10240 annehmen kann.
Es ist klar, dass das Signal addr_i nicht den Wertebereich von 0 bis
10239 verlassen darf (was macht das RAM sonst?!), aber was, wenn dieses
Signal am Anfang nicht initialisiert ist und erst später durch z.B.
einen Reset auf einen initialen Wert gesetzt wird? Muss ich extra noch
einen Komparator einbauen um den Wertebereich direkt am Adresseingang
des RAMs zu begrenzen??
Irgendwie habe ich hier gerade ein Brett vor dem Kopf...
Vielleicht könnt ihr mir ja helfen ;)
Gruss,
Stephan