Usando as duas arestas de um relógio


10

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?

Respostas:


7

Quando você atribui a um registro em um bloco sempre sensível à borda, está definindo um flip-flop. Os FPGAs não têm flip-flops que podem ser acionados nas duas extremidades de um relógio.

Para fazer o que você deseja, você precisará ter dois blocos sempre separados, um para cada borda do relógio, e então descobrir uma maneira de combinar as saídas dos dois blocos sem criar falhas.

Por exemplo, um bloco sempre pode conter seu divisor programável. Projete-o para que o ciclo de trabalho de saída seja menor que 50% quando for fornecido um número ímpar. Use o segundo bloco always (na outra extremidade do relógio) para atrasar a saída do primeiro bloco em 1/2 relógio e depois OU as duas saídas juntas. Desative a saída do segundo bloco para valores divisores pares.


A razão pela qual desejo usar as bordas positivas e negativas do relógio é ter um ciclo de trabalho de 50%.
Randomblue 10/09/12

Sim, entendi. Minha resposta aborda isso diretamente. Supus que você já sabe como obter um ciclo de trabalho de 50% quando o valor do divisor é uniforme. O que não está claro?
Dave Tweed

Não há chinelos de borda dupla? Não há uma razão inerente para isso. Acontece que ninguém os está produzindo (ou pelo menos ninguém que conhecemos). Como aponta Martin, há um CPLD que suporta dual-edge flip-flop: xilinx.com/products/silicon-devices/cpld/coolrunner-ii/...
Philippe

3

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 alwaysblocos, 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.



1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.