Forum: FPGA, VHDL & Co. komischer fehler in vhdl mit modelsim


von mikrofriendly (Gast)


Lesenswert?

Hallihallo,

Um zwei Bits in einem Vektor zu löschen, wollte ich folgende VHDL-Zeile 
verwenden:

signal vec:std_logic_vector(7 downto 0);
signal logic_bit1:std_logic_vector(7 downto 0);
signal logic_bit2:std_logic_vector(7 downto 0);
....

vec <= (7 downto 0 => '1');

logic_bit1 <= (7 downto 0 => '0');
logic_bit2 <= (7 downto 0 => '0');
logic_bit1(0) <= '1';
logic_bit2(1) <= '1';

vec <= vec and (not(logic_bit1 or logic_bit2));

somit sollte eigentlich 1111 1100 rauskommen ... aber leider ändert sich 
bei mir in modelsim nichts.

nur wenn ich in meiner testbench schreibe:
variable tmp:std_logic_vector(7 downto 0);
...
tmp <= logic_bit1 or logic_bit2;
vec <= vec and (not tmp);

kommt am ende das richtige ergebnis raus.

ist es nicht möglich beliebig viele erschachtelungen von bitverküpfungen 
in modelsim zu beschreiben?

mfg

von IsKlar (Gast)


Lesenswert?

Könntest du deinen kompletten Code zeigen?
Mit den gezeigten Bruchstücken sollte in Modelsim fast alles undefiniert 
sein.

IsKlar

von berndl (Gast)


Lesenswert?

mikrofriendly schrieb:
> variable tmp:std_logic_vector(7 downto 0);
> ...
> tmp <= logic_bit1 or logic_bit2;

das sollte dir ModelSim allerdings schon um die Ohren hauen!

von SIMser (Gast)


Lesenswert?

Die ganzen Zuweisungen stehen in einem >Process<
und die >Sensitive Lit< ist nicht vollständig?

von mikrofriendly (Gast)


Lesenswert?

Hallo,
Es handelt sich um eine Testbench. Ich habe keine sensitivity list :)


architecture ...
signal vec:std_logic_vector(7 downto 0):= x"FF";
signal logic_bit1:std_logic_vector(7 downto 0):= x"01";
signal logic_bit2:std_logic_vector(7 downto 0):= x"02";

begin
...

process
begin

wait on irgendeinsignal;

vec <= vec and (not(logic_bit1 or logic_bit2));

end process; -- hier sollte 1111 1100 rauskommen, wenn sich etwas
             -- an irgendeinsignal aendert, leider erscheint 1111 1111

tmp <= logic_bit1 or logic_bit2;
vec <= vec and (not tmp);



process
variable tmp:std_logic_vector(7 downto 0);
begin

wait on irgendeinsignal2;

tmp <= logic_bit1 or logic_bit2;
vec <= vec and (not tmp);

end process; -- hier kommt 1111 1100 raus

von Xenu (Gast)


Lesenswert?

Bei mir geht das (Xilinx ISIM 13.1).

von mikrofriendly (Gast)


Lesenswert?

Selltsam, ich nutze Modelsim

von Actel Modelsim 6.6d

von berndl (Gast)


Lesenswert?

mikrofriendly schrieb:
> tmp <= logic_bit1 or logic_bit2;
> vec <= vec and (not tmp);
>
>
>
> process
> variable tmp:std_logic_vector(7 downto 0);
> begin
>
> wait on irgendeinsignal2;
>
> tmp <= logic_bit1 or logic_bit2;
> vec <= vec and (not tmp);
>
> end process; -- hier kommt 1111 1100 raus

wie schon oben bemerkt: tmp := ... waere richtig (variable). Und 
ausserdem kannst du dann oben nicht ausserhalb des process tmp <= ... 
schreiben, da ist es naemlich concurrent und muss dann ein signal sein, 
keine variable

von mikrofriendly (Gast)


Lesenswert?

>wie schon oben bemerkt: tmp := ... waere richtig (variable). Und
>ausserdem kannst du dann oben nicht ausserhalb des process tmp <= ...
>schreiben, da ist es naemlich concurrent und muss dann ein signal sein,
>keine variable

Da hast du recht, sorry ich hab das eben mal schnell geschreiben ohne zu 
guggn was der compiler dazu sagt. in meiner testbench, habe ich 
natürlich keine signale auf denen schreibend in mehreren prozessen 
zugergiffn wird.

mfg

von J. S. (engineer) Benutzerseite


Lesenswert?

Mal abgesehen von dem Fehler, den ich nicht ganz nachvollziehen kann - 
ist das nicht ein wenig arg umständlich, auf diese Weise bits zu 
nullen??

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.