Forum: FPGA, VHDL & Co. std_logic_vector über anderen Vector adressieren


von BuTze (Gast)


Lesenswert?

hi!

ich möchte den std_logic_vector(511 DOWNTO 0) "next_reset_eeprom_data" 
in einer fsm in zu jedem Takt mit 8bit aus dem Speicher "bram_dout" 
füllen.
obwohl upper und lower adress in der Simulation(Modelsim) die Werte '7' 
und '0' haben,  kommt der Fehler:

 ** Fatal: (vsim-3420) Array lengths do not match. Left is 1 (0 downto 
0). Right is 8 (7 downto 0).

habe außer dem to_integer(unsigned(std_logic_vector)) cast noch
to_unsigned(unsigned(std_logic_vector))  und
CONV_INTEGER(std_logic_vector)

ausprobiert - aber es kommt der selbe Fehler. Was mache ich bloß falsch?


WHEN READ_DATA =>
  next_reset_eeprom_ctrl_bram_addr <= reset_eeprom_ctrl_bram_addr +1;
  next_reset_eeprom_upper_addr <= current_reset_eeprom_upper_addr +8;
  next_reset_eeprom_lower_addr <= current_reset_eeprom_lower_addr +8;

  next_reset_eeprom_data(
to_integer(unsigned(current_reset_eeprom_lower_addr))
 DOWNTO
to_integer(unsigned(current_reset_eeprom_lower_addr)))
 <= bram_dout;

IF (current_reset_eeprom_upper_addr = 16#200#) THEN --512 bit!
  next_reset_eeprom_ctrl_state       <= SET_READY;
END IF;


Gruß

Martin

von Mark (Gast)


Lesenswert?

wie die Fehlermeldung schon sagt, Du hast links ein einzelnes bit und 
willst diesem einen 8bit vector zuweisen - geht nicht.

to_integer(unsigned(current_reset_eeprom_lower_addr))
 DOWNTO
to_integer(unsigned(current_reset_eeprom_lower_addr)))

müsste z.B.

to_integer(unsigned(current_reset_eeprom_lower_addr))
 DOWNTO
to_integer(unsigned(current_reset_eeprom_lower_addr))-7) heißen

dann sollte es gehen

von BuTze (Gast)


Lesenswert?

hi!

vielen Dank für den Tip!

ohne dich hätt ich wahrsch. nie den copy & paste fehler (das 2. muss 
upper statt lower heißen) bemerkt, sondern hätte mich weiter mit den 
casts beschäftigt :)

von BuTze (Gast)


Lesenswert?

hi!

ich bins nochmal :)


Die Simulation läuft mit der obigen Lösung einwandfrei. Allerdings kommt 
ISE 10.1 damit nicht klar. Der Speicher läuft einfach voll und die 
Synthese wird abgebrochen.

Unter Windows wird noch eine Warnung, dass zu wenig Speicher vorhanden 
sei, ausgegeben.
Unter Linux (ink. virt. Speicher 20GB!) bricht ISE ohne Fehlermeldung 
einfach mit "Synthesize failed" ab.


Kommentiere ich die Zeile aus, geht es.

Mit Synplify gehts. Aber ich würde lieber die ISE nutzen... jemand ne 
Idee, wie ich das umgehen kann?

Gruß

von Thomas H. (mac4ever)


Lesenswert?

Sowas hatte ich auch schon mal zu erledigen. Dynamisch einen 512Bit 
Vektor zu beschreiben. Hat auch ewig gedauert ... da kommt ein etwas 
größerer MUX bei raus ;)
Leider kann ich Dir da auch nicht weiter helfen, vielleicht tut's mehr 
RAM und Auslagerungsdatei unter Win ?

von Rick Dangerus (Gast)


Lesenswert?

Schau mal im xst.pdf ob Du eine (für ISE-XST) gängige Beschreibung 
Deines Problem findest. Ich hatte auch schon den Fall, das er 
stundenlang versucht hat einen ROM-Inhalt zu optimieren und in eine 
Funktion zu packen :-(.

Rick

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn du den Vektor nur auf Bytegrenzen adressieren musst, probier's 
lieber mal mit einem 64*8-Array, sonst baut die Synthese für jede 
Adresse einen Multiplexer, und nicht nur für jede 8te.

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.