No estoy seguro de por qué se activaría en data_in cuando se escribiera así a menos que lo sintetices y simules en el nivel de la puerta.
always @(posedge clk)
en RTL se asigna a un flip-flop.
always @*
en RTL se asigna a lógica combinatoria.
El @*
es una lista de sensibilidad autocompletada basada en cualquier señal que pueda afectar a una salida (lado izquierdo de =).
Su uso de especificar manualmente una lista de sensibilidad que no se usa, para crear un valor de salida no es válido para la síntesis. Como no se asigna al hardware.
NB: solo debes usar <=
dentro de always @posedge
blocks (cuando impliques flip-flops) de otra manera usa =
.
Puede crearse un circuito de detección de bordes que se pueda usar como habilitación para un sistema con reloj.
//Capture Previous trigger values
reg [1:0] trigger_d;
always @(posedge clk) begin
trigger_d = {trigger_d[0], trigger};
end
reg trigger_toggle;
always @* begin
//Bitwise XOR reduction operator creates pos & neg edge detect.
trigger_toggle = ^trigger_d;
end
always @(posedge clk) begin
if (trigger_toggle) begin
data_out <= data_in;
end
end
Haga un seguimiento de la pregunta publicada en el comentario para el sistema sin reloj dedicado:
logic pos_enable =1'b0;
logic neg_enable =1'b0;
always @(posedge trigger) begin
data_1 <= data_in;
pos_enable <= ~pos_enable;
end
always @(negedge trigger) begin
data_2 <= data_in;
neg_enable <= ~neg_enable:
end
wire sel = pos_enable ^ neg_enable;
always @* begin
if (sel) begin
data_out = data_1;
end
else begin
data_out = data_2;
end
end