[FPGA]/Zynq(MPSOC)2018. 4. 24. 04:52

Zynq UltraScale+ MPSoC 보드 테스트 - EtherCAT 테스트


Zynq UltraScale+ MPSoC 보드  EtherCAT 테스트 


Zynq UltraScale+ MPSoC 보드를 이용하여 EtherCAT 통신 테스트를 해보았다.

기존에 제작 하였던 EtherCAT Slave 보드를 이용하여 간단히 데이터 전송하는 예제로 테스트 했고 간단히 확인을 위해 패킷캡쳐 프로그램으로 전송되는 데이터를 확인했다. 


Wireshark 에서 Zynq UltraScale+ MPSoC의 EtherCAT 전송 데이터를 확인 할 수 있다.


Zynq MPSoC 에서 EtherCAT의 사용은 기본적인 테스트 결과 가능해 보인다. 물론 가장 기본 적인 테스트만 검토한 결과라 HOST쪽에서 좀더 많은 테스트가 필요할 것같다. 결론적으로 로봇쪽에서 Zynq MPSoC를 EtherCAT 제어용으로 사용한다면 검토 해볼만 할것 같다.


Zynq UltraScale+ MPSoC EtherCAT 테스트 기본 예제코드

int main(void)

{

struct netif *netif;

unsigned char test_buf[] = {1, 2};

unsigned int cnt = 0;

/* the mac address of the board. this should be unique per board */

unsigned char mac_ethernet_address[] = {

0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };


netif = &server_netif;

#if defined (__arm__) && !defined (ARMR5)

#if XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1 || \

XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1

ProgramSi5324();

ProgramSfpPhy();

#endif

#endif


/* Define this board specific macro in order perform PHY reset

 * on ZCU102

 */

#ifdef XPS_BOARD_ZCU102

IicPhyReset();

#endif


init_platform();


xil_printf("\r\n\r\n");

xil_printf("-----lwIP RAW Mode UDP Server Application-----\r\n");


/* initialize lwIP */

lwip_init();


/* Add network interface to the netif_list, and set it as default */

if (!xemac_add(netif, NULL, NULL, NULL, mac_ethernet_address,

PLATFORM_EMAC_BASEADDR)) {

xil_printf("Error adding N/W interface\r\n");

return -1;

}

netif_set_default(netif);


/* now enable interrupts */

platform_enable_interrupts();


/* specify that the network if is up */

netif_set_up(netif);


#if (LWIP_DHCP==1)

/* Create a new DHCP client for this interface.

 * Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at

 * the predefined regular intervals after starting the client.

 */

dhcp_start(netif);

dhcp_timoutcntr = 24;

while (((netif->ip_addr.addr) == 0) && (dhcp_timoutcntr > 0))

xemacif_input(netif);


if (dhcp_timoutcntr <= 0) {

if ((netif->ip_addr.addr) == 0) {

xil_printf("ERROR: DHCP request timed out\r\n");

assign_default_ip(&(netif->ip_addr),

&(netif->netmask), &(netif->gw));

}

}


/* print IP address, netmask and gateway */

#else

assign_default_ip(&(netif->ip_addr), &(netif->netmask), &(netif->gw));

#endif

print_ip_settings(&(netif->ip_addr), &(netif->netmask), &(netif->gw));


xil_printf("\r\n");


/* print app header */

print_app_header();


/* start the application*/

start_application();

xil_printf("\r\n");


g_netif = netif;


//low_level_input(g_netif);


while (1) {

//xemacif_input(netif);

ether_macraw_input(netif);

}


/* never reached */

cleanup_platform();


return 0;

}


Posted by nexp

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 23. 03:54

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - Giga Etherent UDP 테스트

Zynq UltraScale+ MPSoC 보드 테스트 - Giga Etherent UDP 테스트

 

TCP예제가 문제 없이 동작하므로 Giga Ethernet 통신은 확인이 되었고 EtherCAT 동작을 테스트 하기 위해 UDP통신도 문제 없이 동작하는지 확인해 볼 필요가 있다.

 

Zynq UltraScale+ MPSoC UDP 전송코드

static void udp_recv_perf_traffic(void *arg, struct udp_pcb *tpcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
int i;
unsigned char tcp_buf_rx[2048];

pcb->remote_ip = *addr;
pcb->remote_port = port;

    //수신 IP 시리얼로 출력
xil_printf("%d.%d.%d.%d\r\n",
                    (addr->addr)&0xFF, (addr->addr>>8)&0xFF,
                    (addr->addr>>16)&0xFF, (addr->addr>>24)&0xFF
          );


    //수신데이터 시리얼로 출력
    xil_printf("rx size = %d\r\n", p->len);

    for(i=0;ilen;i++)
    {
        //데이터 수신되면..
        //임시로 테스트 용으로 저장 -> 실제 제이터는 p->payload 에 있음
        tcp_buf_rx[i] = *((unsigned char*)p->payload+i);

        xil_printf("%x ", tcp_buf_rx[i]);
    }


udp_sendto(tpcb, p, addr, port);

xil_printf("UDP test passed Successfully\n\r");


pbuf_free(p);

}

Posted by nexp
TAG MPSoC, udp, ZYNQ

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 23. 03:54

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - Giga Etherent 전송 속도 테스트

