The problem is using two "always@(posedge clk)" in main.v from http://cvs.linuxcnc.org/cvs/emc2/src/hal/drivers/pluto_step_firmware/main.v?rev=1.2 always @(posedge clk) if(EPP_strobe_edge1 & EPP_write & EPP_addr_strobe) begin addr_reg <= EPP_datain[4:0]; end else if(EPP_strobe_edge1 & !EPP_addr_strobe) addr_reg <= addr_reg + 4'd1; always @(posedge clk) begin if(EPP_strobe_edge1 & EPP_write & EPP_data_strobe) begin this way do not garantee that the addr_reg is not changed while sending data from pluto to pc, have to send 4 byte.