开发板环境:vivado 2017.4 ,开发板型号xc7z020clg400-1,这个工程主要介绍怎样将gpio_mo做为输入口使用
工程链接:百度网盘 请输入提取码 密码:glpq
从这个ug585手册可以看到gpio_mio主要分布在这个Bank0 和Bank1上。这里主要介绍gpio_mio暂时不介绍gpio_emio
这个Bank0主要是mio0~mio31
Bank1主要是mio31~mio53
这里继续介绍gpio_mio做为输入要涉及到的寄存器
这个DIRAM_0主要设置gpio_mio的mio0~mio31的输入输出设置:设为0为输入、设置为1为输出
这个DIRAM_1主要设置gpio_mio的mio32~mio53的输入输出设置:设为0为输入、设置为1为输出
既然我们设置为输入,那么输入的数据必定有存储的寄存器,下面我来看下这些存储器
这个DATA_0_RO主要存储这个mio0~mio31的输入数据,这个是一个32位的寄存器,寄存器的偏移地址是0x00000060
这个DATA_1_RO主要存储这个mio32~mio53的输入数据,这个是一个22位的寄存器,寄存器的偏移地址是0x00000064
我们一般对一个寄存器进行写一般是:
Xil_Out32(基地址+偏移地址,数据)
比如对这个0x00000244进行写:Xil_Out32(0xE000A000 + 0x00000244,0x00)对这个0x00000244寄存器写入数据0x00,这里的基地址是0xE000A000
一般对一个寄存器进行读:
data = Xil_In32(基地址+偏移地址)
比如对这个0x00000064进行读:data = Xil_In32(0xE000A000 + 0x00000064)
硬件设置
因z-turn开发板的mio50上面接了一个开关,所以主要接收这个管脚的输入值
从这个图可以看出没有按开关输入为1,按下开关输入为0
Step1 新建vivado 工程,我这里选择了SD卡和uart
勾选gpio_mio
我们前面勾选了这个SD和uart使用了MIO40~MIO45、MIO48~MIO49
我们可以看到下面的gpio_mio中没有这个MIO40~MIO45和MIO48~MIO49,这个mio和gpio_mio是不能同时使用的,
也就是说当你使用这个mio48那么你在gpio_mio中就无法再使用这个gpio_mio48这两个是互斥的,gpio_mio说得
简单点就是将mio的管脚拿过来做为gpio_mio使用。
设置sd时钟为50M
设置DDR型号(不同的开发板有差异)
最后按照这个截图进行连接就可以了
Step2 进行综合、生成顶层文件、生成bit文件
顶层文件如下图所示
//Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
//--------------------------------------------------------------------------------
//Tool Version: Vivado v.2017.4 (win64) Build 2086221 Fri Dec 15 20:55:39 MST 2017
//Date : Fri Aug 31 19:22:18 2018
//Host : taowei running 64-bit Service Pack 1 (build 7601)
//Command : generate_target design_1_wrapper.bd
//Design : design_1_wrapper
//Purpose : IP block netlist
//--------------------------------------------------------------------------------
`timescale 1 ps / 1 ps
module design_1_wrapper
(DDR_addr,
DDR_ba,
DDR_cas_n,
DDR_ck_n,
DDR_ck_p,
DDR_cke,
DDR_cs_n,
DDR_dm,
DDR_dq,
DDR_dqs_n,
DDR_dqs_p,
DDR_odt,
DDR_ras_n,
DDR_reset_n,
DDR_we_n,
FIXED_IO_ddr_vrn,
FIXED_IO_ddr_vrp,
FIXED_IO_mio,
FIXED_IO_ps_clk,
FIXED_IO_ps_porb,
FIXED_IO_ps_srstb);
inout [14:0]DDR_addr;
inout [2:0]DDR_ba;
inout DDR_cas_n;
inout DDR_ck_n;
inout DDR_ck_p;
inout DDR_cke;
inout DDR_cs_n;
inout [3:0]DDR_dm;
inout [31:0]DDR_dq;
inout [3:0]DDR_dqs_n;
inout [3:0]DDR_dqs_p;
inout DDR_odt;
inout DDR_ras_n;
inout DDR_reset_n;
inout DDR_we_n;
inout FIXED_IO_ddr_vrn;
inout FIXED_IO_ddr_vrp;
inout [53:0]FIXED_IO_mio;
inout FIXED_IO_ps_clk;
inout FIXED_IO_ps_porb;
inout FIXED_IO_ps_srstb;
wire [14:0]DDR_addr;
wire [2:0]DDR_ba;
wire DDR_cas_n;
wire DDR_ck_n;
wire DDR_ck_p;
wire DDR_cke;
wire DDR_cs_n;
wire [3:0]DDR_dm;
wire [31:0]DDR_dq;
wire [3:0]DDR_dqs_n;
wire [3:0]DDR_dqs_p;
wire DDR_odt;
wire DDR_ras_n;
wire DDR_reset_n;
wire DDR_we_n;
wire FIXED_IO_ddr_vrn;
wire FIXED_IO_ddr_vrp;
wire [53:0]FIXED_IO_mio;
wire FIXED_IO_ps_clk;
wire FIXED_IO_ps_porb;
wire FIXED_IO_ps_srstb;
design_1 design_1_i
(.DDR_addr(DDR_addr),
.DDR_ba(DDR_ba),
.DDR_cas_n(DDR_cas_n),
.DDR_ck_n(DDR_ck_n),
.DDR_ck_p(DDR_ck_p),
.DDR_cke(DDR_cke),
.DDR_cs_n(DDR_cs_n),
.DDR_dm(DDR_dm),
.DDR_dq(DDR_dq),
.DDR_dqs_n(DDR_dqs_n),
.DDR_dqs_p(DDR_dqs_p),
.DDR_odt(DDR_odt),
.DDR_ras_n(DDR_ras_n),
.DDR_reset_n(DDR_reset_n),
.DDR_we_n(DDR_we_n),
.FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
.FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
.FIXED_IO_mio(FIXED_IO_mio),
.FIXED_IO_ps_clk(FIXED_IO_ps_clk),
.FIXED_IO_ps_porb(FIXED_IO_ps_porb),
.FIXED_IO_ps_srstb(FIXED_IO_ps_srstb));
endmodule
Step3 导出硬件配置、打开SDK
Step4 新建一个fsbl、新建一个gpio_mio工程
hello_world模板
工程代码
/******************************************************************************
*
* Copyright (C) 2009 - 2014 Xilinx, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/
/*
* helloworld.c: simple test application
*
* This application configures UART 16550 to baud rate 9600.
* PS7 UART (Zynq) is not initialized by this application, since
* bootrom/bsp configures it to baud rate 115200
*
* ------------------------------------------------
* | UART TYPE BAUD RATE |
* ------------------------------------------------
* uartns550 9600
* uartlite Configurable only in HW design
* ps7_uart 115200 (configured by bootrom/bsp)
*/
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "sleep.h"
#define Base_Address 0xE000A000
#define DIRM_0 0x00000204 //mio0~mio31
#define DIRM_1 0x00000244 //mio32~mio53
#define DATA_0_RO 0x00000060 //mio0~mio31 data
#define DATA_1_RO 0x00000064 //mio32~mio53 data
int main()
{
u32 rxdb1;
u32 rxdb2;
Xil_Out32(Base_Address + DIRM_1,0x00); //模式设置:设置mio32~mio53为输入 (0为输入 1为输出)
while(1)
{
rxdb1 = Xil_In32(Base_Address + DATA_1_RO); //接收mio32~mio53的输入数据(22位数据)
rxdb2 = (rxdb1 & 0x040000) ; //只取这个mio50的数据
xil_printf("rxdb2 = %08x\n\r",rxdb2); //打印mio50的输出数据
sleep(1);
}
}
生成BOOT.bin文件后将BOOT.bin文件拷贝到SD卡运行,运行结果如下图所示
这里是rxdb1的输出数据,可能大家会奇怪这个mio32~mio53输入数据为什么不全为0,因开发板的ps端的mio都接入了不同的设备,而这些设备上电后有的设备是高电平、有的设备是低电平所以输入值不全为0
我们再来看下rxdb2的输出,rxdb2是直接接收的mio50的值也就是按键的值,这个是没有按按键的输出
这个是按了按键的输出,按了按键输入变成0了,然后松开后又为高了