Forum: FPGA, VHDL & Co. Problem mit Verbindung von 2 FlipFlops


von transcend (Gast)


Lesenswert?

Hallo Forummitglieder;

Ich bin noch ein Anfänger in VHDL, und habe folgendes Problem:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity ioctrl is
6
  port
7
  (
8
    pb_i : in std_logic_vector (1 downto 0):=(others => '0');
9
    reset : in std_logic:= '0';
10
    clock : in std_logic := '0';
11
    ctreset_synch : out std_logic_vector(1 downto 0):=(others => '0')
12
  );
13
end ioctrl;
14
15
architecture sim of ioctrl is
16
17
component d_ff_2bit is
18
  port
19
  (
20
    d_i : in std_logic_vector (1 downto 0);
21
    r_i : in std_logic;
22
    clk_i : in std_logic;
23
    q_o : out std_logic_vector (1 downto 0)
24
  );
25
end component;
26
27
signal reset_all : std_logic:= '0';
28
signal clk_50 : std_logic:= '0';
29
signal d_ff_2_carry : std_logic_vector (1 downto 0):=(others => '0');
30
31
begin
32
  dff_2_bit_1 : d_ff_2bit
33
  port map
34
    (
35
      r_i  => reset_all,
36
      clk_i => clk_50,
37
      d_i => pb_i,
38
      q_o => d_ff_2_carry
39
    );
40
  
41
  dff_2_bit_2 : d_ff_2bit
42
  port map
43
    (
44
      r_i  => reset_all,
45
      clk_i => clk_50,
46
      d_i => d_ff_2_carry,
47
      q_o => ctreset_synch
48
    );
49
end sim;
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity d_ff_2bit is
6
  port
7
  (
8
    d_i : in std_logic_vector (1 downto 0);
9
    r_i : in std_logic;
10
    clk_i : in std_logic := '0';
11
    q_o : out std_logic_vector (1 downto 0)
12
  );
13
end d_ff_2bit;
14
15
-- Beschreibung der Funktion:
16
17
architecture rtl of d_ff_2bit is
18
  begin
19
    p_d_ff : process (clk_i)
20
    begin
21
      if(r_i = '1') then
22
        q_o <= (others => '0');
