CLK ¿advertencia de red para el código del cronómetro en la placa FPGA nexys2?

1

Estoy codificando un cronómetro que muestra décimas de segundo en las dos pantallas del extremo derecho y segundos en las dos pantallas de la izquierda. La síntesis se completa correctamente, pero después de crear el archivo UCF e intentar implementar el diseño, se producen las dos advertencias siguientes.

ADVERTENCIA: CLK Net: check

ADVERTENCIA: CLK Net: carry

Intenté ignorar las advertencias y fui a generar el archivo de programación, pero apareció esta advertencia y no pasó nada en el kit de FPGA y todas las pantallas tenían 8 en ellas.

ADVERTENCIA: PhysDesignRules: 372 - Reloj cerrado. La comprobación de la red del reloj se obtiene mediante un pin combinatorio. Esto no es una buena práctica de diseño. Use el pin CE para controlar la carga de datos en el flip-flop.

No tengo idea de lo que significa cualquiera de estas advertencias e intenté buscarlas en línea, pero no encontré nada por lo que pudiera entender mi problema. Pensé que hay algo mal con las variables check y carry, pero no tengo la suerte de solucionar el problema, ya que a mi me parece lógico. Y también me está costando mucho intentar averiguar cómo iniciar y pausar el cronómetro. Aquí está mi código:

module stopwatch(clk,rst,a,b,c,d,e,f,g,dot,an);

input clk,rst;
output a,b,c,d,e,f,g,dot;
output [3:0] an;

reg [22:0] count_time;
reg [3:0] first,second,third,fourth;
reg check;
reg carry;

// contando 1 segundo y produciendo un tick cada 1 segundo

always @ (posedge clk or posedge rst)
begin
    if(rst)
      begin
      count_time <=0;
      check<=0;
      end
    else
      begin
      count_time<=count_time+1;
        if(&count_time==1)
         check<=1;
        else
         check<=0;
      end
end

// contando con los dos últimos SSD

always @ (posedge check or posedge rst)
begin
    if (rst)
      begin
      third<=0;
      fourth<=0;
      end
    else if(fourth==9)
      begin
        if(third==1)
         begin
         third<=0;
         fourth<=0;
         carry<=1;
         end
        else
         begin
         third<=third+1;
         fourth<=0;
         carry<=0;
         end
      end
    else
      fourth<=fourth+1;
end

// contando uno Primero dos SSDs

always @ (posedge carry or posedge rst)
begin
   if (rst)
     begin
     first<=0;
     second<=0;
     end
   else if(second==9)
     begin
       if(first==9)
         begin
         first<=0;
         second<=0;
         end
       else
         begin
         first<=first+1;
         second<=0;
         end
     end
   else
     second<=second+1;
end

// multiplexación de 4 SSD usando los 'an' bits

parameter X = 18; //we will use the top 2 bits (since 4 SSDs) for multiplexing and the lower X-2 bits for frequency control
reg [X-1:0] counter;

always @ (posedge clk or posedge rst) //counter to produce multiplexing
begin
 if(rst)
   counter<=0;
 else
   counter<=counter+1;
end 

reg [3:0] an_temp;
reg [6:0] out;

always @ *
begin
case(counter[X-1:X-2])

   2'b00:
    begin
     out = fourth;
     an_temp = 4'b1110;
    end

   2'b01:
    begin
     out = third;
     an_temp = 4'b1101;
    end

   2'b10:
    begin
     out = second; //dont care
     an_temp = 4'b1011;
    end

   2'b11:
    begin
     out = first; //dont care
     an_temp = 4'b0111;
    end

endcase
end

assign an = an_temp;

// enviando dígitos a los SSD para cada intervalo de multiplexación

reg [6:0] temp;
always @ *
begin
case(out)
   4'd0 : temp = 7'b0000001; 
   4'd1 : temp = 7'b1001111; 
    4'd2 : temp = 7'b0010010; 
   4'd3 : temp = 7'b0000110; 
   4'd4 : temp = 7'b1001100; 
   4'd5 : temp = 7'b0100100; 
   4'd6 : temp = 7'b0100000; 
   4'd7 : temp = 7'b0001111; 
   4'd8 : temp = 7'b0000000; 
   4'd9 : temp = 7'b0000100; 
   default : temp = 7'b1001000; // H
  endcase
end 

assign {a,b,c,d,e,f,g} = temp;
assign dot = 1'b1; //dots are off

endmodule
    
pregunta Hameem

1 respuesta

0

En primer lugar, asumo que la señal clk es una buena señal de reloj limpio que se maneja desde fuera del FPGA, tal vez por un oscilador de cristal, una fuente de reloj LVDS o similar, preferiblemente en un pin de reloj dedicado.

Su código crea un contador de transferencia almacenado en count_time que se desborda a cero después de 22 bits, donde el ciclo con todos los conjuntos de 1-1% de la señal de check para un ciclo. Hasta ahora todo bien.

always @ (posedge clk or posedge rst) begin
    if (rst) begin
      count_time <=0;
      check <=0;
    end else begin
      count_time <= count_time+1;
      check      <= &count_time;
    end
end

El problema es cómo utiliza la señal check . Lo ha agregado a la lista de sensibilidad del proceso //counting on last two SSDs . Dado que esta señal es la salida de un flip flop, en lugar de una buena señal de reloj externa limpia, las herramientas le advierten. Esta disposición (lógica de una etapa que alimenta el RELOJ de un registro posterior) se denomina "reloj cerrado". Es popular en el diseño ASIC pero no es una buena práctica de diseño sincrónico para apuntar a FPGA.

La forma de resolver esto es volver a escribir su código para que todos los procesos sean sensibles solo a las señales clk y rst . La señal check se promoverá para que se convierta en el CLOCK ENABLE de entrada para toda la lógica dentro del proceso. Haré una para que comience:

//counting on last two SSDs

always @ (posedge clk or posedge rst) begin
    if (rst) begin
      third <= 0;
      fourth <= 0;
    end else if (check) begin
        if (fourth==9) begin
           fourth<=0;
           if (third==1) begin
              third <= 0;
              carry <= 1;
           end else begin
              third <= third + 1;
              carry <= 0;
           end
        end else begin
          fourth <= fourth+1;
        end
    end
end

Probablemente no sea por eso que el diseño no funciona, pero debería aclarar esas advertencias y ponerlo en el camino correcto. Sería recomendable que esto se ejecute en un simulador como Icarus Verilog para ver si el diseño tiene problemas fundamentales.

También deberías:

  • registre la salida de a,b,c,d,e,f,g,dot y los ánodos an para que se revelen al mundo exterior en un borde de reloj común, en lugar de después de la lógica arbitraria / retrasos de enrutamiento. El registro se absorberá en las almohadillas de E / S de pin, así que no se preocupe por el uso de la lógica 'extra', lo tendrá de todos modos

  • Dependiendo de cuál sea la frecuencia de reloj de la fuente ( clk ), es posible que desee reducir enormemente la frecuencia base de las salidas multiplexadas (si se utiliza habilita nuevamente), no funcionará de manera efectiva si el tiempo activo para Cada pantalla tiene solo cientos de nanosegundos antes de cambiar. Para obtener un alias visual sin parpadeo, busque un redibujado de aproximadamente 25-50Hz en cada dígito, de modo que con cuatro pantallas desea cambiar la salida a 200-500 hz. Yo agregaría muchos más bits a counter y utilizaría los bits superiores para controlar el multiplexor.

respondido por el shuckc

Lea otras preguntas en las etiquetas