registrarse sin clk

1

Estoy diseñando un sistema pequeño en VHDL usando el método datapath y contorller. ¿Está bien si diseño registros que no tienen una entrada de reloj (carga de datos en el flanco ascendente de la señal de carga) ya que están siendo controlados por la unidad de control que se ejecutará en la misma señal de reloj; Sólo para usar menos cableado. Algo como esto:

PROCESS (load, reset)
BEGIN
    IF RISING_EDGE(load) THEN
        temp <= d_in;
    ELSIF RISING_EDGE(reset) THEN
        temp <= (OTHERS => '0');
    END IF;
END PROCESS;
d_out <= temp;

¿Hay algo de malo en el diseño de arriba? Quiero hacer un registro de turnos también; cargue en el borde ascendente de 'load' y cambie en el borde ascendente de la señal de entrada 'shift_right', que se vería así:

PROCESS (load, sh_r)
BEGIN
    IF RISING_EDGE(load) THEN
        reg <= d_in;
    ELSIF RISING_EDGE(sh_r) THEN
        reg <= reg (n-1) & reg (n-1 DOWNTO 1); 
    END IF;
END PROCESS;
d_out <= reg;
    
pregunta mahdi

2 respuestas

2

Usted "puede" hacerlo pero sería altamente desanimado. Lo correcto es aprender a diseñar su lógica para que todo (o al menos grandes particiones separadas de la lógica) se ejecute en un reloj común. Luego, aprender a usar el reloj permite que las operaciones de "carga", "borrado", "incremento" y "cambio" se realicen en el siguiente borde del reloj. El diseño de estos relojes permite que los términos sean pulsos de un reloj de ancho.

No hay un inconveniente real en este diseño de tipo porque prácticamente todos los FPGA a los que apuntaría su diseño tienen redes de reloj globales que distribuyen los relojes a todos los flip-flops de células lógicas que están separados de los recursos de la rutina lógica asignables.

El lado positivo de este diseño de tipo es que simplifica enormemente el análisis y cumple con la configuración y el tiempo de espera. Si la sincronización se aprieta, es mucho más fácil convertir los diseños totalmente sincronizados para usar un reloj más lento para cumplir con la sincronización o para canalizar las secciones de lógica crítica para dividir las rutas de retardo en dos relojes.

Hazlo desde el principio y será algo que será una experiencia valiosa para cada diseño futuro que hagas.

    
respondido por el Michael Karas
1

Advertencia: esta respuesta asume que está apuntando a una implementación de FPGA, no a un ASIC. Además, mi conocimiento es más en Verilog que en VHDL.

El ejemplo de tu código está bien. Es solo un registro con la entrada de reloj conectada a la red denominada load y con una función de reinicio asíncrono. (Suponiendo que entiendo el VHDL)

  

También quiero hacer un registro de desplazamiento; cargue en el borde ascendente de 'carga' y cambie en el borde ascendente de la señal de entrada 'shift_right'.

Esto no es lo que se muestra en su ejemplo de código. Tu código ni siquiera tiene una señal shift_right . Entonces, si esto es lo que quieres que haga tu código, el código es incorrecto.

Además, si está apuntando a una implementación de FPGA, no hay primitivas disponibles que tengan el comportamiento que solicita, por lo que el código que describe probablemente no se sintetizará.

Si sabe que load y shift no serán altos al mismo tiempo, puede hacer esto (ejemplo en Verilog, tendrá que convertirlo a VHDL):

reg [7:0] d_out;
wire load, shift, clock;
assign clock = load & shift;
always @ (posedge clock) begin
    if (load) begin
        d_out = d_in;
    end
    else begin
        d_out = {1'b0, d_out[7:1]};
    end
end

Sin embargo, este no es un estilo de codificación preferido (al menos para FPGA). No hará un buen uso de los recursos de enrutamiento de reloj (como dice la respuesta de Michael) y será difícil probar que se cumplen los requisitos de tiempo (que d_in cumple con los requisitos de tiempo de muestra y retención en relación con la señal clock generada).

También funciona mejor si el retardo a través de la puerta y que genera clock es más largo que el retardo a través del multiplexor implícito en la estructura if-else , que puede requerir algunas restricciones de diseño cuidadoso.

Al final, lo más seguro es que sea mejor que diseñe su lógica para trabajar con los recursos en el FPGA, ya que fueron diseñados para ser utilizados, en lugar de forzar sus herramientas para crear algo para lo que no estaban destinados.

Editar

Sobre tu segundo ejemplo de código.

Esto seguramente no se sintetizará para un FPGA. La razón es que los flip-flops que son primitivos integrados dentro del FPGA tienen solo una entrada sensible al borde, mientras que su código requiere dos entradas sensibles al borde.

Si el código se sintetiza, es probable que use recursos adicionales para crear el comportamiento que describe su código (por ejemplo, podría construir un dispositivo similar a un pestillo a partir de varias LUT, o usar 2 o 3 flip-flops cronometrados por diferentes señales) y combinar las salidas de alguna manera para lograr el comportamiento). Los recursos adicionales utilizados casi seguramente serán más de lo que ahorró al no enrutar su señal de reloj global a su registro de turnos.

Además, recuerde que al no conectar la señal de su reloj al registro, no guarda prácticamente nada. Debido a que el FPGA tiene recursos de enrutamiento de reloj dedicados, y si no los usa para conectarse a su registro, probablemente terminen sin ser utilizados en lugar de ser usados para otra cosa.

Conseguirá el código más eficiente consultando la guía de uso provista por su proveedor de FPGA y utilizando el código que recomiendan para inferir un registro de desplazamiento con carga, o utilizando el módulo de registro de desplazamiento provisto en las bibliotecas de su proveedor.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas