[FPGA] AXI FND Controller
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. 동작 영상 및 사진