Luckily there are wonderful USB stacks implemented in open FPGA toolchains these days - check out the toolchains described at https://workshop.fomu.im/en/latest/
It's a USB stack implemented as pure gateware - no hard/soft CPU needed, although I think you can hook one up if you want to.
edit: Here is the actual USB core that's in there: https://github.com/im-tomu/valentyusb/