Introduction
The Vivado Design Suite from Xilinx is used for the synthesis and analysis of HDL designs for Xilinx FPGAs, superseding the Xilinx ISE Design Suite with additional features for SoC development and high-level synthesis. This tool increases the overall productivity for designing, integrating and implementing systems with Xilinx’s UltraScale, 7 series devices, and Zynq-7000. In this article, we’ll be using the Vivado IP Integrator alongside the Vivado SDK to create the classic “Hello World” project for the Tagus – Artix 7 PCI Express Development Board containing a 32-bit MicroBlaze soft processor and peripherals connected together by the AXI4 bus.
MicroBlaze is a 32-bit soft processor IP developed by Xilinx for their mid and high-end FPGA devices. It is compatible with Xilinx’s 6 and 7 series FPGAs. More information on Microblaze can be found at Xilinx’s MicroBlaze page. Advanced knowledge of MicroBlaze or AXI is not a prerequisite to follow this article. Thanks to the excellent tools provided by Xilinx, most of the design can be done without writing any code at all.
Tagus – Artix 7 PCI Express Development Board
The Tagus is an FPGA Development Board from Numato Lab featuring the Xilinx’s Artix 7 FPGA with x1 PCI Express Interface. It also features a high-speed FMC connector enabling the users to add additional features to the board using FMC custom daughter boards. Thus the Tagus is a great choice for both learning and for high-end applications.
Prerequisites:
Hardware:
- Tagus – Artix 7 PCI Express Development Board.
- Xilinx Platform Cable USB II JTAG debugger.
- DC Power Supply (+12V recommended).
- USB A to Micro USB Cable.
Software:
- Vivado Design Suite with SDK (2018.2 or higher).
- Serial terminal application (PuTTY, Tera Term, etc.).
Creating MicroBlaze based Hardware Platform for the Tagus
Before starting with the creation of the design, download and install Board Support Package (BSP) files for the Tagus – Artix 7 PCI Express Development Board from here (follow README.md for instructions on installation of BSP files).
Step 1: Creating a New Project
Launch the Vivado Design Suite, go to “File -> Project -> New” to create a new project. The “New project” wizard will pop up. Click “Next” to continue.
In the “Project Name” wizard, enter a name (for example, “tagus_microblaze“) for the project and save it at a convenient location. Select the checkbox below to keep all project files in a single folder. Click “Next” to proceed.
In the “Project type” wizard, select “RTL Project” and select the checkbox to skip specifying the sources at this moment. Click “Next”.
At the “Default Part” step, select “Boards” tab and then select the “Tagus” board. Click “Next” to continue.
In the next wizard, click “Finish” to create a new project.
Step 2: Creating Block Design
In the “Flow Navigator” panel, select “Create Block Design” under the IP integrator section. Give an appropriate name (Eg: “tagus_design”) to the design and click “OK”.
In the “Board” tab, we can observe the default peripherals available for the Tagus board. Drag and drop System Clock, DDR3 SDRAM and USB UART peripherals into the design.
In the Diagram window, right-click and select “Add IP” from the popup menu. Search for “MicroBlaze” and add it to the design by double-clicking.
Double click “Clocking Wizard” IP and customize the “Output Clocks” settings as shown in the following image.
Remove the existing “sys_clk_i” connection and input port (if any) and connect the “clk_out2” net on the clocking Wizard to “sys_clk_i” of “MIG 7 Series” block as shown in the following image.
Step 3: Run Block Automation, Run Connection Automation & Validate Design
Click “Run Block Automation” present in the “Designer Assistance available” bar on the top-left corner of the window to complete the design. Select the settings as shown in the following image. Click “OK” for the Vivado to automatically configure the blocks for us.
Once the Block Automation is complete, select “Run Connection Automation” so Vivado can connect the blocks together to make a complete system. Select the “Validate Design” option from the Tools menu to make sure that the connections are correct and save the design. The final design will look similar to the image below.
Step 4: Create HDL Wrapper and Generate Bitstream
Right-click “tagus_design” in the “Sources” window, select the “Create HDL Wrapper” option from the popup menu. Click “OK” on the window that appears to finish generating a wrapper.
Click “Generate Bitstream” under the “Program And Debug” section to synthesize, implement and generate a bitstream.
Step 5: Export Hardware and Launch SDK
Once the implementation and generation of the bitstream are successfully completed, we need to export the hardware along with the bitstream. Go to the “File” menu, select “Export -> Export Hardware”. Select the “Include bitstream” checkbox and click “OK” in the “Export Hardware” wizard.
Launch SDK from the File menu. We can choose the local project directory as SDK workspace or select another directory as per preference.
Software Development in SDK For Tagus
Step 1: Creating an Application Project
Once the SDK window appears, select “New -> Application Project” from the “File” menu. Enter a project name (for example, “hello_world“) and click “Next” to select the “Hello World” template from the list.
Once the project is created, the SDK will automatically run a build. If that didn’t happen for any reason, run a build manually.
Step 2: Programming Tagus with SDK
Power up the Tagus – Artix 7 PCI Express Development Board using external DC power supply, and connect the Xilinx Platform USB JTAG cable and the USB Micro Type-B cable to the board. Program the board by selecting “Program FPGA” under the “Xilinx” menu.
Open the serial port corresponding to the Tagus board using your preferred Serial Terminal software such as HyperTerminal, PuTTY, Tera Term, etc. Select the “hello_world.elf” file under “Project Explorer” and click the Run icon on the main toolbar to run the application. Select “Launch On Hardware (GDB)” in the Run As wizard as shown in the image below.
If everything went well, the application running on the board should print “Hello World” over the USB UART and should be displayed on the Serial Terminal application.