Hay presencia de ruido (Alta frecuencia) en la simulación (post-síntesis y post-implementación)

1

Estoy usando verilog en la herramienta de diseño VIVADO (XILINX), en simulación (post-síntesis y post-implementación) de mi diseño. Estoy recibiendo un noise (< em> Alta frecuencia (incluso mayor que el reloj real de la placa) cerca de ambos bordes de mi reloj derivado (lento). ¿Alguien puede decirme cómo eliminar este ruido no deseado?

la instantánea de la simulación de la siguiente manera:

El código verilog para esto es el siguiente:

module counter(
input clk,            //Actual clock(100Mhz ->Artix-7)
input rst,
output reg[7:0] out, 
output reg nc         //New clock(slow)     
);

reg [25:0]temp;
reg slow;

             initial
                       begin
                           temp=26'd0;
                           slow=1'b0;
                           out=0;
                       end

    always@(posedge clk)
        temp<=temp+1;
    always @(temp)
    begin
       if(temp==26'b10111110101111000010000000)//clock divided by 50Mhz
        slow<=slow+1;
     end

     always @(slow)
             begin
               nc<=slow;
             end 

    always @(posedge slow)
    begin
      if(rst==1'b1)
       out<=0;
    else 

       out<=out+1;
     end
 endmodule
    
pregunta Ravi Tiwari

1 respuesta

1

Su problema radica en las siguientes líneas de código:

always @(temp)
begin
   if(temp==26'b10111110101111000010000000)//clock divided by 50Mhz
    slow<=slow+1;
 end

Lo que es equivalente a:

assign slow = (temp==...) ? slow + 1 : slow;

Eso hará que slow se incremente de forma asincrónica tan rápido como lo permita el paso de tiempo de la simulación una vez que el valor de temp alcance su valor de comparación.

En un bloque siempre combinado (es decir, sin sensibilidad al borde), nunca debe asignar a la variable x (o cualquiera que sea el nombre) un valor que se derive de x (por ejemplo, x <= x + 1 ), ya que esto es Definición de un bucle combinacional.

Su lógica para la división de reloj también es defectuosa porque no restablece el valor de temp a cero cuando se produce la comparación de comparación, lo que significa que el valor de la división es básicamente el rango completo de un contador de 26 bits.

Lo siguiente funcionará sincrónicamente y restablecerá temp en el momento correcto:

always@(posedge clk)
    if(temp==26'b10111110101111000001111111) begin //clock divided by 50Mhz
        slow<=slow+1;
        temp<=1'b0
    end else begin
        temp<=temp+1;
    end
end
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas