¿Cuándo debo usar negedge en una señal de reloj?

Estaba leyendo sobre block ram y encontré la siguiente publicación. Aquí me doy cuenta de que quienquiera que haya escrito el código está usando negedge en la señal del reloj. Hasta ahora, casi todos los ejemplos que he visto de verilog usan posedge en señales de reloj. De hecho, no he visto ningún bloque always con negedge especificado. Me pregunto cuándo querría usar eso y por qué el código a continuación podría contener negedge.

module RAM_param(clk, addr, read_write, clear, data_in, data_out);
    parameter n = 4;
    parameter w = 8;

    input clk, read_write, clear;
    input [n-1:0] addr;
    input [w-1:0] data_in;
    output reg [w-1:0] data_out;

    reg [w-1:0] reg_array [2**n-1:0];

    integer i;
    initial begin
        for( i = 0; i < 2**n; i = i + 1 ) begin
            reg_array[i] <= 0;
        end
    end

    always @(negedge(clk)) begin
        if( read_write == 1 )
            reg_array[addr] <= data_in;
        if( clear == 1 ) begin
            for( i = 0; i < 2**n; i = i + 1 ) begin
                reg_array[i] <= 0;
            end
        end
        data_out = reg_array[addr];
    end
endmodule
Un reloj negedge es un reloj posedge desplazado 180 grados, si el ciclo de trabajo es del 50%. Por lo general, se usa para transferencias de datos DDR.

Respuestas (2)

Si es un novato en el diseño digital, le recomendaría que solo use un registro activado por flanco negativo para conectarse a otros circuitos donde sea necesario para obtener la sincronización correcta. Un ejemplo de esto es una interfaz DDR como @Paebbels mencionó en su comentario.

Por supuesto, si es un diseñador digital experimentado, podría usar un registro activado por borde negativo en un diseño activado por borde positivo para interactuar entre dominios de reloj alineados.

El punto principal a recordar es que no debe mezclar registros activados por flancos positivos y negativos en un diseño a menos que esté absolutamente seguro de que sabe lo que está haciendo, de lo contrario, esto puede causar errores que pueden ser muy difíciles de encontrar.

PD: el código que muestra no se implementará en la mayoría de las herramientas de síntesis como un blockram debido a la señal clara que establece el contenido en cero. Lo más probable es que se implemente en registros discretos y sea muy lento.

Editar: Otra posibilidad de usar un reloj activado por flanco negativo en un diseño activado por flanco positivo es en un ariete de bloque síncrono. Si tiene un ariete de bloque síncrono entre dos registros activados por flanco positivo y sincroniza el ariete de bloque en el flanco negativo, elude el retraso de un ciclo de reloj del ariete de bloque síncrono.

cada vez que quieras hacer algo entre bordes positivos.

La RAM tiene RAS/~CAS en el borde negativo de lo que le gustaría bloquear la otra mitad de la dirección, etc.