I've finally worked out enough of the issues in my VHDL code that I've been able to successfully write 512 bytes to the SD card.
Here is how the correct CRC and response now look.
I've also fixed the way that I output to the CMD and DATA lines so that it is consistent with the way that the SD card does it (ie the correct way).
Notice that I now get the response of 0 + 010 + 1 where 010 means "data accepted". Woohoo!