Forum: FPGA, VHDL & Co. [VHDL] Inkrementieren eines std_logic_vectors


von Tandrael (Gast)


Lesenswert?

Ich will einen std_logic_vector + 1 in einer Testbench rechnen.
Normalerweise sollte ja einfach diese Programmzeile das Problem lösen:

A <= std_logic_vector(unsigned(A) + 1;

Dabei kommt jedoch zuerst 0000...000X und dann nach einer weiteren 
Clockschaltung XXXX...XXXX heraus.

Ich benutze folgende Pakete:
IEEE.std_logic_1164.all
IEEE.std_logic_unsigned.all
IEEE.std_logic_textio.all
IEEE.std_logic_numeric_std.all
std.textio.all

von Marius W. (mw1987)


Lesenswert?

Mach mal die IEEE.std_logic_unsigned.all raus. Zuviel ist auch nicht 
gut...

Gruß
Marius

von Tandrael (Gast)


Lesenswert?

Jetzt bekomme ich einen Fehler während des Checks, und zwar kennt er 
angeblich keine Definition für "+".

von Tandrael (Gast)


Lesenswert?

Tandrael schrieb:
> Jetzt bekomme ich einen Fehler während des Checks, und zwar kennt
> er
> angeblich keine Definition für "+".

Ich habe mich geirrt. Ich bekomme jetzt in der Simulation die ganze Zeit 
nur Us.

von HalloMalloPallo_HMP (Gast)


Lesenswert?

Tandrael schrieb:
> Tandrael schrieb:
>> Jetzt bekomme ich einen Fehler während des Checks, und zwar kennt
>> er
>> angeblich keine Definition für "+".
>
> Ich habe mich geirrt. Ich bekomme jetzt in der Simulation die ganze Zeit
> nur Us.

Hast du den Vector überhaupt initialisiert?

von Olga (Gast)


Lesenswert?

Tandrael schrieb:
> Ich habe mich geirrt. Ich bekomme jetzt in der Simulation die ganze Zeit
> nur Us

Und jetzt liest du noch nach, für was der Wert 'U' steht, dann sollte 
dir ein Licht aufgehen ;-)

von Tandrael (Gast)


Lesenswert?

HalloMalloPallo_HMP schrieb:
> Hast du den Vector überhaupt initialisiert?

Ja, als komplett 0. Theoretisch müsste also nach einem Clock-Durchgang 
statt 0000...0000 0000...0001 dastehen.

Olga schrieb:
> Und jetzt liest du noch nach, für was der Wert 'U' steht, dann sollte
> dir ein Licht aufgehen ;-)

Wie schaue ich das nach?

von Olga (Gast)


Lesenswert?

In deinem VHDL Buch ;-)  Aber ums abzukürzen: 'U' bedeutet 
"uninitialized". Da ist also irgendwas in deiner Rechnung nicht richtig 
initialisiert.

von Tandrael (Gast)


Lesenswert?

Olga schrieb:
> In deinem VHDL Buch ;-)  Aber ums abzukürzen: 'U' bedeutet
> "uninitialized". Da ist also irgendwas in deiner Rechnung nicht richtig
> initialisiert.

Vielen Dank, aber irgendsoetwas hatte ich mir schon gedacht. Die Frage 
ist nun, was stimmt nicht.

von Olga (Gast)


Lesenswert?

Zeit doch mal den Code, dann kann man mehr sagen.

von Tandrael (Gast)


Lesenswert?

[vhdl]
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE IEEE.NUMERIC_STD.ALL;
USE STD.TEXTIO.ALL;

ENTITY testbench IS

END testbench;

ARCHITECTURE testbench_arch OF testbench IS

COMPONENT prakt2

PORT (
A: in std_logic_vector (31 downto 0);
B: in std_logic_vector (31 downto 0);
F: in std_logic_vector (2 downto 0);
Y: out std_logic_vector (31 downto 0);
Clock: in std_logic
);

END COMPONENT;

--develop signals to stimulate

