작성
·
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@ihil.co.kr or jungatk@naver.com)로 보내주시길 바랍니다.
확인해 보고 답변드리도록 하겠습니다.
감사합니다 ~!!