Altifigence Academy

52 / 63 · Conceito

Barrel shifter e estágios de MUX

Implemente deslocamentos variáveis com estágios de 1,2,4,8 posições e controle direção, sinal e quantidades fora do intervalo.

Pré-requisitos: MUXMultiplexador Circuito combinacional que conecta uma dentre várias entradas à saída conforme um sinal de seleção. É preciso especificar a correspondência entre os bits de seleção e os números das entradas. Saiba mais, deslocamentos lógicos e aritméticos e atraso de propagaçãoAtraso de propagação Tempo entre uma mudança de entrada e a estabilização da saída no valor correto. Equivalência lógica e comportamento temporal são propriedades distintas. Saiba mais combinacional.

Do deslocamento variável à escolha de fiação fixa

Um registradorRegistrador Circuito que armazena vários bits de estado. Os registradores síncronos deste curso capturam a entrada especificada na borda de clock. Saiba mais que desloca um bit por vez usa tantos clocks quanto movimentos. Um barrel shifter recebe a quantidade e produz o resultado num caminho combinacional. Não move fisicamente o bit várias vezes no tempo: seleciona conexões a partir das posições de entrada necessárias.

Para 16 bits e quantidades 0–15, s=s0+2s1+4s2+8s3s=s_0+2s_1+4s_2+8s_3. Coloque em série quatro estágios de 1,2,4,8 posições; cada um escolhe por MUX entre passagem direta e deslocamento fixo.

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 seleciona 1,2,8 e ignora 4. Deslocar logicamente à direita 0xD2A5 produz 0x6952,0x1A54,0x1A54,0x001A entre estágios. São quatro estágios combinacionais, não quatro clocks.

Há quatro grupos de 16 seleções 2:1 de um bit: 64 pontos antes de otimizar fiação e constantes. Para W=2KW=2^K, a estrutura escala como Wlog⁡2WW\log_2W e a profundidade como log⁡2W\log_2W. Mesmo MUX W:1 desenhados para cada saída podem virar árvores na síntese. Linhas de RTL não determinam área nem frequência.

A figura mostra como 1011 controla os quatro estágios para deslocar 0xD2A5 onze posições; não representa quatro ciclos.

Decomponha o deslocamento de 11 em 1+2+8
  1. Estágio de 1 · s0=1: D2A5 → 6952
  2. Estágio de 2 · s1=1: 6952 → 1A54
  3. Estágio de 4 · s2=0: 1A54 passa sem alteração
  4. Estágio de 8 · s3=1: 1A54 → 001A

Use o deslocador direito também para a esquerda

Inverter a ordem dos bits, deslocar logicamente à direita s posições e inverter novamente equivale a deslocar à esquerda. Isso permite compartilhar os quatro estágios, mas acrescenta MUX de direção na entrada e na saída: o custo total supera 64. Uma inversão fixa da ordem dos bits é apenas fiação.

O deslocamento aritmético à direita preenche os bits superiores com o sinal da entrada original. À esquerda, preenche-se com 0 mesmo no modo aritmético. Em complemento de doisComplemento de dois Representação de inteiros com sinal por sequências de bits de largura fixa. O intervalo de n bits vai de −2^(n−1) a 2^(n−1)−1. Saiba mais, esquerda lógica e aritmética movem os mesmos bits e não detectam automaticamente overflow signed.

A quantidade também faz parte do contrato. O exemplo aceita shamt de cinco bits, 0–31. A partir de 16, operações lógicas e à esquerda produzem 0; o deslocamento aritmético à direita produz 16 cópias do sinal. Usar apenas quatro bits baixos confundiria 16 com 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 de generate é uma constante de elaboração, não um laço executado quatro vezes em tempo real. Intervalos e repetições fixos criam quatro fiações e seus MUX. fill permanece igual em todos os estágios, preservando a extensão de sinal ao combinar movimentos.

O RTL explicita o preenchimento e permite aritmética sobre vetor unsignedunsigned Interpretação de uma sequência de bits como inteiro não negativo. Com n bits, o intervalo é de 0 a 2^n−1; pode diferir da interpretação signed dos mesmos bits. Saiba mais. Com operadores, o deslocamento aritmético à direita exige operando signed e >>>. Nem o símbolo sozinho nem declarar signed a variável original de uma seleção parcial bastam: concatenações e seleções podem perder o sinal. Converta primeiro para o valor signed da largura desejada. Consulte os operadores suportados na documentação de expressões Verilog da AMD.

Separe atraso e perda de informação

Aos quatro estágios somam-se direção, seleção de intervalo e fiação. Se faltar margem temporal, insira registradores, atrasando também quantidade restante e direção. A latênciaLatência Tempo ou número de ciclos entre a aceitação de uma entrada e a apresentação da saída correspondente. Difere da taxa de processamento, que mede quantidade por unidade de tempo. Saiba mais mudará e já não será a mesma interface combinacional.

Bits descartados não são recuperados. No deslocamento unsigned à esquerda, qualquer 1 descartado das posições superiores indica excesso de intervalo; para signed, também importam sinal original e bits descartados. Este módulo não produz essas flags. O deslocamento aritmético à direita de valores negativos arredonda x/2sx/2^s para menos infinito: −3-3 deslocado uma posição dá −2-2, diferente da divisão em direção a zero, −1-1.

Experimente

Para x=0x8123 de 16 bits, calcule (1) direita lógica 3, (2) direita aritmética 3, (3) esquerda lógica 16 e (4) direita aritmética 20. Explique os estágios de (2) e o erro em (3) se shamt[4] for omitido.

Ler a explicação

(1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF. Como 3=1+2, esses estágios são escolhidos. A aritmética passa por 0xC091→0xF024, preenchendo uns pelo sinal original. 16 é shamt=10000: usar apenas os quatro bits baixos deixaria 0x8123 passar sem deslocamento. É preciso detectar separadamente 16 ou mais. À esquerda, mesmo no modo aritmético, preenchem-se zeros embaixo.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.