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.