André Castelan
"Em teoria não há diferença entre a pratica e a teoria, já na pratica..."

domingo, 28 de julho de 2013

VHDL: Lista de sensibilidade de um process

O process é um dos elementos básicos de qualquer descrição de hardware em VHDL, pode ser utilizado tanto para a representação de circuitos combinacionais como de circuitos sequenciais (com memória).

Sintaxe do process:
 process(lista_sensibilidade)  
 -- Declaração de variables  
 begin  
 -- Declaracao 1  
 -- Declaracao 2  
 end process;  



Um process é executado sempre que um dos sinais na sua lista de sensibilidade é atualizado, a lista de sensibilidade de um process com memória (registradores) deve possuir somente o clock em caso de circuitos com reset síncrono ou clock e o reset em caso de circuitos com reset assincrono, no primeiro caso tanto faz quando o reset mudar de valor pois ele só será amostrado na borda de subida do clock. (As vantagens e desvantagens de cada tipo de reset ficam para outro post)

Reset Assíncrono

Reset Síncrono
Não interessa colocar outros sinais na lista de sensibilidade pois os valores só serão atualizados com a chegada do clock ou do reset.

Já no caso de circuitos combinacionais é de extrema importância adicionar todas as entradas do process na lista de sensibilidade, uma lista de sensibilidade incompleta pode gerar uma inconsistência entre a simulação e a síntese já que a síntese observa o comportamento do circuito e gera o hardware a partir disto muitas vezes ignorando a lista de sensibilidade.

Por exemplo, no mux descrito abaixo caso o sinal "sel" seja omitido da lista de sensibilidade o process não será ativo na simulação quando o sel mudar de valor. O mux não funcionará corretamente no ambiente de simulação mas na síntese ele deve funcionar corretamente, problemas como estes são chatos de procurar por isto é muito importante observar a lista de warnings na sua ferramenta de síntese, a omissão de sinais na lista de sensibilidade normalmente é apontada pela ferramenta de CAD.

MUX 1:4 
PROCESS (sel, a, b, c, d)  
 BEGIN  
   CASE sel IS  
     WHEN "00" =>  
           op <= a;  
     WHEN "01" =>  
           op <= b;  
     WHEN "10" =>  
           op <= c;  
     WHEN "11" =>  
           op <= d;  
    END CASE;  
 END PROCESS;  

No VHDL-2008 surgiu uma opção nova que é o (all) na lista de sensibilidade com esta diretiva todos os sinais do lado direito das atribuições e sinais utilizados para comparação são inseridos automaticamente na lista de sensibilidade.

 process(all)  
 begin  
  case state is  
  when idle =>  
   if in1 then  
    nextState <= Go1;  
   end if;  
  when Go1 =>  
   nextState <= Go2;  
  when Go2 =>  
   nextState <= Idle;  
  end case;  
 end process;  

Porém é necessário verificar se a sua ferramenta de síntese suporta o VHDL-2008.

2 comentários:

  1. Outro detalhe é que quando se faz um "assignment" combinacional fora de um process é exatamente a mesma coisa que fazer ele em um process, por exemplo:
    c <= a and b;
    igual a
    process (a,b)
    c <= a and b;

    ResponderExcluir
  2. "... uma lista de sensibilidade incompleta pode gerar uma inconsistência entre a simulação e a síntese já que a síntese observa o comportamento do circuito e gera o hardware a partir disto muitas vezes ignorando a lista de sensibilidade."

    Essa desgraça! Pra simulação funcionar de um jeito e na "prática" funcionar de outro confunde a cabeça!

    Valeu pela dica André!

    ResponderExcluir