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

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

작성한 질문수

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

Block Memory Interface1 - 18

Xil_In 함수에 관해 질문이 있습니다.

작성

·

250

·

수정됨

0

안녕하세요, 해당 강의자료를 참고하여 c code를 작성하고 있습니다. 현재 제가 사용하고 있는 코드의 main 문은 다음과 같습니다.

int main()

{

u32 data;

u32 read_data;

init_platform();

xil_printf("[S/W BUILD]\t%s, %s\n\r",__DATE__, TIME);

xil_printf("[FPGA BUILD]\t%x \n\r",Xil_In32(FPGA_BUILD_ADDR));

xil_printf("--Starting SI5386 init Application--\n\r");

data = 0x00000000;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, data);

data = 0x00000101;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_STAT, data); // 0x0010

data = 0x00000101;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_EN, data); // 0x0018

data = 0x00093ee0;

data = 0x00023e06;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_TGT_SIZE, data); // 0x0020

data = 0x021c01e0;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PIC_SIZE, data); // 0x0024;

data = 0x000000c4;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PIC_FMT, data); // 0x0028

data = 0x00000000;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PROF, data); // 0x002c

data = 0x00000205;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_NL, data); // 0x0034

data = 0x00000001;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_MODE, data); // 0x0038

data = 0x00000001;

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, data); // 0x0000

usleep(50);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_STAT);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_EN);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_TGT_SIZE);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PIC_SIZE);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PIC_FMT);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_PROF);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_NL);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_MODE);

read_data = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD);

usleep(50);

cleanup_platform();

return 0;

}

다음과 같이 Xil_Out32 함수가 쭉 써지고, 각각의 메모리 주소에 대해 data를 write 합니다. 이후 해당 주소에 대한 데이터 값을 read 하는 과정에서, hardware에서 인식을 하지 못합니다.

위 사진과 같이, microblaze에서 data address가 첫번째 read 할 주소인 0x44a10004에서 멈춰있는 것을 확인할 수 있습니다.

axi쪽 I/F는 다음과 같습니다.

제 C code에서 Read 동작이 되지 않는 이유가 무엇일까요?

 

감사합니다.

답변 2

0

김동윤님의 프로필 이미지
김동윤
질문자

block design은 다음과 같습니다.
Master axi를 하나 더 추가하여(M04_AXI_0) port로 뺀 다음 rtl 상에서 모듈과 연결했습니다.

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

c 코드에 주소값들이 define 상수로 되어 있어서 어떤 값인지 난해하네요.
Xil_Out32(), Xil_In32() 함수 후에 printf 문을 추가하여 디버깅 메시지를 확인해 보시는 게 좋을 것 같네요.

예를 들면,

Xil_Out32(TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, data);

data = 0x00000101;

xil_printf("out_addr : %X, data : %X \n", TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, data);

 

read_data_1 = Xil_In32 (TMC_JXSE_BASE_ADDR + TMC_JXSE_INT_STAT);

xil_printf("out_addr : %X, data : %X \n", TMC_JXSE_BASE_ADDR + TMC_JXSE_ENC_CMD, read_data_1);

 

c 코드로 넘어 오면, printf 문으로 디버깅하는 것이 좋습니다.

그리고 함수 마지막에 while(1) ; 문을 추가해서 프로그램이 종료되는 것을 막는게 좋을 것 같습니다.

대충 보았을 때에는 특이한 문제가 보이지는 않습니다만,

M04_AX_0 를 추가하는 부분을 한번 더 확인해 보시길 바랍니다. 옵션이나 혹시 잘못된 부분이 있는지 확인해 보세요.

0

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

시스템 구성(Block Design)이 어떻게 구성되어 있는지 알 수 없는 상황에서
어떻게 답변을 드려야 할지 모르겠네요..

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

작성한 질문수

질문하기