Was ist der Unterschied zwischen einem Array und einem Bus in Verilog?

Ich habe Verilog und Vivado in der Schule gelernt und bin jetzt sehr verwirrt über die Verwendung von Bussen und Arrays. Kann jemand folgendes klären?

  • Was ist der Unterschied zwischen einem Array und einem Bus?
    • Während der Deklaration würde ein Bus etwa so aussehen, reg [9:0]datawährend ein Array reg data[9:0]. Gibt es einen subtilen (oder nicht so subtilen) Unterschied darin, wie die Sprache diese Fälle handhabt?
    • Warum wird ein Bus mit und Index vor dem Variablennamen deklariert, aber mit einem Index dahinter referenziert? Zum Beispiel data[3]würde unabhängig davon funktionieren, ob dataes als Array oder Bus deklariert ist.
  • Ich habe festgestellt, dass es möglich (wenn auch verwirrend) ist, Deklarationen wie zu erstellen reg [4:0]busArray[3:0], die 4x 5-Bit-Register erstellen würden.
    • Ist das schlechte Praxis?
    • Wie unterscheidet sich das vom deklarierten 2D-Array reg arrayArray[4:0][3:0]?
  • Wann sollte ich einen Bus und wann ein Array verwenden?

Ich habe auch noch ein paar andere Fragen zum Thema...

  • Wenn Sie eine Deklaration wie haben reg [7:0]data[1023:0], ist es möglich, auf einzelne Bits und Bereiche zuzugreifen?
    • Ich hatte Probleme beim Zugriff auf Bitbereiche. Scheint beispielsweise data[7:0][4]zu funktionieren, führt aber zu einem Syntaxfehler. Gibt es Regeln für den Zugriff auf Elemente in Bussen und Arrays?data[0][255:0]data[3:1][512:64]
  • Ist es möglich, einen mehrdimensionalen Bus zu deklarieren? (etwas wie reg [15:0][8:0]data)
  • Gibt es eine Möglichkeit, ein Array so umzuwandeln, dass es wie ein Bus behandelt wird? Dies könnte nützlich sein, um ein Array in ein Modul zu leiten, das für die Annahme eines Busses ausgelegt ist.

Antworten (1)

Mit einem Bus können Sie Werte definieren, die breiter als ein Bit sind. Wenn Sie einen Wert zwischen 0 und 15 speichern oder (parallel) übertragen möchten, benötigen Sie einen 4-Bit-Bus. Mit einem Array können Sie mehrere Werte unter einem einzigen Namen speichern.

Der Unterschied zwischen „[7:0] data“ und „data[7:0]“ besteht darin, dass der erste ein einzelner 8-Bit-breiter Wert ist, während der zweite aus acht Einzel-Bit-Werten besteht.

Es ist völlig normal und nützlich, ein Array von Bussen zu erstellen. Sie werden manchmal als Speicher bezeichnet, weil Sie sie verwenden können, um ROM oder RAM zu modellieren. Ihre Synthesesoftware kann normalerweise erkennen, wenn Sie etwas definiert haben, das wie ROM oder RAM aussieht (z. B. reg [7:0] data[1023:0] ist im Grunde genommen 1 KB mal 8-Bit-RAM) und es als tatsächliches physisches ROM synthetisieren oder RAM auf dem Chip.

Um zu verstehen, welches Konstrukt zu verwenden ist, fragen Sie sich einfach, was Sie haben. Haben Sie einen einzelnen Multi-Bit-Wert? Das ist ein Bus. Haben Sie eine Reihe von Einzelbitwerten, auf die Sie mit einem einzigen Namen verweisen möchten? Verwenden Sie dann ein Array. Haben Sie eine Reihe von Multi-Bit-Werten? Dann verwenden Sie eine Erinnerung.

Können Sie einige der zusätzlichen (verwandten) Fragen beantworten, die ich hinzugefügt habe? Ich habe vergessen, sie einzufügen, als ich die Frage ursprünglich erstellt habe.