Forum: FPGA, VHDL & Co. Verstehe VHDL Konstrukt nicht


von Volker D. (volker_d)


Lesenswert?

hallo bei folgendem Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
entity Toplevel_A is
4
port( CLK, RST : in std_logic;
5
A : out std_logic_vector(2 downto 0));
6
end entity;
7
architecture Behavioral of Toplevel_A is
8
signal sr : std_logic_vector(2 downto 0);
9
signal invert : std_logic;
10
begin
11
A <= sr;
12
invert <= not sr(0);
13
process(CLK,RST) begin
14
if RST = '1' then
15
sr <= "000";
16
elsif CLK'event and CLK = '1' then
17
sr <= invert & sr(2) & sr(1);
18
end if;
19
end process;
20
end architecture;

verstehe ich folgende Zeile nicht:
1
sr <= invert & sr(2) & sr(1);

die Simulation sagt mir, dass sich pro steigende Taktflanke die
Werte A(0), A(1), A(2) folgendermaßen verhalten:
(1,0,0), (1,1,0), (1,1,1), (0,1,1), (0,0,1), (0,0,0), (1,0,0), (1,1,0) 
usw.
ich kann das überhaupt nicht nachvollziehen.
Für eine Erklärung würde ich mich sehr freuen.

Vielen Dank im voraus.

von user (Gast)


Lesenswert?

ja du fügst die einzelnen Bits zu einem Vektor zusammen, Beispiel

"1" & "0" & "1" --> "101"

von Volker D. (volker_d)


Lesenswert?

aber dann würde sich A(0),..,A(2) ja so verhalten müssen:

(1,0,0), (0,0,0), (1,0,0), (0,0,0), (1,0,0) usw. weil invert ja "not 
sr(0)"
ist, was das Komplement von A(0) ist und sr(1), sr(2) was A(1), A(2) 
entspricht ist ja Initial auf 0. Bei der ersten Taktflanke passt (1,0,0) 
noch, aber bei der zweiten ist nach der Simulation (1,1,0). Irgendwie 
passt das so nicht.

Grüße

von Georg A. (georga)


Lesenswert?

Die Simulation gibt die Werte (A2, A1, A0) aus.

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


Lesenswert?

Volker D. schrieb:
> verstehe ich folgende Zeile nicht:
>   sr <= invert & sr(2) & sr(1);
Schlag mal in deinem VHDL Buch unter dem Stichwort "Concatenation" (von 
concatenate = aneinanderhängen) nach. Auf Deutsch: der &-Operator ist 
kein UND-Operator!!!

> (1,0,0), (1,1,0), (1,1,1), (0,1,1), (0,0,1), (0,0,0), (1,0,0), (1,1,0)
> ich kann das überhaupt nicht nachvollziehen.
Dem sr wird stellenweise versetzt ein neuer Wert zugewiesen. Das ist 
ein Schieberegister, das den Wert von invert von links nach rechts 
durchschiebt. Schreib einfach die Werte mal untereinander und lass die 
Klammern und das störende Beiwerk weg, dann siehst du das Muster:
1
100 
2
110 
3
111 
4
011 
5
001 
6
000 
7
100 
8
110
Klar jetzt?

Sowas nimmt man gern zum Einsynchronisieren von Eingangssignalen mit 
nachfolgender Flankenerkennung
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Volker D. schrieb:

> signal sr : std_logic_vector(2 downto 0);

Damit ist
sr  so definiert

sr (2) & sr (1) & sr (0)

Mit dieser Zeile

> sr <= invert & sr(2) & sr(1);

sr <= not sr(0) & sr(2) & sr(1);

setzt du es um eine Position nach rechts rotiert neu zusammen. Das ist 
nichts anderes als eine Rotation rechts mit Negation.

Tom

von Volker D. (volker_d)


Lesenswert?

hallo,

das der erste Wert von A: 100 ist versteh ich, aber wie komm ich auf den 
zweiten Wert 110 ? A(2) müsste doch eigentlich bei der zweiten 
steigenden Taktflanke 0 werden und A(1) und A(0) müssten doch immer 0 
bleiben. Also wäre doch A: 000 der zweite Wert eigentlich? Ich verstehs 
einfach nicht :(

von Andreas B. (andreas_b77)


Lesenswert?

Wieso? sr(2) wird auch im zweiten Zyklus sr(0) invertiert sein. Da sr(0) 
im ersten Zyklus '0' ist (siehe A = "100") ist die Invertierung immer 
noch '1'. Also was kann anderes herauskommen als "110"?

von Georg A. (georga)


Lesenswert?

Ich glaube immer noch, dass du die Ausgangsreihenfolge vertauscht 
siehst.

A2 A1 A0
(1, 0, 0),
(1, 1, 0),
(1, 1, 1),
(0, 1, 1),
(0, 0, 1),
(0, 0, 0),
(1, 0, 0),
(1, 1, 0)

von M.O. (Gast)


Lesenswert?

Volker D. schrieb:
> ich kann das überhaupt nicht nachvollziehen.
wieso, ist doch genau das, was dasteht (?)

von Volker D. (volker_d)


Lesenswert?

ich hab's mir jetzt mal Schritt für Schritt aufgeschrieben und hab es 
dann doch hinbekommen. War nur schwierig, das alles direkt im Kopf zu 
lösen.
Aber danke für die Hilfe.

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.