Zynq UltraScale+ MPSoC 보드 테스트 - Giga Etherent TCP 전송 속도 테스트

 

 

Zynq UltraScale+ MPSoC 보드는 ZU2EG 가 적용되어 있고 Quad-core Cortex-A53 @1.5GHz CPU로 AP를 구동한다. Giga Ethernet을 이용한 EtherCAT 사용 검토가 필요해 Giga Ethernet 통신을 테스트 해보았다.

 

우선 TCP/IP 통신 테스트를 해보자.

기본 예제로 제공되는 lwIP 스택 TCP예제로 루프백 테스트를 해보면 좋을것 같다.

 

 

기본 제공 예제를 좀 수정해서 TCP루프백 테스트 해보니 96Mbps 정도가 나온다.

예전 EtherCAT 테스트용으로 제작했던 STM32F429 보드와 TCP속도 비교를 해보면 좋을것 같다.

(너무 예전이고 코어 자체가 비교가 안되지만..)

 

 

 


Zynq UltraScale+ MPSoC TCP/IP TCP 수정코드

 

 

err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
/* do not read the packet if we are not in ESTABLISHED state */
if (!p) {
tcp_close(tpcb);
tcp_recv(tpcb, NULL);
return ERR_OK;
}

/* indicate that the packet has been received */
tcp_recved(tpcb, p->len);

/* echo back the payload */
/* in this case, we assume that the payload is < TCP_SND_BUF */
if (tcp_sndbuf(tpcb) > p->len) {
err = tcp_write(tpcb, p->payload, p->len, 1);
} else
xil_printf("no space in tcp_sndbuf\n\r");

/* free the received pbuf */
pbuf_free(p);

return ERR_OK;
}

 

 

dhcp_start(echo_netif);
dhcp_timoutcntr = 24;

while(((echo_netif->ip_addr.addr) == 0) && (dhcp_timoutcntr > 0))
xemacif_input(echo_netif);

if (dhcp_timoutcntr <= 0) {
if ((echo_netif->ip_addr.addr) == 0) {
xil_printf("DHCP Timeout\r\n");
xil_printf("Configuring default IP of 192.168.1.10\r\n");
IP4_ADDR(&(echo_netif->ip_addr),  192, 168,   1, 10);
IP4_ADDR(&(echo_netif->netmask), 255, 255, 255,  0);
IP4_ADDR(&(echo_netif->gw),      192, 168,   1,  1);
}
} print_ip_settings(&ipaddr, &netmask, &gw);

#endif
/* start the application (web server, rxtest, txtest, etc..) */
start_application();

/* receive and process packets */
while (1) {
if (TcpFastTmrFlag) {
tcp_fasttmr();
TcpFastTmrFlag = 0;
}
if (TcpSlowTmrFlag) {
tcp_slowtmr();
TcpSlowTmrFlag = 0;
}
xemacif_input(echo_netif);
transfer_data();
}

 

 

Posted by nexp

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 21. 05:53

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - SDK테스트 Hello World

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - SDK테스트 Hello World

 

1) Launch SDK

Zynq UltraScale+ MPSoC 기본 하드웨어 디자인 으로 생성한 프로젝트 파일에서 Launch SDK 로 프로젝트 파일을 생성할 수 있다.

 

 

 

2)Project 생성

Vivado에서 여러가지 다양한 예제를 제공하고 있는데 기본 예제 Hello World 프로젝트를 생성해 보자

 

 

3)코드 작성및 프로그램 실행

기본 코드 생성되고 간단히 테스트를 위해 Delay 함수도 추가 해서 실행 해 보았다.

 

 

Zynq UltraScale+ MPSoC 보드의 UART에 연결해서 시리얼 포트로 출력되는 메시지를 확인하니 정상적으로 출력되는것으로 확인된다.

 

Posted by nexp

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 21. 05:53

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - 기본 하드웨어 디자인

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - 기본 하드웨어 디자인

 

보드가 나왔으니 테스트를 위해 새로운 프로젝트를 생성해 보자

Vivado 툴이 워낙 자주 업데이트 되고 복잡해서 테스트 과정을 정리할 필요가 있을것 같다.

 

 

1)프로젝트 생성

처음부터 새로운 MPSoC의 Board 파일을 생성할 수도 있지만 설정해 주어야 할것이 많기 때문에 기존 생성되어 있는 파일을 이용하고 변경 사항만 수정하는것이 좋을것 같다.

 

 

 

2)Create Block Design

 

 

 

 

3)IP 생성

Zynq UltraScale+ MPSoC IP를 추가 하자

 

 

4)PL 클럭 연결

PL클럭은 외부에서 연결 할 수도 있지만 내부클럭을 연결해 주면 간단히 테스트 해 볼 수 있다.

 

 

5)ZYNQ MPSoC 설정 - DDR4 메모리

기본 페리 및 DDR 메모리 설정은 보드마다 다를 수 있기 때문에 제작한 보드에 맞도록 설정해 준다. 특히 이번 보드는 노트북용 DDR메모리 이므로 제조사 마다 설정이 필요하다.

 

 

 

6)Generate Block Design

기본 설정이 완료 되었다면 Block Designd을 생성해 준다.

 

 

7)Export Hardware Design

하드웨어 설정 파일을 SDK에서 사용할 수 있도록 Export 해준다.

 

 

 

 

Posted by nexp

댓글을 달아 주세요