Forum: FPGA, VHDL & Co. D-Flip-Flop Rückkopplung negiertem Ausgang Qbar auf Eingang D


von Bruno K. (b0bbyr4y)


Angehängte Dateien:

Lesenswert?

Hi,

ich versuche mich gerade in VHDL und brauche in einer Schaltung ein 
D-Flip-Flop, bei dem der negierte Ausgang Qbar auf den Eingang D 
zurückgeführt wird. Leider bin ich mit meinem VHDL-Code nicht weiter 
gekommen. Ich kann mir leider auch nicht erklären wo der Fehler liegt.

Der VHDL-Code für das D-Flip-Flop:
1
entity dff2 is
2
  Port ( D : in STD_LOGIC; CLK : in STD_LOGIC; Q : out STD_LOGIC;
3
                      Qbar : inout STD_LOGIC
4
  );
5
end dff2;
6
7
architecture Behavioral of dff2 is
8
9
begin
10
11
  process (CLK)
12
  begin
13
    if( CLK='1' and CLK'event ) then
14
      Q <= D;
15
      Qbar <= not(D);
16
    end if;
17
  end process;
18
19
end Behavioral;

Der VHDL-Code mit der Rückführung durch ein
1
signal Qbar_s
 und dem Signal für die Simulation ist unten aufgeführt. Im Anhang habe 
ich auch noch ein Diagramm mit der Beschaltung des D-Flip-Flops, wie ich 
es versucht habe zu simulieren.
1
entity test_dff is
2
--  Port ( );
3
end test_dff;
4
5
architecture Behavioral of test_dff is
6
7
  component dff2
8
  port( D : in STD_LOGIC; CLK : in STD_LOGIC; Q : out STD_LOGIC;
9
                       Qbar : inout STD_LOGIC
10
  );
11
  end component;
12
13
  signal U1 : STD_LOGIC;
14
  signal CLK_s : STD_LOGIC;
15
  signal Q_s : STD_LOGIC;
16
  signal Qbar_s : STD_LOGIC;
17
18
  constant period : TIME := 20us;
19
20
begin
21
22
  -- Instantiate D-FF1
23
  dff1 : dff2 port map (
24
    D => Qbar_s,
25
    CLK => CLK_s,
26
    Q => Q_s,
27
    Qbar => Qbar_s
28
  );
29
30
  -- Generate clock
31
  CLK <=  '1' after 1*period/2,
32
    '0' after 1*period,
33
    '1' after 3*period/2,
34
    '0' after 2*period,
35
    '1' after 5*period/2,
36
    '0' after 3*period,
37
    '1' after 7*period/2,
38
    '0' after 4*period,
39
    '1' after 9*period/2,
40
    '0' after 5*period,
41
    '1' after 11*period/2,
42
    '0' after 6*period,
43
    '1' after 13*period/2,
44
    '0' after 7*period,
45
    '1' after 15*period/2,
46
    '0' after 8*period,
47
    '1' after 17*period/2,
48
    '0' after 9*period,
49
    '1' after 19*period/2,
50
    '0' after 10*period,
51
    '1' after 21*period/2,
52
    '0' after 11*period,
53
    '1' after 23*period/2,
54
    '0' after 12*period,
55
    '1' after 25*period/2,
56
    '0' after 13*period,
57
    '1' after 27*period/2,
58
    '0' after 14*period,
59
    '1' after 29*period/2,
60
    '0' after 15*period,
61
    '1' after 31*period/2,
62
    '0' after 16*period,
63
    '1' after 33*period/2,
64
    '0' after 17*period,
65
    '1' after 35*period/2,
66
    '0' after 18*period,
67
    '1' after 37*period/2,
68
    '0' after 19*period,
69
    '1' after 39*period/2,
70
    '0' after 20*period;
71
72
end Behavioral;

Im Anhang habe ich auch noch eine Abbildung mit den Signalverläufen zur 
Simulation. Meine Ausgänge bleiben undefined (U) und ich weiß nicht 
warum :-/

Kann mir einer erklären was ich übersehe? Eine direkte Rückkopplung 
sollte doch möglich sein?


Freundliche Grüße
Bruno

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


Lesenswert?

Bruno K. schrieb:
> Kann mir einer erklären was ich übersehe?
Am Anfang sind alle Signale 'U'nitialized. Und was ist ein negiertes 
'U'? Auch ein 'U'...

Probiers mal als Gebastel so:
1
  Port ( D : in STD_LOGIC; CLK : in STD_LOGIC;
2
                      Q : out STD_LOGIC := '0';
3
                      Qbar : inout STD_LOGIC := '1' );
Und: arbeite mit lokalen Signalen statt mit inout. Denn du hast da weit 
und breit keine inout. Nirgends.
Und lokale Signale kannst du dann auch initialisieren wie es sich 
gehört.


> CLK <=  '1' after 1*period/2,
Fehlt da ein _s?

BTW, einen Takt erzeuge ich so:
1
  signal CLK_s : STD_LOGIC := '0';
2
3
begin
4
5
  -- Generate clock
6
  CLK_s <=  not CLK_s after period/2;

von bitwurschtler (Gast)


Lesenswert?

1
-- Toggle-FF
2
library ieee;
3
use ieee. std_logic_1164.all;
4
5
entity dff2 is
6
   Port ( --D    : in STD_LOGIC; 
7
        CLK_i    : in STD_LOGIC; 
8
          Q_o    : out STD_LOGIC;
9
          Qbar_o : out STD_LOGIC
10
   );
11
 end dff2;
12
13
14
architecture Behavioral of dff2 is
15
16
signal Q_sig: std_logic := '0'; --check init value 
17
18
signal D_sig, Qbar_sig: std_logic;  
19
begin
20
   process (CLK_i)
21
   begin
22
     if rising_edge(CLK_i) then
23
       Q_sig <= D_sig;
24
     end if;
25
   end process;
26
27
Qbar_sig <= not Q_sig; 
28
D_sig    <=     Qbar_sig;
29
30
Q_o      <=     Q_sig; 
31
Qbar_o   <=     Qbar_sig;
32
33
34
end Behavioral;

von Bruno K. (b0bbyr4y)


Lesenswert?

Danke Lothar,

das Problem war tatsächlich nur die Initialisierung. Habe jetzt ein 
Reset mit eingebaut, der alles in einen definierten Zustand bringt.

Danke nochmal.

Grüße
Bruno

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


Lesenswert?

Bruno K. schrieb:
> das Problem war tatsächlich nur die Initialisierung.
Wie gesagt: vordergründig...  ;-)

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.