I had a mistake in my original post. I was looking at the FPGA's loop-backed response, the real ARP looked like:
0000ffffffffffff0024e8cc96be080600010800060400010024e8cc96be0a3307fa0000000000000a3307fb0000000000000000000000000000000000000ff0fdca
(the src and dst mac are swapped). If I put everything after 0000 and before ff0fdca into the second link I had listed in the question, I get 0xCAFDF00F as a CRC, which is the same as originally sent out in the ARP request (just in reverse byte order). So it makes sense if you use the right data from the get go....