2016-10-07 2 views
2

Ich habe ein Modul mit 16bit Inout-Bus. In meiner Top-Level-Entity möchte ich nur 4 von ihnen verbinden (auch bidirektional). ofcourse sie verbindet, führt direkt zu einem FehlerVHDL bidirektionalen Bus Mismatch

port map(IO16bit => IO4bit) 

so verbunden ich den m durch ein internes Signal

signal temp : std_logic_vector (15 downto 0); 
port map(IO16bit => temp); 
IO4bit <= temp(3 downto 0); 

aber jetzt bekomme ich den Fehler: Tri-State-Knoten fährt nicht direkt auf oberste Ebene Pins und konvertiert Fanout in ein OR-Gatter

Ich verlor die Bidirektionalität hier. Wie kann ich das lösen?

Antwort

1

Sie können einen Bereich in der port map verwenden, und dann das verbleibende eine dummy wie:

signal dummy : std_logic_vector(15 downto 4) := (others => 'Z'); 
... 
port map(
    IO16bit(3 downto 0) => IO4bit, 
    IO16bit(15 downto 4) => dummy, 
... 

Das für die Simulation kompilieren, aber Sie müssen überprüfen, ob Ihre Synthese-Tool der Wahl auch akzeptieren können die Konstruktion und handle es richtig. Es ist oft ein Problem, interne inout Ports in einem synthetisierbaren Design zu haben.

+0

Oder sogar 'IO16bit (15 downto 4) => offen,' ohne das Dummy-Signal. Wenn Sie ein Dummy-Signal verwenden, fahren Sie es mit '(other => 'Z')', um Busabstürze zu vermeiden. –

+0

@BrianDrummond: Wenn 'open' anstelle von' dummy' verwendet wird, gibt ModelSim den Fehler "Formal" az_io "nicht aus mit OPEN verknüpft, wenn Unterelemente einzeln zugeordnet sind. ". Guter Punkt mit 'Z' für dummy. –