Verstehe VHDL Konstrukt nicht

OP #3240863
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.
OP #3240891
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
Moderator (Firma: Titel) Persönliche Seite #3240962
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
OP #3241654
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 :(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren