Use EMIO and MIO to control Pmod GPIOS on zedboard by vivado and SDK (Zedboard)

Use EMIO and MIO directly to control GPIOs on zedboard is way more convenient than AXI GPIO, it won't need any IP. One drawback of this method is that when using the PS (programmable system) to control GPIOs directly, the signal should be sent pin by pin. So there will be little bit delays between each pin, while AXI GPIO can send all read or write signal together. However, pins that directly controlled by EMIO or MIO are dual-direction while the direction of AXI_GPIO are fixed when we created it, so it would be more convenient to control.

本章介绍用emio 和mio直接控制pmod, 不同于之前的axi gpio, 直接用ps来控制gpio的时候,每个端口需要一个个地读或写,端口与端口直接存在delay,axi gpio更像一个register, 可以同时对所有端口读或写. 不过用emio和mio直接控制的gpio是可读可写的双向端口,而axi gpio在创建的时候就已经设置了方向,要么读,要么写,所以前者更方便控制。

Conception:

There three ways to drive GPIOs by PS on FPGA 

(You can get rid of PS part and use bit-file only if you want to drive GPIO only by PL part)

1. PS ->MIO -> GPIOs (no need for constraints, pin_number[53:0] driven by PS)

2. PS ->EMIO -> PL->GPIOs   (need constraints, pin_number[117: 54] driven by PL)

3. PS ->EMIO ->AXI Bus -> PL-> GPIOs  (need constraints, pin_number[117: 54] driven by PL)

(This is the guide picture for WLAN installing)

Design:
Pmod JE is driven by MIO/ps while Pmod JA, JB, JC, JD are driven by EMIO, so we need to add constraints for JA, JB, JC, JD

1. Adding block design in vivado:


 Remember to check "EMIO" in MIO configuration


Set the constraints for pins that controlled by EMIO(there is no need to write constraints for gpios that controlled by MIO, since MIO I/O are fixed)


Generate block wrapper -> generate bitstream.

2. Driving GPIOs in SDK

There is the template I created for my block design, you can uncomment different port setting to control the read/write of different pins:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xgpiops.h"
#include "xparameters.h"
#define DELAY 10000000
#define TEST_CYCLE 8

int main()
{ XGpioPs gpioStruct;
XGpioPs_Config *gpioConfig;
s32 xStatus;
int i=0, count=0;
    init_platform();
int pinNum = 54;         //this is the number of first pin that controlled by EMIO !!!
u32 pin_out = 1;         //1 output signal
u32 pin_in = 0;    //0 input signal
// int read1[TEST_CYCLE];
int read2[TEST_CYCLE];
// int read3[TEST_CYCLE];
// int read4[TEST_CYCLE];
// int read5[TEST_CYCLE];
// int read6[TEST_CYCLE];
// int read7[TEST_CYCLE];
// int read8[TEST_CYCLE];
// int read9[TEST_CYCLE];
// int read_10[TEST_CYCLE];
// int read_11[TEST_CYCLE];
// int read_12[TEST_CYCLE];
// int read_13[TEST_CYCLE];
// int read_14[TEST_CYCLE];
// int read_15[TEST_CYCLE];
// int read_16[TEST_CYCLE];
// int read_17[TEST_CYCLE];
// int read_18[TEST_CYCLE];
// int read_19[TEST_CYCLE];

// int read_20[TEST_CYCLE];

    int input0[]={0,1,0,1,0,1,0,1};
//    int input1[]={0,1,0,1,0,1,0,1};
//    int input2[]={0,1,0,1,0,1,0,1};
//    int input3[]={0,1,0,1,0,1,0,1};
//    int input4[]={0,1,0,1,0,1,0,1};
//    int input5[]={0,1,0,1,0,1,0,1};
//    int input6[]={0,1,0,1,0,1,0,1};
//    int input7[]={0,1,0,1,0,1,0,1};
//    int input8[]={0,1,0,1,0,1,0,1};
//    int input9[]={0,1,0,1,0,1,0,1};
//    int input_10[]={0,1,0,1,0,1,0,1};
//    int input_11[]={0,1,0,1,0,1,0,1};
//    int input_12[]={0,1,0,1,0,1,0,1};
//    int input_13[]={0,1,0,1,0,1,0,1};
//    int input_14[]={0,1,0,1,0,1,0,1};
//    int input_15[]={0,1,0,1,0,1,0,1};
//    int input_16[]={0,1,0,1,0,1,0,1};
//    int input_17[]={0,1,0,1,0,1,0,1};
//    int input_18[]={0,1,0,1,0,1,0,1};
//    int input_19[]={0,1,0,1,0,1,0,1};
//    int input_20[]={0,1,0,1,0,1,0,1};
//    int input_21[]={0,1,0,1,0,1,0,1};
//    int input_22[]={0,1,0,1,0,1,0,1};
//    int input_23[]={0,1,0,1,0,1,0,1};
//    int input_24[]={0,1,0,1,0,1,0,1};
//    int input_25[]={0,1,0,1,0,1,0,1};
//    int input_26[]={0,1,0,1,0,1,0,1};
//    int input_27[]={0,1,0,1,0,1,0,1};
//    int input_28[]={0,1,0,1,0,1,0,1};
//    int input_29[]={0,1,0,1,0,1,0,1};
//    int input_30[]={0,1,0,1,0,1,0,1};
//    int input_31[]={0,1,0,1,0,1,0,1};
    int input_32[]={0,1,0,1,0,1,0,1};
    int input_33[]={0,1,0,1,0,1,0,1};
    int input_34[]={0,1,0,1,0,1,0,1};
    int input_35[]={0,1,0,1,0,1,0,1};
    int input_36[]={0,1,0,1,0,1,0,1};
    int input_37[]={0,1,0,1,0,1,0,1};
    int input_38[]={0,1,0,1,0,1,0,1};
    int input_39[]={0,1,0,1,0,1,0,1};

    print("------------------------Start testing-------------------------- \n\r");

       gpioConfig = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

       if(gpioConfig == NULL)  //cannot find corresponding device
       {
           print("Can not lookup gpioConfig!\n");
           return XST_FAILURE;
       }
    // initial gpio , this step is very important
       xStatus = XGpioPs_CfgInitialize(&gpioStruct, gpioConfig, gpioConfig->BaseAddr);
       if(xStatus != XST_SUCCESS)
       {
           print("PS MIO GPIO Initialize failed!\n");
       }
       else
       {
           print("PS MIO GPIO Initialize successed!\n");
       }

/************************************GPIO setting************************************/
       // setting direction of gpios controlled by EMIO
       XGpioPs_SetDirectionPin(&gpioStruct, pinNum, pin_out);    //write signal to gpios
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+1, pin_out);
       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+1, pin_in);   //read signal from gpios
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+1, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+2, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+2, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+2, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+3, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+3, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+3, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+4, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+4, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+4, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+5, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+5, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+5, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+6, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+6, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+6, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+7, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+7, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+7, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+8, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+8, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+8, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+9, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+9, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+9, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+10, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+10, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+10, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+11, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+11, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+11, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+12, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+12, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+12, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+13, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+13, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+13, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+14, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+14, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+14, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+15, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+15, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+15, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+16, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+16, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+16, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+17, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+17, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+17, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+18, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+18, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+18, 1);


//       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+19, pin_out);
//     XGpioPs_SetDirectionPin(&gpioStruct, pinNum+19, pin_in);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+19, 1);


// 20 pins can be set as both input and output here
       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+20, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+20, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+21, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+21, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+22, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+22, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+23, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+23, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+24, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+24, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+25, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+25, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+26, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+26, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+27, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+27, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+28, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+28, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+29, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+29, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+30, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+30, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, pinNum+31, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, pinNum+31, 1);

       // setting gpios for MIO
       XGpioPs_SetDirectionPin(&gpioStruct, 13, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 13, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 10, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 10, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 11, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 11, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 12, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 12, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 0, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 0, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 9, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 9, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 14, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 14, 1);

       XGpioPs_SetDirectionPin(&gpioStruct, 15, pin_out);
       XGpioPs_SetOutputEnablePin(&gpioStruct, 15, 1);

/************************************READ/WRIET_TO_GPIO************************************/
   while(count<TEST_CYCLE){
       //output signals to EMIO
       XGpioPs_WritePin(&gpioStruct, pinNum, input0[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+1, input1[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+2, input2[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+3, input3[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+4, input4[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+5, input5[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+6, input6[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+7, input7[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+8, input8[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+9, input9[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+10, input_10[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+11, input_11[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+12, input_12[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+13, input_13[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+14, input_14[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+15, input_15[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+16, input_16[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+17, input_17[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+18, input_18[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+19, input_19[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+20, input_20[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+21, input_21[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+22, input_22[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+23, input_23[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+24, input_24[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+25, input_25[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+26, input_26[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+27, input_27[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+28, input_28[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+29, input_29[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+30, input_30[count]);
//       XGpioPs_WritePin(&gpioStruct, pinNum+31, input_31[count]);

       //output signals to MIO
       XGpioPs_WritePin(&gpioStruct, 13, input_32[count]);    //this is the first pin number that controlled by MIO (JE1)
       XGpioPs_WritePin(&gpioStruct, 10, input_33[count]);    //JE2
       XGpioPs_WritePin(&gpioStruct, 11, input_34[count]);    //JE3
       XGpioPs_WritePin(&gpioStruct, 12, input_35[count]);
       XGpioPs_WritePin(&gpioStruct, 0, input_36[count]);
       XGpioPs_WritePin(&gpioStruct, 9, input_37[count]);
       XGpioPs_WritePin(&gpioStruct, 14, input_38[count]);
       XGpioPs_WritePin(&gpioStruct, 15, input_39[count]);    

       for(i=0;i<DELAY;i++)    //setting the system clock by adding delays, the frequency of system clock is 100Mhz

       // read signals from EMIO
//       read1[count]=XGpioPs_ReadPin(&gpioStruct, pinNum);
       read2[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+1);
//       read3[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+2);
//       read4[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+3);
//       read5[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+4);
//       read6[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+5);
//       read7[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+6);
//       read8[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+7);
//       read9[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+8);
//       read_10[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+9);
//       read_11[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+10);
//       read_12[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+11);
//       read_13[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+12);
//       read_14[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+13);
//       read_15[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+14);
//       read_16[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+15);
//       read_17[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+16);
//       read_18[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+17);
//       read_19[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+18);
//       read_20[count]=XGpioPs_ReadPin(&gpioStruct, pinNum+19);

// print the value from pmod:
//      xil_printf("The Decimal output of read1 is: %d\n\r", read1[count] );
         xil_printf("The Decimal output of read2 is: %d\n\r", read2[count] );
//       xil_printf("The Decimal output of read3 is: %d\n\r", read3[count] );
//       xil_printf("The Decimal output of read4 is: %d\n\r", read4[count] );
//       xil_printf("The Decimal output of read5 is: %d\n\r", read5[count] );
//       xil_printf("The Decimal output of read6 is: %d\n\r", read6[count]);
//       xil_printf("The Decimal output of read7 is: %d\n\r", read7[count] );
//       xil_printf("The Decimal output of read8 is: %d\n\r", read8[count] );
//       xil_printf("The Decimal output of read9 is: %d\n\r", read9[count] );
//       xil_printf("The Decimal output of read_10 is: %d\n\r", read_10[count] );
//       xil_printf("The Decimal output of read_11 is: %d\n\r", read_11[count] );
//       xil_printf("The Decimal output of read_12 is: %d\n\r", read_12[count] );
//       xil_printf("The Decimal output of read_13 is: %d\n\r", read_13[count] );
//       xil_printf("The Decimal output of read_14 is: %d\n\r", read_14[count] );
//       xil_printf("The Decimal output of read_15 is: %d\n\r", read_15[count] );
//       xil_printf("The Decimal output of read_16 is: %d\n\r", read_16[count] );
//       xil_printf("The Decimal output of read_17 is: %d\n\r", read_17[count] );
//       xil_printf("The Decimal output of read_18 is: %d\n\r", read_18[count] );
//       xil_printf("The Decimal output of read_19 is: %d\n\r", read_19[count] );
//       xil_printf("The Decimal output of read_20 is: %d\n\r", read_20[count] );
count++;
       }

    return 0;

}

Reference:

http://xilinx.eetrend.com/blog/9416

猜你喜欢

转载自blog.csdn.net/weixin_40038116/article/details/80939125