Forum: FPGA, VHDL & Co. Undefinierte Zustände vom Tristate


von Artur Funk (Gast)


Lesenswert?

Hi, ich Probiere eine inout Kommunikation hinzukriegen, leider habe ich 
undefinierte Zustände, wenn enable auf 0 ist, da sollte inout aber 
eigentlich hochomig sein. Die ganze Datei zu posten wäre zu 
unübersichtlich, hier ist aber eine Vereinfachte Version:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity tri_io is
5
    port(   clk  : in std_logic;
6
          enable : in std_logic;
7
          
8
          write_s   : out std_logic_vector(3 downto 0);
9
          read_s   : in std_logic_vector(3 downto 0);
10
          bus_s   : inout std_logic_vector(3 downto 0)
11
          
12
          );
13
end tri_io;
14
15
architecture behaviour of tri_io is
16
signal int : std_logic_vector(3 downto 0) := X"2";
17
18
begin
19
  write_s <= bus_s;
20
  bus_s <= read_s when enable='1' else "ZZZZ";
21
  
22
  process (clk)
23
  begin
24
      if rising_edge(clk) then
25
        --int <= output;
26
      end if;
27
      
28
  end process;
29
end behaviour;

von Klaus F. (kfalser)


Lesenswert?

Der VHDL Code schaut normal aus, Du hast vielleicht die Bus-Hold 
(Keeper) Funktion aktiviert.

Was für ein FPGA/CPLD verwendest Du?

Klaus

von Matthias (Gast)


Lesenswert?

Meinst du beim simulieren? dann sollteste du in die Simulation auch 
einbringen, dass externe Pull-Up oder Pull-Down Widerstände (Signal <= 
'H' bzw 'L') angebracht sind. Wenn keine Komponente das Signal treibt 
dann auch keine Pull Up/Downs angebracht sind, dann ist der Zustand des 
Signals undefiniert.

von Artur Funk (Gast)


Lesenswert?

Es geht um reine Simulation, bevor ich keine Saubere Simulation habe 
probiere ich es doch nicht auf dem Board aus :D

@  Matthias: Kanns du mich an ein Beispiel verweisen?

von Klaus F. (kfalser)


Lesenswert?

> Wenn keine Komponente das Signal treibt dann auch keine Pull Up/Downs
> angebracht sind, dann ist der Zustand des Signals undefiniert.

Das stimmt so nicht ganz.
Undefiniert ist das Signal nur wenn es entweder nicht initialisiert 
(Wert 'U') oder wenn der Bus von 2 oder mehreren verschiedenen Signalen 
getrieben ist (Wert 'X').
Wenn das Modul aber dem Bus ein 'Z' zuweist, und die Testbench dem Bus 
nichts zuweist, dann sieht man auch ein 'Z' in der Simulation.

Poste einmal die VHDL Testbench, mit der Du das Modul testest.

Klaus

von Artur Funk (Gast)


Lesenswert?

Hier ist das File von der Testbench:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
USE IEEE.STD_LOGIC_TEXTIO.ALL;
4
USE IEEE.STD_LOGIC_ARITH.ALL;
5
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
6
USE STD.TEXTIO.ALL;
7
8
ENTITY tri_test_tw IS
9
END tri_test_tw;
10
11
ARCHITECTURE testbench_arch OF tri_test_tw IS
12
    FILE RESULTS: TEXT OPEN WRITE_MODE IS "results.txt";
13
14
    COMPONENT tri_io
15
        PORT (
16
            clk : In std_logic;
17
            enable : In std_logic;
18
            write_s : Out std_logic_vector (3 DownTo 0);
19
            read_s : In std_logic_vector (3 DownTo 0);
20
            bus_s : InOut std_logic_vector (3 DownTo 0)
21
        );
22
    END COMPONENT;
23
24
    SIGNAL clk : std_logic := '0';
25
    SIGNAL enable : std_logic := '0';
26
    SIGNAL write_s : std_logic_vector (3 DownTo 0) := "0000";
27
    SIGNAL read_s : std_logic_vector (3 DownTo 0) := "0000";
28
    SIGNAL bus_s : std_logic_vector (3 DownTo 0) := "0000";
29
30
    constant PERIOD : time := 200 ns;
31
    constant DUTY_CYCLE : real := 0.5;
32
    constant OFFSET : time := 0 ns;
33
34
    BEGIN
35
        UUT : tri_io
36
        PORT MAP (
37
            clk => clk,
38
            enable => enable,
39
            write_s => write_s,
40
            read_s => read_s,
41
            bus_s => bus_s
42
        );
43
44
        PROCESS    -- clock process for clk
45
        BEGIN
46
            WAIT for OFFSET;
47
            CLOCK_LOOP : LOOP
48
                clk <= '0';
49
                WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
50
                clk <= '1';
51
                WAIT FOR (PERIOD * DUTY_CYCLE);
52
            END LOOP CLOCK_LOOP;
53
        END PROCESS;
54
55
        PROCESS
56
            BEGIN
57
                -- -------------  Current Time:  85ns
58
                WAIT FOR 85 ns;
59
                enable <= '1';
60
                bus_s <= "0010";
61
                -- -------------------------------------
62
                -- -------------  Current Time:  285ns
63
                WAIT FOR 200 ns;
64
                enable <= '0';
65
                -- -------------------------------------
66
                -- -------------  Current Time:  485ns
67
                WAIT FOR 200 ns;
68
                enable <= '1';
69
                bus_s <= "0011";
70
                -- -------------------------------------
71
                -- -------------  Current Time:  685ns
72
                WAIT FOR 200 ns;
73
                bus_s <= "0001";
74
                -- -------------------------------------
75
                -- -------------  Current Time:  885ns
76
                WAIT FOR 200 ns;
77
                enable <= '0';
78
                -- -------------------------------------
79
                WAIT FOR 315 ns;
80
81
            END PROCESS;
82
83
    END testbench_arch;

von Klaus F. (kfalser)


Lesenswert?

Eine Testbench simuliert die anderen Busteilnehmer.

Bevor die Testbench also enable auf '1' setzt, damit Dein tri_io Modul 
den Bus treibt, muß der Bus von der Testbench freigegen werden.
Die Testbench muß den Bus also vorher auf hochohmig ('Z') setzen.

von Artur Funk (Gast)


Lesenswert?

Ok, verstehe. Somit sind die "X" Zustände zu erklären, also dürfte das 
auf der Hardware insgesamt problemlos laufen.

Danke Euch.

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.