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 |
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.
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:
ResponderExcluirc <= a and b;
igual a
process (a,b)
c <= a and b;
"... 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."
ResponderExcluirEssa desgraça! Pra simulação funcionar de um jeito e na "prática" funcionar de outro confunde a cabeça!
Valeu pela dica André!