인프런 커뮤니티 질문&답변

김동윤님의 프로필 이미지
김동윤

작성한 질문수

Verilog FPGA Program 2 (MicroBlaze, Arty A7-35T)

Block Memory Interface1 - 18

Block Memory Interface 응용

작성

·

183

0

안녕하세요, 해당 강의 10강 block memory interface 부분을 응용하여 프로젝트를 진행하고 있습니다.

제가 목표로 하는 것은 microblaze - axi interconnect - AXI AHBLite Bridge 로 이어지는 Block design 후, microblaze의 내부 메모리에 data를 저장하여 write / read 동작을 시켜 ahb bus를 사용하는 외부 ip에 시스템을 연결하려 합니다.

현재 block design 구성 및 address 설정은 다음과 같습니다.

아래 코드는 제가 write 동작을 위해 작성한 vitis에 c code입니다.

#include <stdio.h>

#include "platform.h"

#include "xil_printf.h"

#include "xil_io.h"

#include "xil_types.h" // added on 20240411 by dykim

#include <unistd.h>

#define XPAR_M_AHB_0_BASEADDR 0x44A10000 // added by DYKIM on 20240326

#define TMC_JXSE_BASE_ADDR (XPAR_M_AHB_0_BASEADDR + 4) // added by DYKIM on 20240326

#define TMC_JXSE_ENC_CMD 0x0000 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_SRST 0x0004 // added by DYKIM on 20240326

#define TMC_JXSE_INT_STAT 0x0010 // added by DYKIM on 20240326

#define TMC_JXSE_INT_RAW 0x0014 // added by DYKIM on 20240326

#define TMC_JXSE_INT_EN 0x0018 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_TGT_SIZE 0x0020 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_PIC_SIZE 0x0024 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_PIC_FMT 0x0028 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_PROF 0x002C // added by DYKIM on 20240326

#define TMC_JXSE_ENC_NL 0x0034 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_MODE 0x0038 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_WGT_SET 0x003C // added by DYKIM on 20240326

#define TMC_JXSE_ENC_ERR_INFO0 0x0040 // added by DYKIM on 20240326

#define TMC_JXSE_ENC_ERR_MASK0 0x0044 // added by DYKIM on 20240326

typedef unsigned short u2;

typedef unsigned short u1;

void SI5386_init (u32 ID) ;

 

void AHB_Out32 (u32 address, u32 data, u2 trans, u1 write);

u32 AHB_In32 (u32 address, u2 trans, u1 write);

void AHB_RegWrite (u32 address, u32 value, u2 trans, u1 write);

u32 AHB_RegRead (u32 address, u2 trans, u1 write);

int main()

{

init_platform();

SI5386_init(0);

SI5386_init(1);

// print("Hello World\n\r");

// print("Successfully ran Hello World application");

cleanup_platform();

return 0;

}

void AHB_RegWrite (u32 address, u32 value, u2 trans, u1 write){

u32 data;

u2 htrans;

u1 we;

data = 0x00000000;

htrans = 2;

we = 1;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, data, htrans, we);

data = 0x00000101;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_STAT, data, htrans, we); // 0x0010

data = 0x00000101;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_EN, data, htrans, we); // 0x0018

data = 0x00093ee0;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_TGT_SIZE, data, htrans, we); // 0x0020

data = 0x021c0780;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PIC_SIZE, data, htrans, we); // 0x0024

data = 0x00000084;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PIC_FMT, data, htrans, we); // 0x0028

data = 0x00000000;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PROF, data, htrans, we); // 0x002c

data = 0x00000205;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_NL, data, htrans, we); // 0x0034

data = 0x00000001;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_MODE, data, htrans, we); // 0x0038

data = 0x00000001;

AHB_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, data, htrans, we); // 0x0000

usleep(3000);

}

void AHB_Out32(u32 address, u32 data, u2 trans, u1 write)

{

if (trans == 2 && write == 1) Xil_Out32(address, data);

}

위 코드에서, trans나 write 변수는 axi ahblite bridge의 output 신호로 둔 것인데 이를 어떻게 c code로 컨트롤 해야할 지 감이 잡히지 않습니다.

이후 보드에 프로그램을 올려 ILA 결과를 확인해보니 아래와 같이 입력으로 준 Ready 신호만 들어오는 것을 확인했습니다.

긴 내용에 죄송스럽습니다.

현재 해당 문제에 대해 혼자 해결해야 하는 문제라 정말 막막하고 어렵습니다. 제가 어느 부분에서 잘못되었는지 알려주시면 정말 감사하겠습니다.

답변 1

0

alex님의 프로필 이미지
alex
지식공유자

안녕하세요.

코드를 압축해서 (프로젝트 파일 전체) 메일(alex@ihil.co.kr or jungatk@naver.com)로 보내주시길 바랍니다.

확인해 보고 답변드리도록 하겠습니다.

감사합니다 ~!!

김동윤님의 프로필 이미지
김동윤

작성한 질문수

질문하기