Altifigence Academy

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.

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, s=s0+2s1+4s2+8s3s=s_0+2s_1+4s_2+8s_3. Placez donc quatre étages en série décalant de 1,2,4,8. Chaque MUX choisit entre passage direct et déplacement fixe.

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 sélectionne 1,2,8 et contourne 4. Pour X=0xD2A5X=0xD2A5 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 W=2KW=2^K, la sélection croît comme Wlog⁡2WW\log_2W et la profondeur comme log⁡2W\log_2W. 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.

Décomposer un décalage de 11 en 1+2+8
  1. Étage de 1 bit · s0=1: D2A5 → 6952
  2. Étage de 2 bits · s1=1: 6952 → 1A54
  3. Étage de 4 bits · s2=0: 1A54 passe sans changement
  4. É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.

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

k 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 x/2sx/2^s 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.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.