Forum: FPGA, VHDL & Co. (others => '0')


von Gabriel (Gast)


Lesenswert?

Liebe Kollegen!

Ich habe eine Frage zu (others => '0')

wenn ich mein Signal so fülle
1
signal s_mem   : bit_vector(22 downto 0);
2
s_mem <= ( X"33333" & "000");
funktioniert es.

Wiso geht das nicht?
1
s_mem <= (X"33333", others => '0');
??????????

von A. M. (am85)


Lesenswert?

Woran machst du fest, dass es nicht geht? Bekommst du eine Fehlermeldung 
beim Simulieren bzw. Synthetisieren?

von Guest (Gast)


Lesenswert?

probier mal
1
s_mem <= (X"33333", (3 => '0'));

3 ist die Länge des Vectors, der angehängt wird.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>> Wiso geht das nicht?
>> s_mem <= (X"33333", others => '0');
Woher soll der Synthesizer wissen, wohin die x"33333" in den Vektor 
gehören?

> probier mal
> s_mem <= (X"33333", (3 => '0'));
Das wird nicht gehen: damit würde nur das 3. Element definiert...

Das dürfte gehen, hier ist alles definiert:
s_mem <= (22 downto 3 => X"33333", others => '0');

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Der erste Ansatz ist ein literal, der sich aus zwei zusammengesetzten 
literalen ergibt. Das zweite ist der Versuch eine Art aggregate 
expression zu bilden. Die wiederum kann keine string literals enthalten, 
sondern nur einzelne Zuweisungen. Versuch mal das hier:
1
s_mem              <= (others => '0');
2
s_mem(22 downto 3) <= x"33333";

--
Marcus

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Das dürfte gehen, hier ist alles definiert:
> s_mem <= (22 downto 3 => X"33333", others => '0');

Man kann meines Wissens nach in aggregates keine literals unterbringen.

Questa sagt dazu: Bit string literal found where non-array type 
std.standard.bit was expected.

--
Marcus

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Man kann meines Wissens nach in aggregates keine literals unterbringen.
Aua, da habe ich mich ins Abseits gestellt  :-/
Die Zuweisung über einen Bereich ginge natürlich bestenfalls so:
s_mem <= (22 downto 3 => '1', others => '0');

von Patrick (Gast)


Lesenswert?

Marcus Harnisch schrieb:
1
s_mem              <= (others => '0');
2
s_mem(22 downto 3) <= x"33333";

Sorry, dass ich einen so alten Thread ausgrabe, aber das gleiche Problem 
wie der Fragensteller hatte ich auch gerade.

Bei dem oben zitierten VHDL-Code meckert ModelSim allerdings:
s_mem sei ja schon "als Ganzes" definiert.
Für mich ist das auch irgendwo nachvollziehbar, da diese spezielle 
Stelle des Signals nicht zwei verschiedene Werte zur gleichen Zeit 
annehmen kann.

Abhilfe schafft da glaube ich nur:
1
s_mem(2 downto 0)  <= (others => '0');
2
s_mem(22 downto 3) <= x"33333";

Ich lasse mich aber auch gerne eines Besseren belehren.

von Duke Scarring (Gast)


Lesenswert?

Die erste Schreibweise mußt Du in einen process stecken. Deine 
funktioniert überall.

Duke

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.