Código VHDL y pestillos no deseados

Estoy trabajando en la codificación de un Regsiter a1con señales de entrada b1,rsty wra1el registro a1se inicializa a un valor específico al reiniciar. a1solo cambia su valor a b1cuando wra1de lo 1contrario mantiene el valor anterior

process(clk,regrst)
begin
    if(regrst='1')then  
        a1 <= (others =>'0');
    elsif(clk'event and clk='1') then       
        if(wra1='1')then
            a1 <= b1;
        end if;
    end if;
end process;

En esta declaración, he escrito el proceso de registro para actualizar la señal wra1 necesaria, pero estoy confundido sobre cómo hacer que mantenga el valor anterior de la salida en caso de que esta señal de escritura sea 0. ¿Este concepto genera pestillos no deseados para almacenar el valor anterior? ? si es así, ¿qué puedo agregar como una asignación de registro predeterminada al comienzo del proceso? y debo incluir la declaración else con

a1<=a1; 

Gracias

Su código genera un registro con reinicio asincrónico y habilitación de escritura según lo previsto. No se necesita una sentencia else. Esto funciona porque su lista de sensibilidad solo tiene señales asincrónicas enumeradas (el reloj y la señal de reinicio). A menos que haya un flanco ascendente, no puede haber ningún cambio excepto el reinicio. Entonces, este es un verdadero comportamiento de flip flop, no un comportamiento de bloqueo :)

Respuestas (1)

Como menciona Paebbels en su comentario, su proceso funciona exactamente como lo pretende.

Obtiene un flip-flop, y no un pestillo, debido a la condición en clksu declaración if, que especifica que a1se asigna solo cuando clk aumenta. clk'eventsignifica que acaba de ocurrir un cambio clk, por lo que clk'event and clk='1'significa " clkacaba de cambiar y ahora es uno", es decir, un flanco ascendente.

No es necesaria una asignación por defecto como la que propones porque una señal mantiene su valor anterior si no se le asigna explícitamente. Esto simplifica los procesos secuenciales como el que publicaste, pero también es la fuente de bloqueos no deseados en los procesos combinatorios.

El siguiente es un pestillo:

process(wra1, b1) begin
    if(wra1='1')then
        a1 <= b1;
    end if;
end process;

Tenga en cuenta que 1) este proceso no tiene reloj (es decir, no tiene una condición de flanco ascendente en una señal), al igual que un proceso que describe la lógica combinatoria, pero 2) no se asigna ningún valor cuando no es 1, lo que significa que mantiene su valor actual a1hasta wra1que wra1es 1 de nuevo, incluso si b1cambia. Esa es la semántica de un pestillo.