52 / 63 · Konzept
Barrel-Shifter und stufenweise MUX
Variable Weiten durch 1/2/4/8-MUX-Stufen, gemeinsame Richtungslogik, Vorzeichenfüllung und Überweiten behandeln.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
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 . Daher folgen vier Stufen für 1,2,4,8 Stellen. Jede wählt per MUX zwischen Durchreichen und fester Verschiebung.
11=1011 aktiviert die Stufen 1,2,8 und umgeht 4. Logisches Rechtsschieben von 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ächst die Struktur wie , die Tiefe wie . 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.
- Stufe um 1 · s0=1: D2A5 → 6952
- Stufe um 2 · s1=1: 6952 → 1A54
- Stufe um 4 · s2=0: 1A54 unverändert durchlassen
- 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.
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
endmodulegenerate-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 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.