PYNQ: PYTHON PRODUCTIVITY

PYNQ program stuck there when trying to start a overlay on ZCU104

I try to run a very simple program on ZCU104 to test the PYNQ design process, my program stuck there when I trying to start the overlay, here are the details:

1.Evaluation Kit: EK-U1-ZCU104-G-ED

2.Detail Information
2.1 In Vivado HLS, write a basic program, which only reads in a matrix with 28*28 8-bit elements, change the matrix elements value, then return the revised matrix.
Here is the HLS function code:

2.2Make the HLS program into IP, use Vivado to start an IP block design(where I think the problem located in?)

When validating the block design, the memory address cannot be located correctly.
I have to choose “Auto Assign Address” in the address editor, but some ports are still excluded and left critical warning here.

2.3 I put the overlay bitstream file (design_1_wrapper.bit) and hardware file (design_1.hwh) on the ZCU104board.

3.The PYNQ code in Jupyter notebook:

  1. My program stuck hanging here:
    " if(ap_done):
    print(mmio.read(ADDR_AP_CTRL))
    break"
    since ADDR_AP_CTRL always be 0.

  2. I do a small test, assign values to different IP addresses.
    For those pre-claimed registers, no matter what value I assign, the value is always 0, I guess this is the direct cause of the problem, but not where I should fix it.

For the self-claimed memory address, I can correctly write in the value(cc=0x81=129).
register test

.Can anyone give me some advice? A thousand thanks.

I have some thoughts that might help:

  • Try to give the .bit and .hwh files the same names (i.e. NAME.bit and NAME.hwh).
  • Try to export the .tcl file from Vivado and put it on the board besides the .bit and .hwh files (also use the same name NAME.tcl).
  • From your Vivado integration diagram I don’t see that you’re using any interrupt. Try to comment out any part of your code that deals with GIE or IER … probably they’re making some troubles.
  • In your StartStop_Ex(state) method, try to check whether the IP is idle before you ask it to execute … something like:
# Check if IP is idle
while(True) :
    bits = mmio.read(ADDR_AP_CTRL)
    ap_idle = bits>>2 & 0x1
    if ap_idle == 1:
        break
# IP is idle and ready to compute .. do your business

These are my thoughts for now.

Do you really need 2G space for both ports? I think it might be good to start with a smaller range, something like 16MB or so.