52 / 63 · Concept
Barrel shifter et étages de MUX
Réaliser le décalage variable par MUX de 1,2,4,8 positions, partager les directions et traiter signe et déplacements hors largeur.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Prérequis : MUXMultiplexeur Circuit combinatoire reliant une entrée parmi plusieurs à la sortie selon une sélection. La correspondance entre bits de sélection et numéro d'entrée doit être spécifiée. En savoir plus, décalages logique/arithmétique et retard combinatoireRetard de propagation Temps nécessaire après un changement d'entrée pour que la sortie se stabilise à sa valeur correcte. Équivalence logique et caractéristiques temporelles sont distinctes. En savoir plus.
Transformer le décalage variable en sélection de câblage fixe
Un registreRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus décalant d'un bit utilise autant de cycles que de déplacements. Un barrel shifter reçoit une quantité de décalage et produit le résultat dans un chemin combinatoire. Les bits ne se déplacent pas plusieurs fois dans le temps : un chemin câblé relie chaque sortie à l'entrée voulue.
Pour seize bits et un déplacement de 0–15, . Placez donc quatre étages en série décalant de 1,2,4,8. Chaque MUX choisit entre passage direct et déplacement fixe.
11=1011 sélectionne 1,2,8 et contourne 4. Pour décalé logiquement à droite, les valeurs successives sont 0x6952,0x1A54,0x1A54,0x001A. Elles appartiennent à quatre étages combinatoires, pas à quatre horloges.
Quatre groupes de seize MUX représentent 64 sélections 2:1 d'un bit avant optimisation des fils et constantes. En général, pour , la sélection croît comme et la profondeur comme . Même des MUX W:1 dessinés séparément peuvent être synthétisés en arbres ; le nombre de lignes RTL ne prédit ni aire ni fréquence.
Le schéma détaille les quatre étages commandés par 1011 pour décaler 0xD2A5 à droite de onze positions. Ce ne sont pas quatre cycles d'exécution.
- Étage de 1 bit · s0=1: D2A5 → 6952
- Étage de 2 bits · s1=1: 6952 → 1A54
- Étage de 4 bits · s2=0: 1A54 passe sans changement
- Étage de 8 bits · s3=1: 1A54 → 001A
Réutiliser le décalage à droite pour décaler à gauche
Inverser l'ordre des bits, décaler logiquement à droite de s, puis inverser à nouveau réalise un décalage gauche. Les quatre étages peuvent être partagés, mais les MUX de direction en entrée et sortie ajoutent un coût au-delà de 64. Une inversion fixe de l'ordre des bits est seulement du câblage.
En décalage arithmétique à droite, les positions hautes reçoivent le signe de l'entrée originale. À gauche, le remplissage reste nul, même en mode arithmétique. En complément à deuxComplément à deux Représentation d'un entier signé par un motif de largeur fixe. Sur n bits, la plage va de −2^(n−1) à 2^(n−1)−1. En savoir plus, les deux décalages gauches déplacent les mêmes bits et ne détectent pas automatiquement le dépassement signé.
La plage de déplacement fait partie du contrat. Ici, shamt a cinq bits, soit 0–31. À partir de 16, le résultat est nul en logique et vers la gauche ; en arithmétique à droite, il contient seize copies du signe. Utiliser seulement les quatre bits bas confondrait un déplacement de 16 avec 0.
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
endmodulek dans generate est une constante d'élaboration, pas une boucle exécutée quatre fois à l'exécution. Tranches et répétitions ont des longueurs fixes : quatre câblages fixes et leurs MUX. fill reste identique à chaque étage, préservant le même signe à travers plusieurs sélections.
Le RTL explicite le remplissage et réalise ainsi le décalage arithmétique même sur des vecteurs non signésNon signé Interprétation d'un motif de bits comme entier non négatif. Sur n bits, la plage va de 0 à 2^n−1 et peut différer de l'interprétation signée du même motif. En savoir plus. Avec un opérateur, il faut >>> et un opérande signé. Le symbole seul ou la déclaration signed de la variable avant une sélection partielle ne suffit pas : concaténations et tranches peuvent perdre cette interprétation. Convertissez d'abord à la largeur signée voulue. Les opérateurs pris en charge sont décrits dans la documentation AMD des expressions Verilog.
Séparer retard et perte d'information
Aux quatre étages s'ajoutent sélection de direction/plage et fils. Si le timing exige des registres intermédiaires, retardez aussi quantité restante et direction du même nombre de cycles. La latenceLatence Temps ou nombre de cycles entre l'acceptation d'une entrée et la sortie correspondante. Elle diffère du débit, quantité traitée par unité de temps. En savoir plus et l'interface deviennent alors différentes d'un module purement combinatoire.
Le décalage ne récupère pas les bits supprimés. En décalage gauche non signé, un bit haut éjecté à 1 indique un dépassement ; en signé, il faut considérer signe initial et bits supprimés. Ce module ne fournit pas ces indicateurs. Le décalage arithmétique droit arrondit vers le bas : −3 décalé d'un bit donne −2, différent du −1 de la division entière vers zéro.
Essayez vous-même
Pour x=0x8123 sur seize bits, calculez (1) droite logique de 3, (2) droite arithmétique de 3, (3) gauche logique de 16, (4) droite arithmétique de 20. Indiquez les étages du cas 2 et l'erreur du cas 3 sans shamt[4].
Lire l’explication
(1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF. Comme 3=1+2, les étages 1 et 2 sont choisis. En arithmétique, 0xC091→0xF024, avec remplissage par le signe initial 1. Pour 16, shamt=10000 : ignorer le bit haut contournerait tous les étages et rendrait 0x8123 inchangé. Il faut donc détecter ≥16. À gauche, les bits bas ajoutés restent 0 même en mode arithmétique.