Contador com redefinir edge-triggered assíncronas em VHDL

K

kender

Guest
Colegas, Aqui está outro problema VHDL. Eu quero colocar um temporizador one-shot para a CPLD. Ele vai servir a um propósito de segurança, se não é reset (strobe) na hora certa, ele vai cortar a energia. Para melhorar a tolerância a falhas, eu quero a redefinir a ser disparado por borda (a maioria dos flip-flops têm disparado nível redefine, embora). Então, eu escrevi o código VHDL seguinte:
Code:
 arquitetura comportamental de watch_dog_timer é sinal wdt_clk_cnt: unsigned (23 downto 0); iniciar o processo (wdt_clk, wdi) começam if (wdt_clk'event e wdt_clk = '1 'e wdt_clk_cnt <16777215 ), então wdt_clk_cnt
 
em projetos eletrônicos basicamente você não pode desencadear um processo com mais de um ponta-gatilho, então reset pode ser apenas assíncrona:
Code:
 if (reset = '1 ') então ... elsif (rising_edge (clk)) então ... fim se;
ou síncrona:
Code:
 if (rising_edge (clk)) então if (reset = '1 ') então ... mais ... end if; end if;
[size = 2] [color = # 999999] Adicionado após 2 minutos: [/color] [/size] melhor maneira é usar reset síncrono, e mais uma coisa
[ code] if (wdt_clk'event e wdt_clk = '1 'e wdt_clk_cnt <16777215), em seguida [/code]
clock gating é idéia muito ruim você deve colocar isso como:
Code:
 if (rising_edge (wdt_clk)) então if (wdt_clk_cnt <...) então ... end if; end if;
 
Você está tentando controlar o contador de duas expressões borda sensível ao mesmo tempo. Que não funciona. Flip-flops com duas entradas de clock seria necessário. Assumindo que a largura de pulso suficiente wdi, uma detecção de bordas síncrona para wdi podem ser implementadas. Caso contrário, um processo de ponta segundo wdi sensível e um aperto de mão seria necessário. Mas eu não espere que ele é necessário aqui. Outro ponto é a sincronização de sinal wdi. Se é sem relação com wdt_clock, pode coincidir com ela. Com uma certa probabilidade, wdt_clk_cnt seria repor apenas parcialmente. Ignorando caráter asynchrounous de sinais é uma fonte comum de erros de lógica desagradáveis ​​ocasionais. Sincronizando wdi antes do processamento adicional, tais efeitos são evitados.
Code:
 arquitetura comportamental de watch_dog_timer é sinal wdt_clk_cnt: unsigned (23 downto 0); wdi_sync: std_logic; wdi_sync_p: std_logic; iniciar o processo (wdt_clk) começam if (wdt_clk'event e wdt_clk = '1 'then wdi_sync
 

Welcome to EDABoard.com

Sponsor

Back
Top