XCVU9P点灯(1)
因为要配置SI5381,这里考虑先跑个microblaze
引脚分配:
GPIO[0] = SI5381_SCLK V14
GPIO[1] = SI5381_SDA_SDIO W14
GPIO[2] = SI5381_A0_CSb R16
GPIO[3] = SI5381_A1_SDO W15
GPIO[4] = SI5381_RSTN AA12
GPIO[5] = SI5381_INTRN U12
GPIO[6] = LED0 L36
GPIO[7] = LED1 M38
LED0-3是从上往下数的,都是低电平点亮
Block Design如下图:

重点注意:
- mdm_1的Debug_SYS_Rst是输出,要连接到mb_debug_sys_rst的mb_debug_sys_rst,然后PSR的复位输入,如果前面有个小圆圈的,说明是低有效,用常量输入要给高,不然一直在被复位,下载不了软件。

AXI_GPIO使用三态
先把BD创建HDL_wrapper。顶层模块使用startup时钟先跑起来,这个不在bd里,只能用原语例化。
module top(
inout wire [7:0] SI5381_GPIO_LED
);
wire sys_clk;
wire startup_clk_raw;
wire endofstart; //启动好后拉高
microblaze_wrapper u_microblaze_wrapper(
.GPIO0_tri_io ( SI5381_GPIO_LED ),
.sys_clk ( sys_clk )
);
// 内部RC配置时钟 CFGMCLK = 65MHz
// =========================================================
// STARTUPE3 内部配置时钟
// =========================================================
STARTUPE3 #(
.PROG_USR("FALSE"),
.SIM_CCLK_FREQ(0.0)
)
STARTUPE3_inst (
.CFGMCLK(startup_clk_raw),
.CFGCLK(),
.DI(),
.EOS(endofstart),
.PREQ(),
.DO(4'b0),
.DTS(4'b0),
.FCSBO(1'b0),
.FCSBTS(1'b0),
.GSR(1'b0),
.GTS(1'b0),
.KEYCLEARB(1'b0),
.PACK(1'b0),
.USRCCLKO(1'b0),
.USRCCLKTS(1'b1),
.USRDONEO(1'b0),
.USRDONETS(1'b1)
);
BUFG u_cfgmclk_bufg (
.I(startup_clk_raw),
.O(sys_clk)
);
endmodule
C代码部分不难,先点个灯:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
#include "xparameters.h"
#include "xgpio.h"
int blink();
int main()
{
init_platform();
print("Hello World\n\r");
print("Successfully ran Hello World application");
blink();
cleanup_platform();
return 0;
}
int blink()
{
XGpio gpio;
int status;
u32 value = 0x80;
xil_printf("AXI GPIO test start\r\n");
status = XGpio_Initialize(&gpio, XPAR_AXI_GPIO_0_BASEADDR);
if (status != XST_SUCCESS) {
xil_printf("GPIO init failed\r\n");
return -1;
}
// Channel 1
// bit = 0 表示输出
// bit = 1 表示输入
//
XGpio_SetDataDirection(&gpio, 1, 0x3f);//00111111
while (1)
{
value ^= 0xC0; // 翻转 bit6,7
XGpio_DiscreteWrite(&gpio, 1, value);
// xil_printf("GPIO0 = %d\r\n",
// (value & 0xC0) ? 1 : 0);
usleep(100000);
}
return 0;
}