Create Slave AXI Peripheral
testbench 같이 생성
testbench 구경
해석하기
AXI Custom 하기 - Edit in IP Packager
AXI Custom 하기
Customize 한 AXI 저장 - Merge changes from File Groups Wizard
Vivado Project Settings에서 IP Repository 경로 지정
#include <stdio.h>
#include "xparameters.h"
#include "xil_io.h"
int main()
{
short operand1, operand2;
int data, quit, operand;
printf("\n\nMultiplier_Test!!\n\r");
while (1)
{
printf("Please Enter Operand 1. \n\r");
scanf("%hd", &operand1);
printf("Please Enter Operand 2. \n\r");
scanf("%hd", &operand2);
operand = (operand1 << 16) | operand2;
// Write multiplier inputs to register ADDRESS 0
Xil_Out32((XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR), (u32)operand);
// Read multiplier outputs from register ADDRESS 4
data = Xil_In32((XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR) + 4);
printf("output=%d \n", data);
printf("Do you want to quit? (0: quit, 1: resume)\n");
scanf("%d", &quit);
if (!quit)
break;
}
printf("End of Test!!\n\n\r");
return 0;
}
사용자로부터 두 개의 피연산자를 입력받아 이를 곱하는 작업을 반복적으로 수행하는 프로그램입니다.
프로그램이 시작되면 "Multiplier_Test!!"라는 메시지를 출력합니다.
그 다음 무한 루프(while (1)
)가 시작되며, 이 루프는 사용자가 종료를 원할 때까지 계속됩니다.
루프 내에서는 먼저 "Please Enter Operand 1."이라는 메시지를 출력하고, 사용자로부터 첫 번째 피연산자를 입력받습니다.
그 다음 "Please Enter Operand 2."라는 메시지를 출력하고, 사용자로부터 두 번째 피연산자를 입력받습니다.
두 피연산자는 operand
라는 변수에 저장되며, 이 때 첫 번째 피연산자는 16비트 왼쪽으로 시프트되고 두 번째 피연산자와 비트 OR 연산이 수행됩니다.
operand
는 Xil_Out32
함수를 통해 특정 레지스터에 쓰여집니다. 이 함수는 FPGA와 같은 하드웨어 장치와 통신할 때 사용되며, 이 경우에는 곱셈 연산을 수행하는 하드웨어에 입력값을 제공하는 역할을 합니다.
그 다음 Xil_In32
함수를 통해 레지스터에서 결과값을 읽어옵니다. 이 함수 역시 FPGA와 같은 하드웨어 장치와 통신할 때 사용되며, 이 경우에는 곱셈 연산의 결과를 가져오는 역할을 합니다.
결과값은 "output=%d \n"
형식의 메시지로 출력됩니다.
그 다음 "Do you want to quit? (0: quit, 1: resume)\n"라는 메시지를 출력하고, 사용자로부터 종료 여부를 입력받습니다. 사용자가 0을 입력하면 quit 변수는 0이 되어 if (!quit) 조건이 참이 되고 루프가 종료됩니다.
루프가 종료되면 "End of Test!!\n\n\r"라는 메시지를 출력하고 프로그램이 종료됩니다.
xparameters.h
: 이 헤더 파일은 Xilinx의 자동화 도구인 Vivado HLS가 생성합니다. 이 파일은 FPGA 디자인에 포함된 모든 하드웨어 IP의 주소 및 설정 정보를 포함하고 있습니다. 예를 들어, XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR
는 Vivado HLS 도구가 생성한 특정 하드웨어 IP의 기본 주소를 나타냅니다.
xil_io.h
: 이 헤더 파일은 Xilinx의 라이브러리에서 제공하며, FPGA의 특정 주소에 데이터를 읽고 쓰는 기능을 제공합니다. Xil_Out32
와 Xil_In32
함수는 이 파일에서 정의됩니다. Xil_Out32
함수는 특정 주소에 32비트 데이터를 쓰는 역할을 하고, Xil_In32
함수는 특정 주소에서 32비트 데이터를 읽는 역할을 합니다.
%hd
:C 언어의 형식 지정자입니다. 이 형식 지정자는 printf
나 scanf
와 같은 함수에서 사용되며, short int
형식의 변수를 10진수 형태로 출력 또는 저장합니다.Xil_Out32()
함수Xilinx의 xil_io.h
헤더 파일에서 정의된 함수로, FPGA의 특정 메모리 주소에 32비트 데이터를 쓰는 역할을 합니다.
이 함수는 두 개의 매개변수를 받습니다.
첫 번째 매개변수는 데이터를 쓸 메모리 주소입니다. 이 주소는 xparameters.h
헤더 파일에서 정의된 상수를 통해 얻을 수 있습니다.
두 번째 매개변수는 쓸 데이터입니다. 이 데이터는 32비트 정수여야 합니다.
예를 들어, Xil_Out32((XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR), (u32)operand);
코드는 operand
의 값을 XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR
주소에 씁니다. 이 주소는 xparameters.h
에서 정의된 FPGA의 특정 하드웨어 IP의 기본 주소입니다.
Xil_In32()
함수Xilinx의 xil_io.h 헤더 파일에서 정의된 함수로, FPGA의 특정 메모리 주소에서 32비트 데이터를 읽는 역할을 합니다.
이 함수는 하나의 매개변수를 받습니다.
xparameters.h
헤더 파일에서 정의된 상수를 통해 얻을 수 있습니다.예를 들어, Xil_In32((XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR))
코드는 XPAR_MY_MULTIPLIER_V1_0_0_BASEADDR
주소에서 데이터를 읽습니다.
이 함수는 읽은 데이터를 반환합니다. 따라서 이 함수를 사용하여 FPGA의 특정 주소에서 데이터를 읽어 변수에 저장할 수 있습니다.