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.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
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, . Si concatenano quattro stadi da 1,2,4,8 posizioni, ciascuno con MUX fra passaggio diretto e scorrimento fisso.
11=1011 attiva 1,2,8 e salta 4. Scorrendo logicamente a destra 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 , la struttura cresce come e la profondità come . 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.
- Stadio di 1 · s0=1: D2A5 → 6952
- Stadio di 2 · s1=1: 6952 → 1A54
- Stadio di 4 · s2=0: Far passare 1A54 invariato
- 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.
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
endmoduleIl 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 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.