SIGNAL A : std_logic_vector (31 downto 0) := (31 downto 0 => '0');
SIGNAL B : std_logic_vector (31 downto 0) := (31 downto 0 => '0');
SIGNAL F : std_logic_vector (2 downto 0) := (2 downto 0 => '0');
SIGNAL Y : std_logic_vector (31 downto 0) := (31 downto 0 => '0');
SIGNAL Clock : std_logic := '0';
SIGNAL V : std_logic_vector (31 downto 0) := (31 downto 1 => '0', others 
=> '1');

--UUT means unit under test

BEGIN

UUT : prakt2

--map signals on right to entitys on the left

PORT MAP (
A => A,
B => B,
F => F,
Y => Y,
Clock => Clock
);

signal_Clock: process

begin
   wait for 1 ns;
   Clock <= NOT Clock;
end process;

signal_A: process(Clock)

begin
   if rising_edge(Clock) then
       A <= std_logic_vector(unsigned(A) + 1);
   end if;
end process;

END testbench_arch;
[vhdl]

von Olga (Gast)


Lesenswert?

Also da dürfte eigentlich in A gar kein 'U' auftreten.

von Tandrael (Gast)


Lesenswert?

Olga schrieb:
> Also da dürfte eigentlich in A gar kein 'U' auftreten.

Tja, so geht es mir auch schon seit zwei Stunden, und ich kann den Grund 
für die vielen Us nicht finden. Für mich steht das V in VHDL ab jetzt 
für Verzweiflung.

von Tandrael (Gast)


Lesenswert?

Tandrael schrieb:
> Olga schrieb:
>> Also da dürfte eigentlich in A gar kein 'U' auftreten.
>
> Tja, so geht es mir auch schon seit zwei Stunden, und ich kann den Grund
> für die vielen Us nicht finden. Für mich steht das V in VHDL ab jetzt
> für Verzweiflung.

Geht denn beu dir?

von franke (Gast)


Lesenswert?

geht

 A <= A + '1';

???

von Tandrael (Gast)


Lesenswert?

franke schrieb:
> geht
>
>  A <= A + '1';
>
> ???

Mit den Anführungsstrichen bekomme ich wieder die Xe.

von franke (Gast)


Lesenswert?

hab's Interesse halber mal in ALDEC reingezogen...

da geht's.


gruß

von Tandrael (Gast)


Lesenswert?

franke schrieb:
> hab's Interesse halber mal in ALDEC reingezogen...
>
> da geht's.
>
> gruß

Ja, ein Kumpel hat das beinahe gleiche Programm, die Abläufe sind genau 
dieselben, trotzdem funktioniert es nicht.

von berndl (Gast)


Lesenswert?

Tandrael schrieb:
> SIGNAL A : std_logic_vector (31 downto 0) := (31 downto 0 => '0');
> SIGNAL B : std_logic_vector (31 downto 0) := (31 downto 0 => '0');
> SIGNAL F : std_logic_vector (2 downto 0) := (2 downto 0 => '0');
> SIGNAL Y : std_logic_vector (31 downto 0) := (31 downto 0 => '0');
> SIGNAL Clock : std_logic := '0';
> SIGNAL V : std_logic_vector (31 downto 0) := (31 downto 1 => '0', others
> => '1');

kann es sein, dass deine Initialisierung (31 downto 0 => '0') usw. 
schief geht? Ich habe das so noch nie gesehen. Ich wuerde z.B. 
schreiben:
1
...
2
SIGNAL Y : std_logic_vector (31 downto 0) := (others => '0'); 
3
...
4
SIGNAL V : std_logic_vector (31 downto 0) := (0 => '1', others => '0');

von Tandrael (Gast)


Lesenswert?

Bei uns funktioniert die Deklaration; Alle Werte sind am Anfang mit 0 
initialisiert, der Fehler tritt erst nach der ersten Addition auf.

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


Lesenswert?

Zeig doch mal einen Screenshot der Waveform deiner Testbench...

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.