Altifigence Academy

52 / 63 · Konzept

Barrel-Shifter und stufenweise MUX

Variable Weiten durch 1/2/4/8-MUX-Stufen, gemeinsame Richtungslogik, Vorzeichenfüllung und Überweiten behandeln.

Voraussetzungen: MUXMultiplexer Kombinatorische Schaltung, die gemäß Auswahlsignal einen Eingang zum Ausgang verbindet. Die Zuordnung von Auswahlbits und Eingangsnummern muss festgelegt sein. Mehr erfahren, logisches/arithmetisches Schieben und kombinatorische LaufzeitLaufzeit Zeit nach einer Eingangsänderung, bis der Ausgang auf dem richtigen Wert stabil ist. Logische Äquivalenz und zeitliche Eigenschaften sind getrennte Aussagen. Mehr erfahren.

Variables Schieben als Auswahl fester Verbindungen

Ein SchieberegisterRegister Speichert einen Zustand aus mehreren Bits. Die synchronen Register dieses Kurses übernehmen festgelegte Eingaben an Taktflanken. Mehr erfahren, das je Takt ein Bit schiebt, benötigt so viele Takte wie Verschiebungen. Ein Barrel-Shifter erhält die Schiebeweite als Eingang und erzeugt das Ergebnis in einem kombinatorischen Pfad. Bits bewegen sich nicht wiederholt über die Zeit; ausgewählt wird eine Verbindung vom gewünschten Eingangsbit zum Ausgang.

Für 16 Bit und Weiten 0–15 gilt s=s0+2s1+4s2+8s3s=s_0+2s_1+4s_2+8s_3. Daher folgen vier Stufen für 1,2,4,8 Stellen. Jede wählt per MUX zwischen Durchreichen und fester Verschiebung.

