Estou programando um Altera Cyclone IV usando Verilog e Quartus II. No meu projeto, eu gostaria de usar as duas extremidades de um relógio para poder fazer a divisão do relógio por um fator ímpar, com um ciclo de trabalho de 50%. Aqui está um trecho do meu código:
always @(posedge low_jitter_clock_i or negedge low_jitter_clock_i or posedge reset_i) begin
if(reset_i) begin
fixed_clock <= 1'b0;
divider_dummy <= 'b0;
end else begin
fixed_clock <= fixed_clock_next;
divider_dummy <= divider_dummy_next;
end
end
Agora, quando eu compilar isso, o Quartus II lança o seguinte erro:
Verilog HDL Always Build error em adc_clocking.v (83): o controle de eventos não pode testar as bordas positivas e negativas da variável "low_jitter_clock_i"
Como posso usar a borda positiva e negativa de um determinado relógio no meu design?
fonte
Se for para lógica interna, você provavelmente precisará escrever muito mais perto dos chinelos disponíveis. Exceto pelo Coolrunner-II, não conheço nenhuma lógica programável com registros de borda dupla inerentes.
Portanto, você terá que criar dois
always
blocos, um para o negedge e outro para o posedge e combinar suas saídas com alguma lógica combinatória.Ou use um PLL para dobrar o relógio e, em seguida, você pode usar a lógica convencional de uma aresta.
fonte
Acabei implementando um ciclo de trabalho de 50% para fatores de divisão ímpares usando o método descrito aqui .
fonte
Como observa Dave Tweed, a menos que um FPGA inclua hardware de flip-flop que possa operar nas duas extremidades de um relógio, será necessário escrever sua própria lógica para implementar o comportamento desejado usando chinelos convencionais de borda única. Embora existam várias maneiras diferentes de implementar um circuito que se comporte de maneira semelhante a um flip-flop de borda dupla, esses circuitos geralmente adicionam algumas restrições de tempo diferentes daquelas associadas aos flip-flops.
Por exemplo, uma abordagem simples é ter um módulo combinando dois xors de 2 entradas e um par de chinelos "T" (onde o estado da entrada quando um pulso de clock chega indica se esse limite do clock deve alternar a saída), um desencadeada por uma borda ascendente e uma desencadeada por uma borda descendente. A saída do módulo será o xor das saídas dos flip-flops e a entrada para os dois flip-flops será o xor da saída do módulo e sua entrada.
Um circuito projetado dessa maneira funcionará essencialmente como um flip-flop de borda dupla, embora com tempos de configuração e propagação mais longos, mas com uma restrição de tempo adicional. Um flip-flop normal que não esteja no caminho de feedback não se importará se o início de uma borda do relógio tiver vários pulsos de execução, desde que o relógio se estabilize em um nível válido e que a restrição de tempo de configuração, medida antes do o primeiro pulso de execução e as restrições de tempo de espera e de tempo ativo do relógio, medidos a partir do momento em que o pulso do relógio está estável, são atendidos. O comportamento da saída do flip-flop será indefinido durante o tempo em que o relógio estiver instável, mas será definido após a estabilização do relógio. O módulo double-xor-double-flop adicionaria a restrição de tempo adicional de que qualquer borda do relógio que alterasse a saída deve estar a uma distância segura de qualquer outra borda do relógio que possa fazê-lo. Deixar de atender a essa restrição, por exemplo, ter três bordas do relógio em sucessão muito próxima enquanto a entrada não corresponder à saída, poderá deixar a saída em um estado indeterminado ou metaestável (observe que cenários que envolvem um número par de bordas não são uma preocupação). , uma vez que esses cenários envolveriam nada além de pulsos runt; o caso de três arestas (ou outros casos com número ímpar maior que um) é uma preocupação, porque haveria um pulso válido após os pulsos runt.
Um projeto de circuito alternativo seria ter os dois chinelos como acima, mas alimentar suas saídas em um multiplexador. Esse circuito não seria jogado em um estado ruim por pulsos runt, e suas restrições de clock seriam as mesmas das travas subjacentes, mas teria a desvantagem de que uma saída que era alta e deveria permanecer (ou era baixa e deveria permanecer baixa) ), para que pudesse ocorrer uma falha breve na borda do relógio. Em alguns circuitos que não importariam, mas em outros, importaria.
Provavelmente seria possível para ferramentas de síntese lógica implementar flip-flops de borda dupla automaticamente analisando quais restrições de tempo foram especificadas como importantes, mas isso seria um pouco difícil. Também aumentaria o risco de que uma pequena alteração em um design pudesse causar uma grande alteração na implementação e, assim, produzir uma mudança significativa e inesperada no comportamento.
fonte