Administrator
发布于 2026-08-19 / 3 阅读
0
0

XCVU9P点灯(1)

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如下图:

image-iKVn.png

重点注意:

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

image-lXyE.png

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;
}

评论