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
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.
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...
kann mir jemand sagen, ob ich da richtig mit dem design liege?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.