Ich weiß, dass Einheiten uneingeschränkte Array-Typen (z. B. STD_LOGIC_VECTOR
) in ihrer Portliste verwenden können, deren Größe automatisch an das in der Portkarte angeschlossene Signal angepasst wird, wenn sie instanziiert wird (und möglicherweise unterschiedliche Größen für jede Instanziierung). Innerhalb der Entität können Attribute wie 'LENGTH
und 'HIGH
verwendet werden, um den tatsächlich instanziierten Bereich zu ermitteln.
Ich habe ein solches Objekt, bei dem es sich um einen Parallel-> Seriell-Konverter handelt (akzeptiere Eingaben jeder Größe, breitere Eingaben erfordern mehr Taktzyklen zum Ausspucken).
Ist es möglich, die Bereichsinferenz umgekehrt funktionieren zu lassen, dh den in einer Unterkomponente angegebenen Bereich auf ein uneingeschränktes Signal in der übergeordneten Komponente anzuwenden und von dort an andere Komponenten weiterzugeben?
Weitere Details:
Meine Anwendung verfügt über eine Reihe von Datenquellen-Unterkomponenten, die Datenströme unterschiedlicher Breite erzeugen, eine Arbitrierungslogik zum Abtasten und Serialisieren dieser Quellen im Round-Robin-Modus sowie Parallel-> Seriell-Konverter, die die eigentliche Serialisierung und das Handshaking mit der Busarbitrierungslogik durchführen.
Im Moment habe ich die Signalbreiten als Konstanten in einem Paket angegeben, aber das bedeutet, dass ich jedes Mal, wenn sich ein Stream-Datenformat ändert, sowohl die Quell-Unterkomponente als auch das Paket ändern muss. Ich möchte wirklich, dass die Breite nur in der Quellkomponente angegeben wird, da sich die nachgelagerten Komponenten an jede Breite anpassen.
Verwenden Sie am besten Generika. Hier ist eine Beispiel-Entity-Deklaration für ein Schieberegister:
entity shift_register is
generic (n_bits :integer := 8);
port (clk :std_logic;
din :std_logic_vector (n_bits-1 downto 0);
dout :std_logic);
end entity shift_register;
Wenn Sie dieses Schieberegister instanziieren, gehen Sie folgendermaßen vor:
signal data :std_logic_vector (15 downto 0);
...
U0: shift_register
generic map (n_bits => data'length)
port map (clk, din, out);
In der Entität habe ich den Standardwert von n_bits auf 8 definiert. Wenn ich es instanziiere, hätte ich das generische Map-Zeug weglassen können und dann würde der Standardwert von n_bits verwendet werden.
EDIT: Um deine Frage besser zu beantworten. "Rückwärts" zu fahren funktioniert nicht so gut, und ich würde es wenn möglich vermeiden. Aber wenn es sein muss, dann können Sie immer einige Konstanten in Ihrem Paket deklarieren und sie weiter oben verwenden. Es ist nicht sehr sauber, aber es funktioniert.
Ben Voigt
Benutzer3624
Ben Voigt
parallel_out <= some_data & some_more_data & even_more_data;
. Das steuert wirklich, wie breit der Ausgangsport sein muss, wenn ichyet_more_data
zum Ausgang hinzufüge, muss der Array-Bereich zunehmen. Dann brauche ich eine Konstante in einer Paketdatei, damit alle Signale, die diese Daten weiterleiten, der Breite entsprechen, und die Notwendigkeit, diese synchron zu halten, versuche ich zu eliminieren.Benutzer3624
Ben Voigt
Benutzer3624
Ben Voigt
Ben Voigt