X0=X,Xk+1={shift⁡(Xk,2k),sk=1Xk,sk=0X_0=X,\qquad X_{k+1}= \begin{cases} \operatorname{shift}(X_k,2^k),&s_k=1\\ X_k,&s_k=0 \end{cases}

11=1011 aktiviert die Stufen 1,2,8 und umgeht 4. Logisches Rechtsschieben von X=0xD2A5X=0xD2A5 ergibt nacheinander 0x6952,0x1A54,0x1A54,0x001A. Dies sind vier kombinatorische Zwischenwerte, keine vier Taktwerte.

Vier Gruppen mit je 16 MUX ergeben 64 einzelne 1-Bit-2:1-Auswahlstellen vor Verdrahtungs- und Konstantenoptimierung. Für W=2KW=2^K wächst die Struktur wie Wlog⁡2WW\log_2W, die Tiefe wie log⁡2W\log_2W. Auch separat gezeichnete W:1-MUX können nach Synthese Bäume bilden. RTL-Zeilenzahl beweist weder Fläche noch Frequenz.

Das Diagramm schiebt 0xD2A5 logisch elf Stellen nach rechts. Die Bits von 1011 wählen vier kombinatorische Stufen; es zeigt keine Ausführung über vier Takte.

Eine Verschiebung um 11 in 1+2+8 zerlegen
  1. Stufe um 1 · s0=1: D2A5 → 6952
  2. Stufe um 2 · s1=1: 6952 → 1A54
  3. Stufe um 4 · s2=0: 1A54 unverändert durchlassen
  4. Stufe um 8 · s3=1: 1A54 → 001A

Linksschieben mit derselben Rechtsstruktur

Bitumkehr vor und nach logischem Rechtsschieben ergibt logisches Linksschieben. So lassen sich vier Stufen teilen. Zusätzliche Richtungs-MUX an Ein- und Ausgang erhöhen jedoch die Gesamtkosten über 64 hinaus. Eine feste Bitumkehr ohne Richtungswahl ist nur Verdrahtung.

Arithmetisches Rechtsschieben füllt obere freie Bits mit dem Vorzeichenbit des ursprünglichen Eingangs. Linksschieben füllt auch im arithmetischen Modus mit 0. Im ZweierkomplementZweierkomplement Darstellung vorzeichenbehafteter Ganzzahlen mit fester Bitbreite. n Bit reichen von −2^(n−1) bis 2^(n−1)−1. Mehr erfahren haben arithmetisches und logisches Linksschieben dieselbe Bitbewegung und prüfen keinen signed-Overflow automatisch.

Auch der Schiebeweitenbereich ist ein Vertrag. Das Beispiel akzeptiert fünf shamt-Bits für 0–31. Ab 16 liefern logisches Rechtsschieben und Linksschieben 0, arithmetisches Rechtsschieben 16 Kopien des Vorzeichens. Nur die unteren vier shamt-Bits würden 16 fälschlich als 0 lesen; eine Zusatzprüfung ist nötig.

SystemVerilog
module barrel16 (
  input  wire [15:0] x,
  input  wire [4:0] shamt,
  input  wire left,
  input  wire arithmetic,
  output wire [15:0] y
);
  wire fill;
  wire [15:0] stage [0:4];
  assign fill = (!left) && arithmetic && x[15];

  for (genvar i = 0; i < 16; i++) begin : direction
    assign stage[0][i] = left ? x[15-i] : x[i];
    assign y[i] = shamt[4] ? fill :
                  (left ? stage[4][15-i] : stage[4][i]);
  end

  for (genvar k = 0; k < 4; k++) begin : shift_stage
    localparam int D = 1 << k;
    assign stage[k+1] = shamt[k]
      ? {{D{fill}}, stage[k][15:D]}
      : stage[k];
  end
endmodule

generate-k ist eine beim Aufbau feste Konstante, keine vierfach ausgeführte Laufzeitschleife. Feste Part-selects und Wiederholungsbreiten ergeben vier feste Verdrahtungen mit MUX. fill bleibt über alle Stufen gleich und erhält das Vorzeichen auch bei mehreren aktiven Stufen.

Explizites Auffüllen erlaubt hier arithmetisches Schieben auf unsigned-VektorenUnsigned Interpretation einer Bitfolge als nichtnegative Ganzzahl. Der n-Bit-Bereich ist 0 bis 2^n−1 und kann sich von der signed-Interpretation derselben Bits unterscheiden. Mehr erfahren. Als Operatorform braucht Rechtsarithmetik signed-Operanden und >>>. Nur >>> hinzuschreiben oder die Ursprungsvariable eines Part-selects signed zu deklarieren genügt nicht: Konkatenation und Teilauswahl können signed verlieren. Wandeln Sie zuerst in einen signed-Wert der gewünschten Breite um. Unterstützte Operatoren dokumentiert AMD zu Verilog-Ausdrücken.

Verzögerung und Informationsverlust getrennt behandeln

Zu vier Logikstufen kommen Richtungs-/Bereichsauswahl und Verdrahtung. Bei Timing-Problemen können Zwischenregister helfen, dann müssen aber verbleibende Schiebeweite und Richtung zusammen mit den Daten verzögert werden. Die AusgangslatenzLatenz Zeit oder Zyklenzahl von der Eingabeannahme bis zur zugehörigen Ausgabe. Unterschiedlich vom Durchsatz pro Zeiteinheit. Mehr erfahren ändert sich; es ist nicht mehr dieselbe kombinatorische Schnittstelle.

Verworfene Bits sind nicht wiederherstellbar. Beim unsigned-Linksschieben bedeutet eine verworfene obere 1 Bereichsüberschreitung. Bei signed-Werten müssen auch das ursprüngliche Vorzeichen und die verworfenen Bits berücksichtigt werden. Dieses Modul liefert keine solchen Flags. Arithmetisches Rechtsschieben negativer Werte rundet die Division durch 2s2^s nach unten: −3 um eine Stelle ergibt −2, anders als die gegen null gerundete Ganzzahldivision mit −1.

Selbst ausprobieren

Für x=0x8123 (16 Bit): (1) logisch rechts 3, (2) arithmetisch rechts 3, (3) logisch links 16, (4) arithmetisch rechts 20. Welche Stufen wählt (2), und was geschieht in (3) ohne shamt[4]-Behandlung?

Erklärung lesen

(1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF. 3=1+2 wählt die ersten beiden Stufen; arithmetisch 0xC091→0xF024 mit Auffüllen von 1 wegen des ursprünglichen Vorzeichens. 16=10000 würde bei nur vier unteren Bits alle Stufen umgehen und 0x8123 liefern. Deshalb sind Weiten ab 16 getrennt zu prüfen. Links werden auch im arithmetischen Modus Nullen eingefügt.

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.