23
      elsif(clk_i 'event and clk_i = '1') then
24
        q_o <= d_i;
25
      end if;
26
    end process p_d_ff;
27
end rtl;

Warum hat der ctreset und die Zwischensignale UU als Ausgang?
Beim Kompellieren tritt eh kein Fehler auf, aber die FFs scheinen nicht 
miteinander verbunden zu sein.
Der Ausgang des 1 FFs kommt iwie nicht in den Eingang des 2 FFs rein.

Ich bin für jede Hilfe sehr dankbar.

von mifi (Gast)


Lesenswert?

Hallo,

kann es sein das hier der Takt fehlt?

ioctl hat als Takt das Signal clock. Bei den beiden FF
wird aber ein Signal clk_50 verwendet, was immer auf 0 liegt.

Anmerkung, für die Simulation fehlt Dir beim d_ff_2bit das
r_i Signal in der Sensitivitätsliste, kann das sein?

Gruß,
mifi

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


Lesenswert?

transcend schrieb:
> Der Ausgang des 1 FFs kommt iwie nicht in den Eingang des 2 FFs rein.
Wei stellst du das fest?

transcend schrieb:
> Warum hat der ctreset und die Zwischensignale UU als Ausgang?
Zeig doch mal. Wie sieht deine Testbench aus?

mifi schrieb:
> Anmerkung, für die Simulation fehlt Dir beim d_ff_2bit das
> r_i Signal in der Sensitivitätsliste, kann das sein?
DasSignal fehlt, aber das ist hier nicht das Problem. Es sieht einfach 
nur so aus, als ob hier ein synchroner Reset verbaut wäre, weil der 
Prozess nur bei einem Taktwechsel neu berechnet wird...  :-o

von transcend (Gast)


Lesenswert?

Lothar Miller schrieb:
> Zeig doch mal. Wie sieht deine Testbench aus?
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity tb_ioctrl is
6
end tb_ioctrl;
7
8
architecture sim of tb_ioctrl is
9
10
component ioctrl is
11
  port
12
  (
13
    pb_i : in std_logic_vector (1 downto 0):=(others => '0');
14
    sw_i : in std_logic_vector (2 downto 0):=(others => '0');
15
    reset : in std_logic:= '0';
16
    clock : in std_logic := '0';
17
    ct_instructions : out std_logic_vector(2 downto 0):=(others => '0');
18
    ctreset_synch : out std_logic_vector(1 downto 0):=(others => '0')
19
  );
20
end component;
21
22
signal pb_i_tb : std_logic_vector (1 downto 0):=(others => '0');
23
signal sw_i_tb : std_logic_vector (2 downto 0):=(others => '0');
24
signal reset_tb : std_logic:='0';
25
signal clock_tb : std_logic :='0';
26
signal ct_instructions_tb : std_logic_vector(2 downto 0):=(others => '0');
27
signal ctreset_synch_tb : std_logic_vector(1 downto 0):=(others => '0');
28
29
begin
30
  hallo : ioctrl
31
  port map
32
  (
33
    pb_i => pb_i_tb,
34
    sw_i => sw_i_tb,
35
    reset => reset_tb,
36
    clock => clock_tb,
37
    ct_instructions => ct_instructions_tb,
38
    ctreset_synch => ctreset_synch_tb
39
  );
40
  
41
  p_clk : process
42
    begin
43
      clock_tb <= not clock_tb;
44
      wait for 10 ns;
45
  end process p_clk;
46
  
47
  p_logic0 : process
48
  begin
49
    pb_i_tb <= "11";
50
    sw_i_tb <= "110";
51
    reset_tb <= '0';
52
    wait for 100 ns;
53
    
54
    pb_i_tb <= "00";
55
    sw_i_tb <= "001";
56
    reset_tb <= '0';
57
    wait for 100 ns;
58
  end process p_logic0;
59
end sim;

Danke für die Antworten:).

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


Lesenswert?

Diese 3 VHDL-Dateien passen nicht zusammen.
Ich bekomme die Fehler:
1
Line 97: Formal port <sw_i> does not exist in entity <ioctrl>.  
2
Line 100: Formal port <ct_instructions> does not exist in entity <ioctrl>.
Ok, dann behebe ich das mal....

Und tatsächlich: keine Änderung am Ausgang. Suspekt.
Was liefert die Synthese? Der RTL-Plan zeigt: Ausgänge hart auf 0 
verdrahtet. Da geht doch irgendwas mit dem Takt nicht richtig zu...

Kurz: ich reduziere das Problem mal auf das allernötigste. Dann kommst 
du sicher selber drauf, was da passiert:
1
entity ioctrl is
2
  port
3
  ( ...    
4
    clock : in std_logic := '0';
5
    ...
6
  );
7
end ioctrl;
8
9
:
10
:
11
12
signal clk_50 : std_logic:= '0';
13
14
:
15
:
16
  dff_2_bit_1 : d_ff_2bit
17
  port map
18
    ( ...      
19
      clk_i => clk_50,
20
      ...

Das zweite Problem lauert dann dort:
1
entity ioctrl is
2
  port
3
  ( ...
4
    reset : in std_logic:= '0';
5
:
6
:
7
8
signal reset_all : std_logic:= '0';
9
10
:
11
:
12
  dff_2_bit_1 : d_ff_2bit
13
  port map
14
    (
15
      r_i  => reset_all,

Fazit: am besten nennst du deinen Takt und deinen Reset (wenn du schon 
einen verwendest) immer gleich. Dann kann sowas nicht passieren...

BTW:
Es ist sinnlos, Eingangssignale vorzubelegen:
1
 
2
    pb_i : in std_logic_vector (1 downto 0):=(others => '0');
Wie sollte denn das in der realen Hardware funktionieren?
Fazit: Simulation passt nicht zur Hardware, Simulation falsch.

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.