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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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, . 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.
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 , a estrutura escala como e a profundidade como . 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.
- Estágio de 1 · s0=1: D2A5 → 6952
- Estágio de 2 · s1=1: 6952 → 1A54
- Estágio de 4 · s2=0: 1A54 passa sem alteração
- 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.
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 é 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 para menos infinito: deslocado uma posição dá , diferente da divisão em direção a zero, .
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.