Storing Program Instructions on FPGA
It is possible to initialize RAM blocks during configuration. In your code, you just need to set the initial values :
signal RAM : memory := (data,data,data,data...);

It is also possible from Vivado to declare which blocks are used for the program and then attach some file which be transferred into these blocks.
If you want to be able to load the program from an SD card or anything else, you could store in these RAM blocks a small loader program that will manage the transfers.