芯片型號:XC7Z010-1CLG400C
Vivado版本:2016.1
點亮流水燈,共使用了三種方式:
(1)PS通過MIO點亮PS端LED
(2)PS通過EMIO點亮PL端LED
(3)PS通過AXI點亮PL端LED。
1. MIO與EMIO
首先來理清楚MIO與EMIO的關系。MIO是PS的I/O引腳,一共有54個,分為Bank0與Bank1,可以接許多外設比如UART、SPI或GPIO等,另外可以引腳復用。當我們想通過PS來訪問PL又不想浪費AXI總線時,就通過EMIO接口來訪問。在54個I/O中,有一些只能用于MIO,大部分可以用于MIO與EMIO,一些接口信號線只能通過EMIO訪問。
EMIO依然屬于PS,只是連接到了PL,再從PL輸出信號。
2. PS通過MIO點亮PS端LED
從電路中看得很清楚,這兩個LED直接連接在MIO0和MIO13上,所以直接在這兩個端口輸出高低電平就可以控制燈閃爍了。
首先建立.bd文件,添加zynq的ip核,去掉PL的資源(包括PS-PL configuration——general——Enable Clock Resets中的FCLK_RESET0_N以及AXI None Secure Enablement——GP Master AXI Interface中的GP0以及Clock Configuration——PL Fabric Clocks中的FCLK_CLK0)。
在外設I/O中,打開UART1,對應MIO48、49口,打不打開都無所謂,打開調試用。此時在MIO中已經看到UART1已經分配了管腳,然后在GPIO里,打開MIO。
最后在DDR里,找到所用的DDR芯片,比如我用的是HA-125。這樣所有的平臺就搭好了。直接generate out products——create HDL wrapper——export Hardware——lanuch SDK。
進入SDK,建立工程。首先引頭文件xgpiops.h
對MIO0和MIO13,初始化引腳。
s32 XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, u32 EffectiveAddr);
這個函數初始化gpio,第一個參數需要一個XGpioPs的結構體指針,直接在函數開頭實例化就好了,結構體的組成在.h文件。第二個參數是一個XGpioPs_Config類型結構體指針,這個結構體的內容:
typedef struct { u16 DeviceId; /**< Unique ID of device */ u32 BaseAddr; /**< Register base address */ } XGpioPs_Config;
包括gpio分配的ID和基地址。第三個參數就是基地址。
如何獲得這些信息,首先ID的獲得,打開xparameter.h頭文件,里面定義了分配的各種資源的ID。
基地址就在配置信息查了,如何獲得gpio的配置信息:
首先實例化一個XGpioPs_Config類型的指針。使用XGpioPs_LookupConfig函數,它能夠在配置信息中找到對應ID的配置信息:
所以就很明確了:
xgpio_config = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);//找分配的MIO配置信息(基地址) status = XGpioPs_CfgInitialize(&xgpio, xgpio_config,xgpio_config->BaseAddr);//初始化 if(status!=XST_SUCCESS)//初始化成功 return XST_FAILURE;
然后就是定義gpio口的屬性,包括輸入輸出和端口使能:
XGpioPs_SetDirectionPin(&xgpio, LED1, 1);//output XGpioPs_SetDirectionPin(&xgpio, LED2, 1);// XGpioPs_SetOutputEnablePin(&xgpio, LED1, 1);//enable XGpioPs_SetOutputEnablePin(&xgpio, LED2, 1);
再后面就在while(1)中循環點燈,用XGpioPs_WritePin函數輸出高低電平。
這是純PS點流水燈。
3. PS通過EMIO點亮PL端LED
通過EMIO點PL端LED,在配置zynq ip核時,基本步驟差不多,包括去到PL資源等,唯一不同的是,在GPIO里,勾上EMIO并且分配寬度是4(因為我的小板子PL端有四個LED)。
生成了新的系統:
接下來,分配管腳!!因為這里GPIO_0在PL端。看看pdf:
把剛分配的帶寬4的EMIO(GPIO_0)綁定到這四個管腳上。
然后輸出bitstream文件,導入到SDK中時,要加上這個比特流文件。進入SDK
初始化程序還是一樣,頭文件也是xgpiops.h,這還是PS操作。
xgpio_config = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID); status = XGpioPs_CfgInitialize(&xgpio, xgpio_config, xgpio_config->BaseAddr); if(status!=XST_SUCCESS) return XST_FAILURE;
后面就是設置引腳工作模式:
這里的引腳號從54開始,因為從54后才是EMIO引腳:
0—53是MIO,53—...是EMIO。
之后點燈就可以了。在運行之前先下載比特流文件到FPGA,另外這個黑金的小板子,PL和PS協同仿真時,總報錯,只需要在Reset entire system和Program FPGA打上勾,并且這個比特流文件要絕對地址!!
4. PS通過AXI點亮PL端LED
這個就是PL與PS協同點燈了。
首先配置zynq ip核,PL部分保留,因為用到了AXI,另外MIO gpio都去掉。其余配置都一樣。添加AXI gpio IP核,并且設置寬度為4,最后Run connection Automation,加入其它必要組件,調整連線:
之后再綁定gpio_led管腳到四個LED上,綜合并生成bitstream文件,導入到SDK。
引用頭文件:XGpio.h
然后還是對引腳進行初始化和設置工作模式:
XGpio_Initialize(&GpioOutput, XPAR_AXI_GPIO_0_DEVICE_ID); XGpio_SetDataDirection(&GpioOutput,1,0x0);//output XGpio_DiscreteWrite(&GpioOutput,1,0x0);
協同點燈還是要先下載比特流文件,在運行SDK程序。
5. 總結
① 對MIO或EMIO gpio進行操作,都屬于PS,引用xgpiops.h文件,對AXI_gpio引用xgpio.h
② 涉及PL引腳或操作時,生成比特流文件并且導入SDK,運行時先下載FPGA。
③ PL輸出信號綁定引腳。
-
FPGA
+關注
關注
1630文章
21798瀏覽量
606062 -
GPIO
+關注
關注
16文章
1216瀏覽量
52391 -
MIO
+關注
關注
0文章
12瀏覽量
8184 -
Vivado
+關注
關注
19文章
815瀏覽量
66895
發布評論請先 登錄
相關推薦
評論