FPGA

[FPGA] AXI FND Controller

썽우디 2021. 11. 18. 14:16

Editor : Vivado 2020.2

Editor : Xilinx Vitis 2020.2

FPGA Board : Cmod A7-35t (xc7a35tcpg236-1)

CPU Core : MicroBlaze (Xilinx 에서 제공하는 IP)


[ 요구 사항 ]

1) AXI 를 이용하여 FND Control IP 만들기

2) CPU Core : MicroBlaze

3) 입력 신호는 Vitis Editor 를 사용하여 Control

4) FND에 '1234' 출력 및 Counter 설계


1.  AXI 사용하기

  먼저, Vivado 에서 AXI 틀을 만들기

[ AXI_FND Control IP 구조 다이어그램 ]


[ AXI 생성 하기 ]

1) Tools > Create and Package New IP...

 

2) Next

 

3) Create a new AXI4 peripheral

 

4) AXI Name 설정 > Next

 

5) Interface Type : Lite , Number of Registers : 4 (Register 갯수는 필요에 따라 조절 4~512) > Next

 

6) Add IP to the repository > Finish

 

7) ip_repo 에 AXI IP가 저장된 것을 확인

 

8) 저장된 AXI IP를 불러오기

 

9) 구조 다이어그램을 참고하여 INPUT OUTPUT 설정 (꼭! //Users to add ports here //User ports ends 사이에 입력)

 

10) AXI register 확인

 

11) AXI register를 OUTPUT에 할당

 

12) AXI_FND Control OUTPUT 설정

 

13) 블록다이어그램 참고 wire 연결

 

14) 각각의 Module을 불러오고 Top module 설정

 

15) AXI top module(AXI_FND Control) 확인


이후에, AXI_FND_Control module 을 IP로 만든다

#참고 [FPGA] IP Package 하기

 

새로운 프로젝트를 생성하고 MicroBlaze CPU Core 을 올리고 AXI_FND_Control IP를 추가한다.

#참고 [FPGA] FPGA보드에 CPU Core 올리기

Bitstream 을 만들고 Vitis 을 이용해 입력신호를 제어하자!

 


2. Vitis 사용하기

 

1) Create Application Project

 

2) Next

 

3) Bitstream 한 .xsa 파일을 불러오기 > Next

 

4) Project Name 설정 > Next

 

5) Next

 

6) Hello World 설정( Src 에 platform 이 포함됨 ) > Finish

 

7) Hardware Specification ( BaseAddress 확인)

 

8) AXI_FND Base Address 확인 (0x44a00000)

 

9) helloworld.c 에서 Code 작성하기

 


3. Vitis Code

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "sleep.h"
#include "xil_io.h"

#define AXI_FND_BASEADDR	0x44A00000
#define AXI_FND_DIGIT1		AXI_FND_BASEADDR + 0x00
#define AXI_FND_DIGIT2		AXI_FND_BASEADDR + 0x04
#define AXI_FND_DIGIT3		AXI_FND_BASEADDR + 0x08
#define AXI_FND_DIGIT4		AXI_FND_BASEADDR + 0x0c

void fndWrite(u16 fndValue)
{
	Xil_Out32(AXI_FND_DIGIT1, fndValue % 10);
	Xil_Out32(AXI_FND_DIGIT2, fndValue / 10 % 10);
	Xil_Out32(AXI_FND_DIGIT3, fndValue / 100 % 10);
	Xil_Out32(AXI_FND_DIGIT4, fndValue / 1000 % 10);
}

int main()
{
    init_platform();

    print("Hello World\n\r");
    print("Successfully ran Hello World application");

    u16 data = 0;

    while(1)
    {
    	fndWrite(data);
    	data++;
    	if(data >= 10000) data = 0;
    	usleep(500000);
    }

    cleanup_platform();
    return 0;
}

4. 동작 영상 및 사진