События асинхронны относительно друг-друга но синхронны относительно CLK. События могут совпасть по времени. Как сделать корректно, что-бы выполнялось или +1 к счетчику или -1 либо, если события наступили одновременно не делать ничего?
always @(posedge CLKIN) // FSM for write operation.
begin
if(RESET)
begin
r_notempty <= 1'b0;
r_wrst <= FSMRW_INIT;
end
else
begin
case(r_wrst)
2'b00:
if(r_cp)
begin
r_notempty <= 1'b1;
r_wrst <= r_wrst + 1;
end
2'b01:
if(fb_notempty)
begin
r_notempty <= 1'b0;
r_wrst <= r_wrst + 1;
end
2'b10:
if(!fb_notempty)
if(w_deccp)
begin
r_cp <= r_cp - 1;
r_wrst <= FSMWR_INIT;
end
endcase
end
always @(posedge CLKIN)
begin
r_din_dv <= DIN_DV;
if(RESET)
begin
r_pwraddr <= 2'b00;
r_pwe <= 1'b1;
r_cp <= 3'b0;
r_full <= 1'b0;
end
else
begin
if((DIN_DV == 1'b0) && (r_din_dv == 1'b1)) // Negadge front DIN_DV.
begin
if(r_cp <= 3)
begin
r_pwraddr <= r_pwraddr +1;
r_cp <= r_cp + 1;
end
if(r_cp >= 4) // Enable or Disable Packet Write Enable.
r_pwe <= 1'b0;
else
r_pwe <= 1'b1;
end
if((DIN_DV == 1'b1) && (r_din_dv == 1'b0)) // Posedge front DIN_DV.
if(r_cp >= 3)
r_full <= 1'b1;
end
end