Here is a QPSK Radio that I put together using Xilinx System Generator blocks. The symbol synchronizer is a bit unorthodox. This radio is detailed in a paper titled "Implementation of a QPSK Symbol Synchronizer in Xilinx System Generator," published in 2021 IEEE Computer Society Annual Symposium on VLSI (ISVLSI). The variables in modemPreloadFcn.m are used in the System Generator file. The function in srrc.m is called in modemPreloadFcn.m. I have not implemented this radio in hardware and I make no guarantees about is functionality. However, in simulations, it seems to function as intended and I published it here for educational purposes. I have also not inserted any registers that one would do when performing a timing analysis.
If you want to test the symbol synchronizer, you can click into QPSK_mod and then into the Phase Increment block (a constant block). You can then add a small offset to the current .25 (such as: .25 + .0002). After running the simulation, you can view an IQ plot by typing:
I_rx = outI.Data
Q_rx = outQ.Data
You can then run PlotRxPts.m to check its performance.
This radio was inspired by reading the book "Software Receiver Design" by Johnson, Sethares, and Klein.