芯片型號(hào):XC7Z010-1CLG400C
Vivado版本:2016.1
點(diǎn)亮流水燈,共使用了三種方式:
(1)PS通過(guò)MIO點(diǎn)亮PS端LED
(2)PS通過(guò)EMIO點(diǎn)亮PL端LED
(3)PS通過(guò)AXI點(diǎn)亮PL端LED。
1. MIO與EMIO
首先來(lái)理清楚MIO與EMIO的關(guān)系。MIO是PS的I/O引腳,一共有54個(gè),分為Bank0與Bank1,可以接許多外設(shè)比如UART、SPI或GPIO等,另外可以引腳復(fù)用。當(dāng)我們想通過(guò)PS來(lái)訪問(wèn)PL又不想浪費(fèi)AXI總線時(shí),就通過(guò)EMIO接口來(lái)訪問(wèn)。在54個(gè)I/O中,有一些只能用于MIO,大部分可以用于MIO與EMIO,一些接口信號(hào)線只能通過(guò)EMIO訪問(wèn)。
EMIO依然屬于PS,只是連接到了PL,再?gòu)腜L輸出信號(hào)。
2. PS通過(guò)MIO點(diǎn)亮PS端LED
從電路中看得很清楚,這兩個(gè)LED直接連接在MIO0和MIO13上,所以直接在這兩個(gè)端口輸出高低電平就可以控制燈閃爍了。
首先建立.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)。
在外設(shè)I/O中,打開(kāi)UART1,對(duì)應(yīng)MIO48、49口,打不打開(kāi)都無(wú)所謂,打開(kāi)調(diào)試用。此時(shí)在MIO中已經(jīng)看到UART1已經(jīng)分配了管腳,然后在GPIO里,打開(kāi)MIO。
最后在DDR里,找到所用的DDR芯片,比如我用的是HA-125。這樣所有的平臺(tái)就搭好了。直接generate out products——create HDL wrapper——export Hardware——lanuch SDK。
進(jìn)入SDK,建立工程。首先引頭文件xgpiops.h
對(duì)MIO0和MIO13,初始化引腳。
s32 XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, u32 EffectiveAddr);
這個(gè)函數(shù)初始化gpio,第一個(gè)參數(shù)需要一個(gè)XGpioPs的結(jié)構(gòu)體指針,直接在函數(shù)開(kāi)頭實(shí)例化就好了,結(jié)構(gòu)體的組成在.h文件。第二個(gè)參數(shù)是一個(gè)XGpioPs_Config類(lèi)型結(jié)構(gòu)體指針,這個(gè)結(jié)構(gòu)體的內(nèi)容:
typedef struct { u16 DeviceId; /**< Unique ID of device */ u32 BaseAddr; /**< Register base address */ } XGpioPs_Config;
包括gpio分配的ID和基地址。第三個(gè)參數(shù)就是基地址。
如何獲得這些信息,首先ID的獲得,打開(kāi)xparameter.h頭文件,里面定義了分配的各種資源的ID。
基地址就在配置信息查了,如何獲得gpio的配置信息:
首先實(shí)例化一個(gè)XGpioPs_Config類(lèi)型的指針。使用XGpioPs_LookupConfig函數(shù),它能夠在配置信息中找到對(duì)應(yīng)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)中循環(huán)點(diǎn)燈,用XGpioPs_WritePin函數(shù)輸出高低電平。
這是純PS點(diǎn)流水燈。
3. PS通過(guò)EMIO點(diǎn)亮PL端LED
通過(guò)EMIO點(diǎn)PL端LED,在配置zynq ip核時(shí),基本步驟差不多,包括去到PL資源等,唯一不同的是,在GPIO里,勾上EMIO并且分配寬度是4(因?yàn)槲业男“遄覲L端有四個(gè)LED)。
生成了新的系統(tǒng):
接下來(lái),分配管腳!!因?yàn)檫@里GPIO_0在PL端。看看pdf:
把剛分配的帶寬4的EMIO(GPIO_0)綁定到這四個(gè)管腳上。
然后輸出bitstream文件,導(dǎo)入到SDK中時(shí),要加上這個(gè)比特流文件。進(jìn)入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;
后面就是設(shè)置引腳工作模式:
這里的引腳號(hào)從54開(kāi)始,因?yàn)閺?4后才是EMIO引腳:
0—53是MIO,53—...是EMIO。
之后點(diǎn)燈就可以了。在運(yùn)行之前先下載比特流文件到FPGA,另外這個(gè)黑金的小板子,PL和PS協(xié)同仿真時(shí),總報(bào)錯(cuò),只需要在Reset entire system和Program FPGA打上勾,并且這個(gè)比特流文件要絕對(duì)地址!!
4. PS通過(guò)AXI點(diǎn)亮PL端LED
這個(gè)就是PL與PS協(xié)同點(diǎn)燈了。
首先配置zynq ip核,PL部分保留,因?yàn)橛玫搅薃XI,另外MIO gpio都去掉。其余配置都一樣。添加AXI gpio IP核,并且設(shè)置寬度為4,最后Run connection Automation,加入其它必要組件,調(diào)整連線:
之后再綁定gpio_led管腳到四個(gè)LED上,綜合并生成bitstream文件,導(dǎo)入到SDK。
引用頭文件:XGpio.h
然后還是對(duì)引腳進(jìn)行初始化和設(shè)置工作模式:
XGpio_Initialize(&GpioOutput, XPAR_AXI_GPIO_0_DEVICE_ID); XGpio_SetDataDirection(&GpioOutput,1,0x0);//output XGpio_DiscreteWrite(&GpioOutput,1,0x0);
協(xié)同點(diǎn)燈還是要先下載比特流文件,在運(yùn)行SDK程序。
5. 總結(jié)
① 對(duì)MIO或EMIO gpio進(jìn)行操作,都屬于PS,引用xgpiops.h文件,對(duì)AXI_gpio引用xgpio.h
② 涉及PL引腳或操作時(shí),生成比特流文件并且導(dǎo)入SDK,運(yùn)行時(shí)先下載FPGA。
③ PL輸出信號(hào)綁定引腳。
-
FPGA
+關(guān)注
關(guān)注
1626文章
21678瀏覽量
602022 -
GPIO
+關(guān)注
關(guān)注
16文章
1196瀏覽量
51934 -
MIO
+關(guān)注
關(guān)注
0文章
12瀏覽量
8158 -
Vivado
+關(guān)注
關(guān)注
19文章
808瀏覽量
66349
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論