Tri-State Element für Spratan3(Xilinx)

Gast #980051
Hallo alle zusammen!

hab folgende Frage:

ich implementiere einen 8051-Softcore, beabsichtige diesen an 
CAN-Controller(SJA1000) anzuschließen, und nun taucht das Problem auf.
Die Ports meines Softcore-µC sind NICHT BIDIREKTIONAL ausgeführt
(s. Anhang),was bei einem normalen 8051 nicht der Fall ist(P0 ist
bidirektional, kann man direkt an den CAN-Controller anschließen).
Nun, damit ich Softcore und CAN-Controller verbinden kann,
brauche ich wohl einen Tri-State Element, damit ich die separaten
Ein- und Ausgänge zusammenführen kann. Ich weiß, daß Altera so ein
Tri-State Element innerhalb der Megafunctions Bibliothek zur Verfügung
stellt, ich selber arbeite aber mit einem Xilinx Spartan3 Board
und ISE-Software, und muß zugeben, hab bis jetzt leider nichts
vergleichbares bei Xilinx gefunden. Kann mir da jemand von den
Xilinx-Profis eventuell einen Tip geben, oder einen Hinweis,
wie ich das ganze nun realisieren könnte?

Danke im Voraus
Juri
Angehängte Dateien:
Gast #980061
Den TRibuffer kann man ganz einfach manuell formulieren, in dem man je 
nach Steuersignal read/write einen Ausgang auf "Z" oder "1"/"0" legt.
Das erkennen die Tools.

Innerhalb Deines Designs, musst Du das aber mit duplizierten Bussen 
machen, also je eine Leitung hin und zurück mit mit Multiplexern 
umschalten.
Gast #980278
Danke Klaus!

hab mir folgendes überlegt:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity bidir is
    Port ( en     : in    STD_LOGIC;
           out_i   : in    STD_LOGIC_VECTOR (7 downto 0);
           in_i   : out    STD_LOGIC_VECTOR (7 downto 0);
           i_o   : inout  STD_LOGIC_VECTOR (7 downto 0)
        );
end bidir;

architecture Behavioral of bidir is

begin

-- gesteuerter Schreibvorgang
WRITE:  process(en, out_i)
      begin
        if en = '1' then
          i_o <= out_i;
        else
          i_o <= (others => 'Z');
        end if;
      end process WRITE;

-- paralleler Lesevorgang
READ:    in_i <= i_o;
end Behavioral;


werde das ganze mal simulieren, danach werde ich wohl klüger...
Gast #980424
Einfacher und besser ist vielleicht :

i_o <= out_i when en = 1 else (others => 'Z');
in_i <= i_o;

und die entity wegläßt, indem Du diese 2 Zeilen ins Top-Level schreibst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.