Esquemas de Reset em FPGA

reset em fpga

A escolha de um esquema de reset em FPGA tem grande impacto no desempenho, na utilização de lógica e na robustez de um projeto. Ainda hoje não há uma unanimidade de um melhor reset para todas as situações. Então é necessário verificar qual o melhor reset para as suas necessidade. Discussões sobre esquemas de reset são quase como discutir religião.

No geral existem três opções: Reset síncrono, Reset assíncrono e um híbrido dos dois resets. Neste artigo pretendo discutir um pouco sobre os prós e contras de cada um deles.

Reset Assíncrono

 Reset assíncrono é definido como um sinal de entrada de um registrador que, quando válido (seja em 0 ou 1), reseta o registrador independente do clock. Um process de um reset assíncrono é descrito da seguinte forma:

reset_sinc
Figura 1. Reset assíncrono

Desvantagens

 

A utilização de resets assíncronos pode causar problemas difíceis de se verificar. Devido a característica de um circuito digital, certos atrasos podem ser maiores em algumas trilhas o que pode fazer com que o reset chegue primeiro a um módulo e depois a outro e com isso os módulos saiam do reset em tempos distintos, o que é um problema - muito - grave. Vamos imaginar o exemplo abaixo:

asinc_reset_ff
Figura 2. FF recebendo valores diferentes em reset assíncrono

No reset, o Flip-Flop(1) recebe '0' (R) e o Flip-Flop(2) recebe '1' (S), após a liberação do reset o valor do FF1 e do FF2 se alternam a cada pulso de clock (Figura 3). Vamos supor que por causa de atrasos na trilha de reset os registradores não são liberados do reset ao mesmo tempo, o FF(1) é liberado antes do pulso de clock e o FF(2) após o pulso de clock. Com isto ambos FFs ficariam em 1 ao invés de alternarem o valor (Figura 4).

comportamento_esperado
Figura 3. Comportamento esperado
bug_Sem título
Figura 4. Reset solto em tempos distintos

Este cenário não é hipotético e pode acontecer no seu circuito. Com isto máquinas de estados podem ir para estados inválidos e outros sinais de controle podem se perder, também é necessário ficar de olho no tempo de recovery e de removal (análogos ao tempo de setup e de hold de um flip-flop) dos resets para não acontecer metaestabilidade.

Vantagens

 

O uso de reset assíncronos oferece algumas vantagens, a primeira delas é a não necessidade de um clock para que o sistema entre em estado de reset, imagine uma máquina de estados que controla um processo químico, por alguma razão o clock para de entrar no seu sistema e você está no estado de "aquecer". Se o seu reset depender do clock você só vai conseguir parar de "aquecer" quando tirar o circuito da tomada ou a fábrica explodir, utilizando um reset assíncrono você consegue garantir que seu sistema vá para o estado inicial mesmo se houver um problema no clock.

340343
Figura 5. Uma indústria com reset síncrono sem clock no estado de aquecer

Outra vantagem é a velocidade pois o reset assíncrono é "instantâneo" e não depende da borda de clock. Por ser assíncrono algumas verificações de timing não são realizadas sobre o sinal de reset o que pode gerar um tempo de compilação menor. Quanto a utilização de lógica é necessário verificar a arquitetura do seu FPGA e como se da a implementação de um reset assíncrono no seu circuito sintetizado.

Reset em FPGA: Síncrono

Reset síncrono é definido como um sinal de entrada de um registrador que quando válido (0 ou 1) reseta o sistema na borda de clock. Um process com reset síncrono é descrito da seguinte forma:

reset_assinc
Figura 6. Reset síncrono

Quando se utiliza reset síncrono a ferramenta de síntese realiza os testes de timing para diferentes tensões, temperaturas e variações entre os chips. Caso não apareça erros de timing na sua trilha de reset você pode ficar tranquilo que todos os seus flip-flops serão resetados no mesmo instante de tempo, evitando os problemas vistos no reset assíncrono. Este tipo de reset TENDE a consumir menos lógica.

Reset Híbrido

E por que não utilizar as vantagens dos dois designs e reduzir as desvantagens? Para isto temos o "Reset Híbrido".

Ele é assíncrono quando ativado e síncrono quando liberado, utilizando está técnica você garante que mesmo sem clock o seu sistema vá para a condição de reset e que quando liberado o sinal chegue em todos os flipflops ao mesmo tempo, também evita o problema de metaestabilidade! Porém este tipo de reset consome mais recursos do seu FPGA e é sintetizado para uma lógica um pouco mais lenta.

process(clk,rst) 
begin 
if(rst = '0') then -- reset assincrono 
  sync_reg <= '0' 
  out_reset = '0'; 
elsif(rising_edge(clk)) then 
  sync_reg <= '1'; 
  out_reset <= sync_reg; -- deassert no reset somente apos passar por um ff sincronizado 
end if; 
end process;

Caso você tenha problemas de timing nesta abordagem é recomendado usar mais flipflops para sincronizar o circuito!

E você, que tipo de reset usa no seu design e porque? Lembrando que nada impede de utilizar diferentes tipos de reset em um só projeto mas é necessário tomar muito cuidado.

A Figura 5 é meramente ilustrativa =)

As Figuras 2, 3 e 4 foram retiradas do livro "100 Power Tips For FPGA Designers".

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

1
Deixe um comentário

avatar
 
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Ricardo Tafas Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Ricardo Tafas
Visitante
Ricardo Tafas

Nos mais de 100 IPS que desenvolvi (seja direta ou indiretamente) sempre usei um reset assíncrono no bloco, com fonte síncrona. Em todos meus experimentos (e me arrependo de não ter posto dados em planilhas) a tentativa de usar os resets como enables (como os fabricantes propõe) gera um desperdício muito grande de luts e ffd que não podem ser usados pois o enable do bloco lógico foi comprometido. Não gosto de um resetão global também. Faço normalmente os resets por bloco. Cada bloco com o seu, normalmente ligados a um registro controlado pelo mestre do chip (proc interno, MCU...).… Leia mais »