The last few blogs in the MicroZed Chronicles have focused upon getting the MicroZed up and running and looking at the Zynq SoC’s XADC. I thought it would be good in this blog to provide a little more detail on the Zynq SoC and how it works. This blog post focuses specifically on the Zynq SoC’s Multipurpose IO (MIO) block. It is this interface block that provides the Zynq SoC’s dual-core ARM Cortex-A9 MPCore processor with many standard interfaces. The MIO also contains the configuration settings that determine how the Zynq SoC boots.
The MIO connects to the PS (processor system) side of the Zynq SoC. It connects to 54 pins on Zynq devices (note that the Zynq-7010 SoC in the CLG225 package has 32 MIO pins), which are used for the following:
Defining the configuration method
Quad SPI memory interface
SRAM / NOR Flash memory interface
NAND Flash memory interface
Two 10/100/1000 Ethernet MACs
Two USB 2.0 OTG interfaces
Two SD Card interfaces
Two master and slave I2C interfaces
Two full-duplex SPI interfaces
Two CAN 2.0B interfaces
PJTAG and TRACE debug interfaces
Triple timer/counter (TTC)
System watchdog timer
I think you will agree it is a pretty impressive list standard interfaces and devices. You will of course end up in a situation at times where you need to trade off the many interfaces with the available pin count. Engineering is, after all, always an art of compromise.
Using the Vivado design flow, you assign functions within the MIO by double clicking on the processor within your block diagram, which brings up the re-customize IP window. There are two options for defining the MIO. The first option—Peripheral I/O Pins—is very graphical and allows you to see how assigning one interface standard affects others, as shown in the image below:
You can also use this window to define the bank-voltage settings for each of the two I/O banks (green = active).
The second option is the “MIO Configuration” tab in the Zynq Processing System screen, shown below, which brings up a list of interfaces assigned to the MIO. We can also assign the EMIO pins in this view, which we will address in a little while.
The MIO is split into two voltage banks:
MIO0 pins 0 to 15
MIO1 pins 16 to 53
Bank 0 includes the configuration input pins, which are sampled following power up. These mode pins share the multiuse I/O pins on the PS side of the device. In all, there are seven mode pins mapped to MIO[8:2]. The first four mode pins define the boot mode; the fifth determines whether the PLL is used or not; and the sixth and seventh mode pins define the bank voltages on MIO bank 0 and bank 1 during power up. The voltage standard defined on MIO bank 0 and 1 can be changed from LVCMOS to HTSL following completion of the boot loader.
As mentioned above, at times there are not enough MIO pins to bring out all the interfaces you wish to have. In such cases, you can extend the MIO into the Programmable Logic (PL) side of the Zynq SoC. This is called Extended Multipurpose IO or EMIO. EMIO can provide up to 64 additional GPIO pins. Alternatively you can assign most of the MIO interfaces to the EMIO with the notable exception of the USB, SRAM/NOR memory interfaces, and the NAND Flash interface. The Zynq SoC technical reference manual provides very detailed information on the differences between MIO and EMIO capabilities. Assigning functions to the EMIO is very simple and is accomplished by clicking the EMIO button at the end of the Peripheral I/O Pins tab as shown below:
The GPIO setting can be enabled and its size selected from the MIO Configuration option tab. The GPIO will be split into two banks of 32 bits each if the maximum 64-bit size is selected.
When you close the re-customize IP option, you will see that the additional ports you selected have been added to the PS within your block diagram:
The example above shows the PS when GPIO_0, SPI_0 TRACE_0, and TTC_0 are assigned to the EMIO. These functions can then be assigned as external IO and will be present within the re-generated HDL netlist.
Note: Because the EMIO is within the PL side of the Zynq SoC, do not forget to the enable the level shifters between the PS and PL to ensure correct operation.