52 / 63 · Concepto
Barrel shifter y etapas de MUX
Implemente desplazamientos variables con etapas de 1,2,4,8 posiciones y controle dirección, signo y cantidades fuera de rango.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Requisitos previos: MUXMultiplexor Circuito combinacional que conecta una de varias entradas a la salida según una señal de selección. Debe especificarse la correspondencia entre los bits de selección y los números de entrada. Más información, desplazamientos lógicos y aritméticos y retardo de propagaciónRetardo de propagación Tiempo desde un cambio de entrada hasta que la salida se estabiliza en el valor correcto. La equivalencia lógica y el comportamiento temporal son propiedades distintas. Más información combinacional.
Un desplazamiento variable selecciona un cableado fijo
Un registroRegistro Circuito que almacena varios bits de estado. Los registros síncronos de este curso capturan la entrada especificada en el flanco de reloj. Más información que desplaza un bit cada vez usa tantos relojes como movimientos. Un barrel shifter recibe la cantidad y produce el resultado en un camino combinacional. No mueve físicamente el bit repetidas veces en el tiempo: selecciona conexiones desde las posiciones de entrada requeridas.
Para 16 bits y cantidades 0–15, . Coloque en serie cuatro etapas de 1,2,4,8 posiciones; cada una elige por MUX entre paso directo y desplazamiento fijo.
11=1011 selecciona 1,2,8 y omite 4. Desplazar lógicamente a la derecha 0xD2A5 produce 0x6952,0x1A54,0x1A54,0x001A entre etapas. Son cuatro etapas combinacionales, no cuatro relojes.
Hay cuatro grupos de 16 selecciones 2:1 de un bit: 64 puntos antes de optimizar cableado y constantes. Para , la estructura escala como y la profundidad como . Incluso MUX W:1 dibujados por salida pueden convertirse en árboles al sintetizar. Las líneas de RTL no determinan área ni frecuencia.
La figura muestra cómo 1011 controla las cuatro etapas para desplazar 0xD2A5 once posiciones; no representa cuatro ciclos.
- Etapa de 1 · s0=1: D2A5 → 6952
- Etapa de 2 · s1=1: 6952 → 1A54
- Etapa de 4 · s2=0: 1A54 pasa sin cambios
- Etapa de 8 · s3=1: 1A54 → 001A
Use el desplazador derecho también hacia la izquierda
Invertir el orden de bits, desplazar lógicamente a la derecha s posiciones e invertirlo otra vez equivale a desplazar a la izquierda. Permite compartir las cuatro etapas, pero añade MUX de dirección en entrada y salida: el coste total supera 64. Una inversión fija del orden de bits es solo cableado.
El desplazamiento aritmético a la derecha rellena las posiciones superiores con el signo de la entrada original. A la izquierda se rellena con 0 incluso en modo aritmético. En complemento a dosComplemento a dos Representación de enteros con signo mediante secuencias de bits de ancho fijo. El rango de n bits va de −2^(n−1) a 2^(n−1)−1. Más información, los desplazamientos lógico y aritmético a la izquierda mueven los mismos bits y no detectan automáticamente overflow signed.
La cantidad también forma parte del contrato. El ejemplo acepta shamt de cinco bits, 0–31. Para cantidades de 16 o más, los desplazamientos lógicos y los desplazamientos a la izquierda producen 0; el desplazamiento aritmético a la derecha produce 16 copias del signo. Usar solo cuatro bits bajos confundiría 16 con 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 de generate es una constante de elaboración, no un bucle ejecutado cuatro veces en tiempo real. Los rangos y repeticiones fijos crean cuatro cableados y sus MUX. fill permanece igual en todas las etapas, conservando la extensión de signo al combinar movimientos.
El RTL explicita el relleno y permite aritmética sobre un vector unsignedunsigned Interpretación de una secuencia de bits como entero no negativo. Con n bits, el rango es de 0 a 2^n−1; puede diferir de la interpretación signed de los mismos bits. Más información. Al usar operadores, el desplazamiento aritmético a la derecha necesita un operando signed y >>>. Ni el símbolo solo ni declarar signed la variable original de una selección parcial bastan: concatenaciones y selecciones pueden perder el signo. Convierta primero al valor signed del ancho deseado. Consulte operadores admitidos en la documentación de expresiones Verilog de AMD.
Separe retardo y pérdida de información
A las cuatro etapas se suman dirección, selección de rango y cableado. Si falta margen temporal, inserte registros, retrasando también cantidad restante y dirección. Cambiará la latenciaLatencia Tiempo o número de ciclos entre la aceptación de una entrada y la aparición de su salida correspondiente. Se distingue de la tasa de procesamiento, que mide cantidad por unidad de tiempo. Más información y ya no será la misma interfaz combinacional.
Los bits descartados no se recuperan. En un desplazamiento unsigned a la izquierda, cualquier 1 descartado de las posiciones superiores indica exceso de rango; para signed también importan signo original y bits descartados. Este módulo no produce esos indicadores. El desplazamiento aritmético a la derecha de valores negativos redondea hacia menos infinito: desplazado una posición da , distinto de la división hacia cero, .
Inténtalo tú
Para x=0x8123 de 16 bits, calcule (1) derecha lógica 3, (2) derecha aritmética 3, (3) izquierda lógica 16 y (4) derecha aritmética 20. Explique las etapas de (2) y el fallo en (3) si se omite shamt[4].
Leer la explicación
(1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF. Como 3=1+2, se eligen esas etapas. El desplazamiento aritmético pasa por 0xC091→0xF024, rellenando con unos por el signo original. 16 es shamt=10000: usar solo los cuatro bits bajos dejaría pasar 0x8123 sin moverlo. Deben detectarse aparte 16 o más. A la izquierda, incluso en modo aritmético, se rellenan ceros abajo.