Altifigence Academy

52 / 63 · Concetto

Barrel shifter e MUX a stadi

Realizzare shift variabili con stadi MUX 1/2/4/8, direzione condivisa, segno e distanze fuori campo.

Prerequisiti: MUXMultiplexer Circuito combinatorio che collega un ingresso all’uscita secondo la selezione. Va specificata la corrispondenza fra bit di selezione e ingressi. Approfondisci, shift logici/aritmetici e ritardo combinatorioRitardo di propagazione Tempo dalla variazione d’ingresso all’assestamento corretto dell’uscita. Equivalenza logica e proprietà temporali sono distinte. Approfondisci.

Trasformare lo shift variabile in selezione di collegamenti fissi

Un registroRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci che scorre un bit per clock impiega tanti clock quante posizioni. Un barrel shifter riceve la distanza e produce il risultato in un percorso combinatorio. I bit non si spostano ripetutamente nel tempo: si seleziona il collegamento fra la posizione d'ingresso desiderata e l'uscita.

Per 16 bit e distanze 0–15, s=s0+2s1+4s2+8s3s=s_0+2s_1+4s_2+8s_3. Si concatenano quattro stadi da 1,2,4,8 posizioni, ciascuno con MUX fra passaggio diretto e scorrimento fisso.

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 attiva 1,2,8 e salta 4. Scorrendo logicamente a destra X=0xD2A5X=0xD2A5 si ottengono 0x6952,0x1A54,0x1A54,0x001A. Sono quattro valori combinatori intermedi, non quattro clock.

Quattro gruppi di 16 MUX danno 64 selezioni 2:1 a un bit prima di ottimizzare costanti e collegamenti. Per W=2KW=2^K, la struttura cresce come Wlog⁡2WW\log_2W e la profondità come log⁡2W\log_2W. Anche MUX W:1 disegnati separatamente possono diventare alberi dopo sintesi: le righe RTL non determinano area o frequenza.

Il diagramma sposta 0xD2A5 logicamente di undici posizioni a destra. I bit di 1011 selezionano quattro stadi combinatori; non rappresenta quattro cicli d'esecuzione.

Scomporre lo scorrimento di 11 in 1+2+8
  1. Stadio di 1 · s0=1: D2A5 → 6952
  2. Stadio di 2 · s1=1: 6952 → 1A54
  3. Stadio di 4 · s2=0: Far passare 1A54 invariato
  4. Stadio di 8 · s3=1: 1A54 → 001A

Usare la struttura destra anche per la sinistra

Invertire l'ordine dei bit, scorrere logicamente a destra e invertirlo ancora realizza lo shift sinistro. Si condividono così quattro stadi, ma i MUX di direzione aggiunti a ingresso e uscita portano il costo oltre 64. Un'inversione fissa senza selezione è semplice cablaggio.

Lo shift aritmetico destro riempie i bit superiori con il segno dell'ingresso originale. A sinistra si riempie di 0 anche in modalità aritmetica. Nel complemento a dueComplemento a due Rappresentazione di interi con segno a larghezza fissa. Con n bit il campo è da −2^(n−1) a 2^(n−1)−1. Approfondisci, shift sinistro logico e aritmetico muovono gli stessi bit senza controllare automaticamente l'overflow signed.

Anche il campo della distanza è un contratto. L'esempio accetta shamt a cinque bit, 0–31. Da 16 in su, shift logici e sinistri danno 0; l'aritmetico destro replica il segno sedici volte. Usare solo quattro bit bassi scambierebbe 16 per 0: serve una verifica separata.

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

Il k di generate è una costante di costruzione, non un ciclo eseguito quattro volte a runtime. Part-select e ripetizioni fissi formano quattro cablaggi con MUX. fill resta uguale fra gli stadi e conserva il segno anche selezionandone più d'uno.

Il riempimento esplicito consente qui shift aritmetico su vettori unsignedUnsigned Interpretazione dei bit come intero non negativo. Il campo a n bit è 0–2^n−1 e può differire dalla lettura signed degli stessi bit. Approfondisci. La versione con operatori richiede un operando signed e >>>. Il solo simbolo o una variabile originale signed dietro un part-select non bastano: concatenazioni e selezioni possono perdere il segno. Convertite prima al valore signed della larghezza desiderata. Gli operatori supportati sono nella documentazione AMD delle espressioni Verilog.

Separare ritardo e perdita d'informazione

Ai quattro stadi si aggiungono selezione di direzione/campo e collegamenti. Si possono inserire registri per il timing, ma distanza residua e direzione devono ritardare insieme ai dati. Cambia la latenzaLatenza Tempo o numero di cicli fra accettazione dell’ingresso e relativa uscita, diverso dal throughput per unità di tempo. Approfondisci e non è più la stessa interfaccia combinatoria.

I bit scartati non si recuperano. Nello shift sinistro unsigned, un qualsiasi 1 superiore espulso indica fuori campo. Nel caso signed occorre considerare anche il segno originale e i bit eliminati. Il modulo non genera questi flag. Lo shift aritmetico destro dei negativi arrotonda il risultato della divisione per 2s2^s verso il basso: −3 spostato di uno dà −2, diverso da −1 della divisione intera verso zero.

Prova tu

Per x=0x8123 a 16 bit: (1) destra logica 3, (2) destra aritmetica 3, (3) sinistra logica 16, (4) destra aritmetica 20. Quali stadi usa (2) e cosa accade in (3) senza gestire shamt[4]?

Leggi la spiegazione

(1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF. 3=1+2 sceglie i primi due stadi: 0xC091→0xF024, riempiendo con 1 dal segno originale. 16=10000, usando solo quattro bit bassi, salterebbe tutti gli stadi e darebbe 0x8123. Occorre quindi rilevare separatamente distanze almeno 16. A sinistra si inseriscono zeri anche in modalità aritmetica.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.