It turns out that when a DMA stream fails to finish, nothing short of restarting the board will get it to work again. For that reason, after my code failed, it made the tutorial’s code fail, until this morning when I tried it again. The tutorial actually does work. Why does it work when my code doesn’t? Because the tutorial’s code has a fixed length of input, so it knows when to halt, which I simply didn’t notice because the length is defined in a header and not the main code. Oops! Fortunately I should just be able to add the length as a function argument and write it to a port, I expect. (I had been told that using ap_axiu would take care of the TLAST signal automatically, and therefore I didn’t have to define a length, but apparently that is incorrect.)