Forum: FPGA, VHDL & Co. Tri-State Element für Spratan3(Xilinx)


von Juri (Gast)


Angehängte Dateien:

Lesenswert?

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

von K. L. (Gast)


Lesenswert?

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.

von Juri (Gast)


Lesenswert?

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...

von Juri (Gast)


Lesenswert?

kann mir jemand sagen, ob ich da richtig mit dem design liege?

von Klaus Falser (Gast)


Lesenswert?

Wenn Du mit den Signalen aus dem FPGA hinaus willst, dann ist es so 
richtig.

von Jan M. (mueschel)


Lesenswert?

Ja, das ist alles in Ordnung - viel anders machen kann man da nicht. Die 
entsprechende Primitve von Xilinx heißt OBUFT, wegen der besseren 
Portierbarkeit würde ich aber deinen Code vorziehen.

von Klaus Falser (Gast)


Lesenswert?

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.

von Juri (Gast)


Lesenswert?

Danke Leute !!!

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.