Estoy usando verilog en la herramienta de diseño VIVADO (XILINX), en la simulación (possíntesis y posimplementación) de mi diseño, recibo un ruido ( alta frecuencia , incluso mayor que el reloj real de la placa) cerca de ambos bordes de mi derivado ( lento) reloj. ¿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 de la siguiente manera:
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
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 cual es equivalente a:
assign slow = (temp==...) ? slow + 1 : slow;
Eso hará slow
que se incremente de forma asincrónica tan rápido como lo permita el paso de tiempo de simulación una vez que el temp
valor alcance su valor de comparación.
En un bloque siempre combinacional (es decir, sin sensibilidad de borde), nunca debe asignar a la variable x
(o el nombre que sea) un valor que se deriva de x
(por ejemplo x <= x + 1
), ya que esto es, por definición, un bucle combinacional.
Su lógica para la división del reloj también es defectuosa porque no restablece el valor de temp
a cero cuando ocurre la 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 se 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
alex.forencich
greg
Ravi Tiwari