Estoy trabajando en la codificación de un Regsiter a1
con señales de entrada b1,rst
y wra1
el registro a1
se inicializa a un valor específico al reiniciar. a1
solo cambia su valor a b1
cuando wra1
de lo 1
contrario 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
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 clk
su declaración if, que especifica que a1
se asigna solo cuando clk aumenta. clk'event
significa que acaba de ocurrir un cambio clk
, por lo que clk'event and clk='1'
significa " clk
acaba 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 a1
hasta wra1
que wra1
es 1 de nuevo, incluso si b1
cambia. Esa es la semántica de un pestillo.
Paebbels