mikrocontroller.net

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


Autor: Artur Funk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library ieee;
use ieee.std_logic_1164.all;

entity tri_io is
    port(   clk  : in std_logic;
          enable : in std_logic;
          
          write_s   : out std_logic_vector(3 downto 0);
          read_s   : in std_logic_vector(3 downto 0);
          bus_s   : inout std_logic_vector(3 downto 0)
          
          );
end tri_io;

architecture behaviour of tri_io is
signal int : std_logic_vector(3 downto 0) := X"2";

begin
  write_s <= bus_s;
  bus_s <= read_s when enable='1' else "ZZZZ";
  
  process (clk)
  begin
      if rising_edge(clk) then
        --int <= output;
      end if;
      
  end process;
end behaviour;


Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Artur Funk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Artur Funk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist das File von der Testbench:
library ieee;
use ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_TEXTIO.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE STD.TEXTIO.ALL;

ENTITY tri_test_tw IS
END tri_test_tw;

ARCHITECTURE testbench_arch OF tri_test_tw IS
    FILE RESULTS: TEXT OPEN WRITE_MODE IS "results.txt";

    COMPONENT tri_io
        PORT (
            clk : In std_logic;
            enable : In std_logic;
            write_s : Out std_logic_vector (3 DownTo 0);
            read_s : In std_logic_vector (3 DownTo 0);
            bus_s : InOut std_logic_vector (3 DownTo 0)
        );
    END COMPONENT;

    SIGNAL clk : std_logic := '0';
    SIGNAL enable : std_logic := '0';
    SIGNAL write_s : std_logic_vector (3 DownTo 0) := "0000";
    SIGNAL read_s : std_logic_vector (3 DownTo 0) := "0000";
    SIGNAL bus_s : std_logic_vector (3 DownTo 0) := "0000";

    constant PERIOD : time := 200 ns;
    constant DUTY_CYCLE : real := 0.5;
    constant OFFSET : time := 0 ns;

    BEGIN
        UUT : tri_io
        PORT MAP (
            clk => clk,
            enable => enable,
            write_s => write_s,
            read_s => read_s,
            bus_s => bus_s
        );

        PROCESS    -- clock process for clk
        BEGIN
            WAIT for OFFSET;
            CLOCK_LOOP : LOOP
                clk <= '0';
                WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
                clk <= '1';
                WAIT FOR (PERIOD * DUTY_CYCLE);
            END LOOP CLOCK_LOOP;
        END PROCESS;

        PROCESS
            BEGIN
                -- -------------  Current Time:  85ns
                WAIT FOR 85 ns;
                enable <= '1';
                bus_s <= "0010";
                -- -------------------------------------
                -- -------------  Current Time:  285ns
                WAIT FOR 200 ns;
                enable <= '0';
                -- -------------------------------------
                -- -------------  Current Time:  485ns
                WAIT FOR 200 ns;
                enable <= '1';
                bus_s <= "0011";
                -- -------------------------------------
                -- -------------  Current Time:  685ns
                WAIT FOR 200 ns;
                bus_s <= "0001";
                -- -------------------------------------
                -- -------------  Current Time:  885ns
                WAIT FOR 200 ns;
                enable <= '0';
                -- -------------------------------------
                WAIT FOR 315 ns;

            END PROCESS;

    END testbench_arch;

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Artur Funk (Gast)
Datum:

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

Danke Euch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.