Altifigence Academy

11 / 37 · Conceito

Codificadores e prioridade: escolha uma entre várias solicitações

Distinga a hipótese one-hot do codificador dos resultados valid e seleção de um codificador de prioridade.

O sentido inverso do decodificador também precisa de condições

Um decodificadorDecodificador Circuito que ativa a linha de saída correspondente a um código binário. Com enable, pode colocar todas as saídas em 0 quando está desabilitado. Saiba mais converte um endereço em seleção one-hotOne-hot Representação na qual exatamente um bit vale 1. Se todos em 0 também forem permitidos, a condição é chamada one-hot-or-zero. Saiba mais; um codificador converte a posição ativa em endereço. Um codificador one-hot simples pressupõe uma única entrada ativa. Com várias entradas em 1, é necessário especificar qual será informada.

Para r3r2r1r0r_3r_2r_1r_0, demos prioridade ao maior número. Com todas as entradas em 0, definimos valid=0 e index=00. Usar apenas index=00 para detectar ausência de solicitação confundiria esse caso com r0.

Entrada r3r2r1r0validindex
1---111
01--110
001-101
0001100
0000000

O traço significa o mesmo resultado tanto com 0 quanto com 1, não permissão para aplicar X de simulação. Os padrões definidos de cima para baixo são mutuamente exclusivos.

valid=r3+r2+r1+r0,index1=r3+r2,index0=r3+r2‾r1valid=r_3+r_2+r_1+r_0,\quad index_1=r_3+r_2,\quad index_0=r_3+\overline{r_2}r_1

Com 1011, index=11. Com 0110, r2 tem prioridade sobre r1 e produz index=10.

Cada coluna é uma combinação independente de solicitações
Ver os dados da forma de onda
Dados da forma de onda: cada caractere é um intervalo; um ponto mantém o estado anterior; p representa um ciclo de clock.
SinalForma de ondaValores do barramento
solicitações2345230000 → 0001 → 0011 → 0110 → 1011 → 1000
valid01....
index2.345.00 → 01 → 10 → 11

O RTL deve mostrar a prioridade

SystemVerilog
always_comb begin
  valid = |request;
  index = 2'b00;
  if      (request[3]) index = 2'd3;
  else if (request[2]) index = 2'd2;
  else if (request[1]) index = 2'd1;
end

Se somente request[0] valer 1, permanece o index=0 padrão e valid=1. Valores padrão cobrem todos os caminhos e evitam memória no circuito combinacional. Teste as 16 entradas; com valid=1, confira que o bit escolhido está ativo e todos os superiores estão em 0.

Seleção e justiça são problemas diferentes

Se r3 permanecer em 1, r0 nunca será escolhida. Este circuito implementa prioridade fixa. Uma arbitragem justa precisa lembrar escolhas anteriores, tornando-se sequencial.

Prática · Observe solicitações, endereço e grant

Escolha uma única solicitação entre várias simultâneas

r3r2r1r0=1011; valid=1; index=11; grant=1000. Solicitações de número maior têm prioridade. Quando valid=0, index não identifica nenhuma solicitação selecionada.

A solicitação inicial 1011 seleciona r3. Ao desligar r3, r1 é escolhida: index=01, grant=0010. Enquanto r1 permanecer em 1, ligar ou desligar r0 não deve alterar o resultado.

Compare «Desligar tudo» com ativar somente r0. Ambos dão index=00, mas valid e grant diferem. Um circuito seguinte que leia apenas index pode atender uma solicitação inexistente.

grant, com 1 apenas na solicitação escolhida, resulta da decodificação de index e valid:

granti=valid∧(index=i)grant_i=valid\land(index=i)

Verifique três invariantes: no máximo um 1 em grant; uma solicitação real em toda posição concedida; e todos os números superiores ao escolhido em 0. Esta prática não consome solicitações nem lembra escolhas. A espera das inferiores enquanto r3 permanece ativa é uma característica da prioridade fixa.

Experimente

Indique index, valid e grant para 0101 e 0001. Por que r0 não pode ser atendida em 0000 apenas porque index=00?

Ler a explicação

Para 0101: index=10, valid=1 e grant=0100. Para 0001: index=00, valid=1 e grant=0001. Em 0000, index=00 é apenas o valor padrão: valid=0 e grant=0000 indicam que não há solicitação.

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