Frage:
Ist es möglich, die Bereichsbeschränkung STD_LOGIC_VECTOR von unten nach oben anzuwenden?
Ben Voigt
2011-06-24 23:35:17 UTC
view on stackexchange narkive permalink

Ich weiß, dass Entitäten uneingeschränkte Array-Typen (wie STD_LOGIC_VECTOR ) in ihrer Portliste verwenden können, deren Größe automatisch angepasst wird, um dem in der Portzuordnung verbundenen Signal zu entsprechen, wenn sie instanziiert werden (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, nämlich ein paralleler -> serieller Wandler (akzeptieren Sie Eingaben jeder Größe, breitere Eingänge erfordern mehr Taktzyklen zum Ausspucken).

Ist es möglich, die Bereichsinferenz in umgekehrter Reihenfolge durchzuführen, d. h Bereich, der in einer Unterkomponente angegeben, auf ein nicht eingeschränktes Signal in der übergeordneten Komponente angewendet und von dort an andere Komponenten weitergegeben wird?

Weitere Details:

Meine Anwendung hat eine Nummer von Datenquellen-Unterkomponenten, die Datenströme unterschiedlicher Breite erzeugen, Arbitrierungslogik zum Abtasten und Serialisieren dieser Quellen im Round-Robin-Verfahren und Parallel-> Seriell-Konverter, die die eigentliche Serialisierung und Handshake mit der Bus-Arbitrierungslogik durchführen.

Im Moment Ich habe die Signalbreiten als Konstanten in einem Paket angegeben, aber dies bedeutet, dass ich jedes Mal, wenn sich ein Stream-Datenformat ändert, beide Quellen su ändern muss bKomponente und das Paket. Ich möchte wirklich, dass die Breite nur in der Quellkomponente angegeben wird, da sich die nachgeschalteten Komponenten an jede Breite anpassen.

Einer antworten:
user3624
2011-06-24 23:49:03 UTC
view on stackexchange narkive permalink

Am besten verwenden Sie Generika. Hier ist ein Beispiel für eine Entitätsdeklaration für ein Schieberegister:

  Entitätsverschiebungsregister ist generisch (n_bits: integer: = 8); port (clk: std_logic; din: std_logic_vector (n_bits-1 nach unten auf 0); dout: std_logic); end entity shift_register;  

Wenn Sie dieses Schieberegister instanziieren, würden Sie es so machen :

  Signaldaten: std_logic_vector (15 nach unten auf 0); ... U0: Shift_Register generische Map (n_bits = > Datenlänge) Port Map (clk, din, out);  

In der Entität habe ich den Standardwert von n_bits auf 8 definiert. Wenn ich ihn instanziiere, hätte ich das generische Kartenmaterial weglassen können, und dann würde der Standardwert von n_bits verwendet.

BEARBEITEN: Um Ihre Frage besser zu beantworten. "Rückwärts" zu gehen funktioniert nicht wirklich gut und ich würde es vermeiden, wenn es möglich ist. Wenn Sie müssen, können Sie immer einige Konstanten in Ihrem Paket deklarieren und weiter oben verwenden. Es ist nicht sehr sauber, aber es funktioniert.

Genau das habe ich jetzt eigentlich. Und ich muss mehrere Dateien bearbeiten, wenn sich die Datenbreite ändert. Ich denke, daran führt kein Weg vorbei. Möglicherweise kann ich Dinge neu organisieren und die Instanziierung der parallelen> seriellen Unterkomponente innerhalb der Komponente verschieben, die die Breite kennt. Dann kann ich einfach eine serielle Schnittstelle mit fester Breite an die oberste Ebene übergeben.
@Ben Voigt Wenn Sie es richtig gemacht haben, sollten Sie nicht mehrere Dateien bearbeiten müssen, wenn sich die Datenbreite ändert. Meine Regel für alles lautet: Wenn Sie die Informationen mehr als einmal eingeben müssen, werden Sie sie mehr als einmal falsch eingeben. Ich habe viele FPGAs gemacht, bei denen ich nur einmal eine Information eingegeben habe und der Rest des Codes es nur herausfindet.
@David: Ich habe eine Komponente, die die Daten bereitstellt, so etwas wie "parallel_out <= some_data & some_more_data & even_more_data;". Das steuert wirklich, wie breit der Ausgabeport sein muss. Wenn ich der Ausgabe `Yet_more_data` hinzufüge, muss der Array-Bereich vergrößert werden. Dann brauche ich eine Konstante in einer Paketdatei, damit alle Signale, die diese Daten weiterleiten, mit der Breite übereinstimmen, und die Notwendigkeit, diese synchron zu halten, versuche ich zu beseitigen.
@Ben Mit den Generika und Konstanten können Sie rechnen. Setzen Sie diese Mathematik einfach in die Berechnung Ihrer SLV-Größen ein. So etwas wie "signal parallel_out: slv (some_data_bits + some_more_data_bits + even_more_bits-1 nach unten auf 0)". Denken Sie daran: Geben Sie die Informationen einmal ein und berechnen Sie alles andere.
@David: Also brauche ich jetzt drei Konstanten anstelle von einer? Das ist keine Verbesserung. Und es gibt keinen Grund für eine andere FPGA-Komponente als die Datenquelle, die Größe einzelner Felder zu kennen. (Natürlich muss der Mikrocontroller, der den seriellen Stream empfängt, Bescheid wissen, aber ich erwarte nicht, dass er diese Informationen zwischen C und VHDL teilen kann.)
@Ben Entweder du verstehst es nicht oder ich verstehe nicht, was du sagst. Und Sie können Dinge zwischen C und VHDL teilen, wenn Sie entschlossen genug sind. Ich mache. Ich habe sogar ein Programm geschrieben, das meine PCB-Netzliste liest und die VHDL- und UCF-Dateien an die PCB anpasst.
@David: Ein Datenstrom ist beispielsweise der Batteriestatus. Der I2C-Master fragt die Batterie ab, zieht die interessierenden Bits heraus und leitet sie an einen asynchronen Sender weiter, der Framing, CRC usw. verarbeitet, damit sie von einem uC-UART-Peripheriegerät empfangen werden können. Wenn mein Chef nach zusätzlichen paar Bits fragt, muss ich nur die Logik ändern, um die I2C-Transaktion zu verfolgen und die Bits des Ausgangsports zu speichern. Leider muss die übergeordnete Entität, die die Quellenseite (I2C) mit der Senkenseite (UART) verbindet, auch die Breite der parallelen Daten kennen.
Dies ist jedoch komplizierter, da eingehende Daten eine Prüfsumme haben (der Ausgabeport wird nur geändert, wenn die Prüfsumme übereinstimmt) und die ausgehenden Daten mit einer Reihe anderer Streams verschachtelt sind, die um denselben UART konkurrieren.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...