Projeto de sistemas digitais com domínios de clock distintos estão sujeitos a problemas de metaestabilidade. Uma solução prática para evitar este problema é a utilização de flip flops de sincronismo. A cadeia de flip flop de sincronismo é uma das técnicas utilizadas para transferir sinais entre circuitos de domínio de clocks distintos ou de domínios assíncronos para domínios síncronos.
Este artigo irá apresentar um projeto em VHDL de uma cadeia de flip flops de sincronismo para evitar a metaestabilidade em FPGAs.
Para compreender o que é a metaestabilidade e qual a solução prática para este fenômeno, recomenda-se a leitura do artigo Metaestabilidade.
Uma Situação do Cotidiano
Para exemplificar na prática este conceito, convido o leitor a imaginar a seguinte situação recorrente no cotidiano de projetistas de FPGAs: uma entrada digital acionada por um ser humano através de um push button será processada dentro de um bloco digital. Para este exemplo, o autor está considerando a existência de um circuito de debounce externo ao FPGA.
Este exemplo ilustra a situação na qual a metaestabilidade possa ocorrer. Temos um sinal de um domínio de clock assíncrono (ação do ser humano ao pressionar o push button) entrando em um FPGA com domínio de clock síncrono e bem estabelecido.
O flip flop que será utilizado para compor a cadeia de sincronismo é um flip flop do tipo D de transição positiva de clock, com reset em nível alto assíncrono e clock enable.
Flip Flop do tipo D em VHDL
Um flip flop D em VHDL pode ser descrito da seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
-- Embarcados - Use como quiser e de os creditos -- Flip flop tipo D, reset assincrono nivel alto e -- clock enable nivel alto -- Caio Alonso - 25/07/2017 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity FFD is port ( clk : in std_logic; rst : in std_logic; ce : in std_logic; d : in std_logic; q : out std_logic ); end FFD; architecture Behavioral of FFD is begin process (clk, rst) is begin if (rst = '1') then q <= '0'; elsif (rising_edge(clk)) then if (ce = '1') then q <= d; end if; end if; end process; end Behavioral; |
Resultado do RTL Viewer da ferramenta Quartus II.
Cadeia de Flip Flop de Sincronismo em VHDL
A entidade em VHDL a ser descrita corresponde à área demarcada em pontilhado na Figura 2.
Descrição da entidade para evitar metaestabilidade com uma cadeia de dois flip flops de sincronismo em VHDL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
-- Embarcados - Use como quiser e de os creditos -- Cadeia de flip flop de sincronismo para evitar metaestabilidade -- Caio Alonso - 25/07/2017 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity metaestabilidade is port ( clk : in std_logic; rst : in std_logic; ce : in std_logic; input : in std_logic; output : out std_logic ); end metaestabilidade; architecture Behavioral of metaestabilidade is component FFD is port ( clk : in std_logic; rst : in std_logic; ce : in std_logic; d : in std_logic; q : out std_logic ); end component; signal s_meta : std_logic; begin metaestab_comp_0 : FFD port map ( clk => clk, rst => rst, ce => ce, d => input, q => s_meta ); metaestab_comp_1 : FFD port map ( clk => clk, rst => rst, ce => ce, d => s_meta, q => output ); end Behavioral; |
Resultado do RTL Viewer da ferramenta Quartus II.
A entidade metaestabilidade encapsula o sinal de entrada do sistema input e disponibiliza o sinal output para ser utilizado no projeto do sistema digital.
Conclusões
Utilizar a cadeia de flip flops de sincronismo evita problemas de metaestabilidade em projetos de circuitos digitais. Recomenda-se utilizar este recurso quando tem-se uma migração de um sinal assíncrono para um domínio de clock síncrono, como por exemplo os pinos de entradas em um FPGA. A mesma recomendação é sugerida para migração de sinais entre domínio de clocks distintos dentro de um mesmo FPGA, desde que seja respeitada a regra: a frequência do domínio de clock de origem deve ser menor que a frequência do domínio de clock de destino.
Referências:
Créditos para a imagem destacada: http://www.fpga-faq.com/FAQ_Pages/0017_Tell_me_about_metastables.htm