# PYNQ Tutorial 1: Board Setup and GPIO ## Objective After you complete this tutorial, you should be able to: - Install a Linux OS on a MicroSD card for the ZYNQ FPGA. - Create a Hello World project for ZYNQ FPGA. ## Required Hardware - A ZYNQ FPGA board that supports PYNQ - A USB micro cable - An Ethernet cable (also a USB-to-Ethernet adapter if your laptop doesn't have Ethernet) - A MicroSD card with a capacity of 16 GB; **do not use** one that is 64 GB or larger (not supported) - A MicroSD card reader (if your laptop doesn't have one) only needed once to flash the micro SD ## Required Software Download and install the following software tools: - Vivado with board files installed - Retired Zybo, Zybo-Z7-10, Zybo-Z7-20: https://github.com/Digilent/vivado-boards/tree/master - PYNQ Z1, PYNQ Z2: https://pynq.readthedocs.io/en/v2.6.1/overlay_design_methodology/board_settings.html - Win32DiskImager (https://win32diskimager.org/) - PuTTY (https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) - WinSCP (https://winscp.net/eng/index.php?) Download the PYNQ Linux OS image file depending on your FPGA board. Use the image v3.0.1. - Retired Zybo, Zybo-Z7-10, Zybo-Z7-20: https://github.com/nick-petrovsky/PYNQ-ZYBO - PYNQ Z1, PYNQ Z2, and others: https://www.pynq.io/boards.html ## 1. FPGA Setup ### Video Tutorial :::info If you prefer a video tutorial version, check out this one: ***Everything you need to get started with the PYNQ-Z1 FPGA*** https://youtu.be/X74T3C9YbgE?si=J1tIvihO7oQC1Lb4 ::: ### 1.1. MicroSD Setup In this step, you are going to install Linux OS on the MicroSD card. Follow these steps: - Connect the MicroSD to the laptop via SD reader. - Extract the Linux image file to your laptop to obtain the `.img` file. - Open the **Win32DiskImager** program. - Select your image file (the `.img` file). - Make sure the selected device is the MicroSD card. - Click **Write** to write to the MicroSD card. Wait until finished. - Safety remove the MicroSD card and insert the MicroSD card into your FPGA board. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252Fc4HTiM8ay5XBm01J50jz%252Fwin32-disk-imager.png%3Falt%3Dmedia%26token%3D9b75989b-fc8d-4e40-bef8-952bda34b78d&width=768&dpr=1&quality=100&sign=78abcb9f&sv=1) ### 1.2. Boot the FPGA In this step, your MicroSD should be ready and inserted into your FPGA. Follow these steps to boot the FPGA. In this example, I use the ZYBO board, but for other boards, it should be similar. - Insert MicroSD to your board. - Make sure the boot jumper is set to SD. - Make sure the power supply jumper is correct, either USB or external adaptor. - Connect the **USB cable** and **Ethernet cable** to your laptop. - Connect the **board's power supply** (or some boards can use power from the USB) and **turn on the switch power**. - Open the **PuTTY program**, setup the **Serial line** according to the **COM port** on your laptop (every laptop may be different, open **Device Manager** to see your COM port) and **Speed 115200**. Then click **Open**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FDdjE5a8pZs6PBdvRWjpW%252Fputty_zynq.png%3Falt%3Dmedia%26token%3Df7a09e97-6650-49c9-8ed1-f1d2a0237983&width=768&dpr=1&quality=100&sign=8a0c35f7&sv=1) - Wait until the boot process is complete. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FkftMGPMaeGSwVbGeX1iQ%252Fpynq_boot_login.png%3Falt%3Dmedia%26token%3D9cf01c47-ef25-454d-934e-ef8a8a6cad2a&width=768&dpr=1&quality=100&sign=7f3b2d28&sv=1) - Some boards are automatically logged in. But if your board is required to login, usually this is the credentials: - User ID: **xilinx** - Password: **xilinx** - Setup your computer's IP address to the following: - IP address: **192.168.2.100** - Subnet mask: **255.255.255.0** ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FLZtw3LtYSvQmd2zmecdI%252Fsetup_ip_address_windows.png%3Falt%3Dmedia%26token%3D22b05b17-5f9f-4a3d-80bf-1ab309dbb99b&width=768&dpr=4&quality=100&sign=e686d7bf&sv=1) - Open a web browser and enter the URL: http://192.168.2.99:9090. The Jupyter Notebook will be loaded. The password is **xilinx**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FMMqHPot16XDT4Kcvggdo%252Fjupyter_web_page.png%3Falt%3Dmedia%26token%3De1bf7837-5d45-4594-ad99-1ce72abcdfdf&width=768&dpr=1&quality=100&sign=542c4992&sv=1) - **[IMPORTANT]** How to turn off the board? To prevent MicroSD card corruption, when turning off the board, perform a shutdown process with the command: ``` sudo shutdown -h now ``` - Wait until the FPGA board is completely shut down before turning off the board's power supply. ## 2. Hello World Project ### Video Tutorial :::info If you prefer a video tutorial version, check out this one: ***First Vivado Design (GPIO) with the PYNQ-Z1 FPGA*** https://youtu.be/YaL-vvDcwbw?si=tfZtP-dc6VBhmDkh ::: ### 2.1. Create Vivado Project In this section, we are going to create a new Vivado project that consists of simple AXI GPIO IP. - Open the Vivado program and create a new project from menu **File, Project, New**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FWgv7gebtMRFT3idNZLNZ%252Fvivado_new_project.png%3Falt%3Dmedia%26token%3D32bc91ff-f2d8-4aa6-96f9-bc6ba6129844&width=768&dpr=1&quality=100&sign=d1b08884&sv=1) - **[IMPORTANT]** Select the folder where you want to create the project. **Do not use a read-only location** (usually the My Document in C: drive is read-only), and the **folder location must not have spaces**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FOdlZtSTDGVmj7FugFDbq%252Fvivado_project_name.png%3Falt%3Dmedia%26token%3D53f21e17-631f-42cb-976f-18a28e9cf22c&width=768&dpr=1&quality=100&sign=d4dce26a&sv=1) - Select **Project Type** as **RTL Project**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FpfXVgsm13fBoFL14vnGG%252Fvivado_project_type.png%3Falt%3Dmedia%26token%3D546534c8-08e8-47f6-91ff-d567eeedabd1&width=768&dpr=1&quality=100&sign=b06ce0a2&sv=1) - Select **your FPGA board**. Then, click **Next**, and **Finish**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252Fd1pgwU5D8FmXkTsjchtx%252Fvivado_select_board.png%3Falt%3Dmedia%26token%3Dc06fadff-3f5d-4e6f-975e-5898f8ade2a6&width=768&dpr=1&quality=100&sign=97b4ed64&sv=1) ### 2.2. Create Block Design At this point, you should be able to create a new project. The next step is to create a block design. - On the left side (the **Flow Navigator**), select the **Create Block Design** menu. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252F0oy8KGPXhwu0zMQX6wHc%252Fvivado_main.png%3Falt%3Dmedia%26token%3D8d2a87c9-afcc-4f4f-ba53-9132b76378f0&width=768&dpr=4&quality=100&sign=9573cc6d&sv=1) - Give the block design name **design_1**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FNrfIn5h6NN5O9BMxYAbq%252Fvivado_block_design_name.png%3Falt%3Dmedia%26token%3D47988762-b3e2-4815-8cf8-f1f53f54531d&width=768&dpr=1&quality=100&sign=9935937c&sv=1) - Click the **Add IP** button, then add the **ZYNQ7 Processing System** IP. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FMg1YvfR19qzAt8fr9Irn%252Fvivado_add_zynq.png%3Falt%3Dmedia%26token%3D4e551673-c567-43ca-a1ac-9213b904e752&width=768&dpr=4&quality=100&sign=b35d34ad&sv=1) - Click the **Run Block Automation** button to configure the ZYNQ7 Processing System IP based on the board library. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FPaAR6GndRahOs2JhfTVl%252Fvivado_run_block_automation.png%3Falt%3Dmedia%26token%3D6e45d94f-f0c8-44a5-bd28-e9b308989146&width=768&dpr=1&quality=100&sign=fe8d1211&sv=1) - Click **OK** on the Run Block Automation window. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FPaAR6GndRahOs2JhfTVl%252Fvivado_run_block_automation.png%3Falt%3Dmedia%26token%3D6e45d94f-f0c8-44a5-bd28-e9b308989146&width=768&dpr=4&quality=100&sign=fe8d1211&sv=1) - Click **Add IP**, then add the **AXI GPIO** IP. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FDtEbbN0gBrCRLMvN4KWm%252Fvivado_add_gpio.png%3Falt%3Dmedia%26token%3D8050a591-0a96-450c-84cb-eca7aaf4b1ae&width=768&dpr=4&quality=100&sign=17093a35&sv=1) - Click the **Run Connection Automation** menu to automatically connect the AXI GPIO IP to the Zynq IP. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FmhU5XnWfjEIpt8Y2OLQR%252Fvivado_run_connection_automation.png%3Falt%3Dmedia%26token%3D77764d4f-5f77-4cac-8ea2-2a0d073ff008&width=768&dpr=4&quality=100&sign=522d5caf&sv=1) - Checklist only **S_AXI**, then click **OK** to make the AXI GPIO connection. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F~%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FijthQSTBKEn70xV3UTgB%252Fvivado_run_connection_automation_window.png%3Falt%3Dmedia%26token%3Da4ed0ef9-b5fc-4fbb-b4da-564299e57e9a&width=768&dpr=1&quality=100&sign=a2c24200&sv=1) - In the block design, **double-click** the AXI GPIO IP to configure it. Check the **All Outputs** option to configure the GPIO to be an output port. Then click **OK**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252Fm4Zf7415iXjRWF0rrP03%252Fvivado_gpio_config.png%3Falt%3Dmedia%26token%3D7d3914af-363e-44ec-8210-9f6c7c142ac4&width=768&dpr=1&quality=100&sign=9aac615d&sv=1) - In the **Sources** section, **right-click on the design_1** design block, then select the **Create HDL Wrapper** menu. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FPIQWqS9PTIQEN9mwpqaj%252Fvivado_create_hdl_wrapper.png%3Falt%3Dmedia%26token%3D33637824-556b-4549-9439-adbba5c8b8c4&width=768&dpr=4&quality=100&sign=ce2faea3&sv=1) - Click **OK** to generate. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252F9zWEIZxnE0KBimfsFyBG%252Fvivado_create_hdl_wrapper_window.png%3Falt%3Dmedia%26token%3D814b4141-bcd0-4915-84f4-987dbc21242a&width=768&dpr=1&quality=100&sign=e38d4885&sv=1) ### 2.3. Compile the System In this section, we are going to compile the design. - On the left side (the **Flow Navigator**), select the **Generate Block Design** menu. In the **Synthesis Options** section, select the **Global** option. In the **Run Settings** section, **Number of jobs** is the setting for how many CPU cores are used to perform this process. The more, the faster the process will finish. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252F8eit0AYcDKnVmv5ar4D5%252Fvivado_generate_block_design.png%3Falt%3Dmedia%26token%3D8bda732f-73d7-4e2f-8baa-0f21b9096b3b&width=768&dpr=1&quality=100&sign=6ca5ad95&sv=1) - On the left side (the **Flow Navigator**), select the **Run Synthesis** menu. Configure the **Number of jobs**, and then click **OK**. Wait until the synthesis is complete. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FW7QF6o200U5ZP4BFwFHr%252Fvivado_synth_config.png%3Falt%3Dmedia%26token%3D4d9dc0aa-c4ab-470b-8720-89fd3c3e6914&width=768&dpr=1&quality=100&sign=a77f0953&sv=1) - A window will appear after the synthesis process is complete. Next, click **OK** to run the **Run Implementation** process. Configure the **Number of jobs**, and then click **OK**. Wait until the implementation is complete. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252F1EO5urh9Zg5V1Ybajc2s%252Fvivado_synth_complete.png%3Falt%3Dmedia%26token%3D13243481-3ca1-4b1e-9a3b-8acf8e4e69c4&width=768&dpr=1&quality=100&sign=78c762d2&sv=1) - A window will appear after the implementation process is complete. Next, select the **Generate Bitstream** option and click **OK**. Configure the **Number of jobs**, and then click **OK**. Wait until the generate bitstream is complete. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FdLTTgTU57TMh3aXaVC97%252Fvivado_impl_complete.png%3Falt%3Dmedia%26token%3D1ad23fda-8afe-4ac7-85ae-fdbcef0e4159&width=768&dpr=1&quality=100&sign=80cdd96d&sv=1) - A window will appear after the generate bitstream process is complete. Close this window. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252F0RldNiSkQjcIHRzgHcQU%252Fvivado_bitstream_complete.png%3Falt%3Dmedia%26token%3D3ad3087b-25d9-4b03-b62d-b2b14cfd5d18&width=768&dpr=1&quality=100&sign=651a4652&sv=1) ### 2.4. Export the Compiled Files At this point, your design is already compiled. The next step is to program the FPGA and test the design. - Export the block design file from the **File, Export, Export Block Design** menu. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FVdVSNIVAm8upSyqhJvid%252Fvivado_export_block_design.png%3Falt%3Dmedia%26token%3D7dbaa3d4-b2f1-42c1-b799-0b8330aae700&width=768&dpr=4&quality=100&sign=826a7e90&sv=1) - Export to the default location and name it **design_1.tcl**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FgXYahgc85P0tU2BczTk6%252Fvivado_export_block_design_location.png%3Falt%3Dmedia%26token%3D8149e5bb-7a40-4c13-bf57-6231504e3e09&width=768&dpr=1&quality=100&sign=ed2d37fa&sv=1) - Export the bitstream file from the **File, Export, Export Bitstream File** menu. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FUSixE6xcUX3HDFu1cjmA%252Fvivado_export_bitstream.png%3Falt%3Dmedia%26token%3D759f680c-4287-474c-95a8-d5df93208b8d&width=768&dpr=4&quality=100&sign=cf46a02d&sv=1) - Export to the same location as the block design and name it **design_1.bit**. This name must be the same as the name of the block design. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FuUYKujjU3dSWjzqkTSPv%252Fvivado_export_bitstream_location.png%3Falt%3Dmedia%26token%3D3c4c798f-bb4e-4687-a6fe-658065f57502&width=768&dpr=4&quality=100&sign=974e28da&sv=1) - Using **Windows Explorer**, go into the following project folder. Then you will find the **design_1.hwh** file. ``` <YOUR_PROJECT_LOCATION>\part_1\part_1.srcs\sources_1\bd\design_1\hw_hand ``` - Move the design_1.hwh file to the main project folder. So, there will be three files: - **design_1.tcl** - **design_1.bit** - **design_1.hwh** ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FD8gVvm4m5sWC7iPknhDx%252Fvivado_exported_files.png%3Falt%3Dmedia%26token%3D2208d7d1-758f-4357-bc42-abbd929b8e9c&width=768&dpr=4&quality=100&sign=536e1307&sv=1) - **Power on the board** as in the previous FPGA boot procedure. Open **WinSCP** program, then connect it to the FPGA board. Open WinSCP and enter **Hostname: 192.168.2.99, User name: xilinx, Password: xilinx**. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FrSVDpRywyThvTWazzi8u%252Fvivado_winscp_upload.png%3Falt%3Dmedia%26token%3Da066fb1d-8161-4754-bf07-9be8149a9dea&width=768&dpr=4&quality=100&sign=e7372e73&sv=1) - On the left side, navigate to the Vivado project folder location. You will see the **three required files**. Then, **drag and drop** the three files from left to right to upload. ![](https://weenslab.gitbook.io/~gitbook/image?url=https%3A%2F%2F4146991827-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FIsb2SAYKLkGlVOGOY0EE%252Fuploads%252FfQllvrLGoMFrbEk6OwCe%252Fvivado_winscp_upload.png%3Falt%3Dmedia%26token%3Dbb0d6e14-6929-4736-bd48-f3eba46cb056&width=768&dpr=4&quality=100&sign=1fb915e3&sv=1) ### 2.5. Test the Design At this point, the required files to program the FPGA are already on the board. The next step is to create Jupyter Notebook files. - Open a web browser and open **Jupyter Notebook** on the board. Create a new file from menu **New, Python 3 (pykernel)**. - Write the following Python code to test the design: https://github.com/yohanes-erwin/pemrograman_zynq/tree/main/pynq_part_1 - In this program, we write the value **168** to GPIO, and then the value is read back. **You can try with other values**.