0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ZC706千兆網(wǎng)測試(ZYNQ,F(xiàn)reeRTOS,Echo,lwIP,TCP,RGMII)

FPGA之家 ? 來源:FPGA之家 ? 2023-10-16 16:43 ? 次閱讀

(1)使用ZC706開發(fā)板測試PS端網(wǎng)口(EcholwIP協(xié)議棧;

(2)配合操作PLLED(直接驅(qū)動和使用消息隊列兩種方式)

(3)PS端串口UART打印調(diào)試信息;

(4)QSPI固化(Dual Quad SPI Parallel 8 bit模式)。

ZC706中,MAC 控制器 PHY 通過 RGMIIReduced Gigabit Media Independent Interface接口進行連接,實現(xiàn)千兆網(wǎng)。

一、工程概述

1.開發(fā)板配置

使用Xilinx ZYNQ開發(fā)板ZC706,默認配置ARM后即可使用PS端網(wǎng)口、串口和QSPI,放置AXI GPIOIP核驅(qū)動PL端的4LED。

9cd24384-6bf9-11ee-939d-92fbcf53809c.png

ARM端配置如下圖所示,以5處的ARM-A9為核心,使用1處的UART1打印調(diào)試信息,使用2處的網(wǎng)口0進行以太網(wǎng)通信,使用3處的AXI GPGeneral PortMaster通用主設備接口連接PL端的AXI GPIO,最后使用4處的QSPI固化程序,燒錄Boot文件。

9cf287a2-6bf9-11ee-939d-92fbcf53809c.png

2.SDK程序

上述工程綜合、布局布線并生成bit流后,導出硬件。

新建應用工程Application Project,選擇 OS Platform 平臺為 freertos10_xilinxVivadoSDK版本2018.2,低版本的可能是freertos9_xilinx),選擇Next,選中“FreeRTOS lwIP Echo Server”。

9cfe13c4-6bf9-11ee-939d-92fbcf53809c.png

9d0b1a92-6bf9-11ee-939d-92fbcf53809c.png

新建完成后,即可進行最基礎(chǔ)的網(wǎng)絡通信了。這里注意,默認設置的是DCHP動態(tài)主機配置協(xié)議,需要開發(fā)板和電腦都連接到一個路由器上。如果直接使用網(wǎng)線連接開發(fā)板和電腦,則啟用IPv4協(xié)議,默認配置的IP地址為192.168.1.10,子網(wǎng)掩碼255.255.255.0,網(wǎng)關(guān)196.128.1.1,如果想要更改默認配置,可以在main.c文件的main_thread()主線程中修改,如下所示:

xil_printf("ERROR: DHCP request timed out
");  
xil_printf("Configuring default IP of 192.168.1.10
");  
IP4_ADDR(&(server_netif.ip_addr),  192, 168, 1, 10);  
IP4_ADDR(&(server_netif.netmask), 255, 255, 255,  0);    
IP4_ADDR(&(server_netif.gw),  192, 168, 1, 1);    

LWIP 是一個小型開源的 TCP/IP 協(xié)議棧,支持IPv4IPv6、TCPUDP、DHCP等。

?IGMP 協(xié)議,用于網(wǎng)絡組管理,可以實現(xiàn)多播數(shù)據(jù)的接收

?Internet 協(xié)議(IP),包括 IPv4 IPv6,支持 IP 分片與重裝,包括通過多個網(wǎng)絡接口的數(shù)據(jù)包轉(zhuǎn)發(fā)

?用于網(wǎng)絡維護和調(diào)試的 Internet 控制消息協(xié)議(ICMP

?用戶數(shù)據(jù)報協(xié)議(UDP

?傳輸控制協(xié)議(TCP)擁塞控制,往返時間(RTT)估計,快速恢復和重傳

?DNS,域名解析

?SNMP,簡單網(wǎng)絡管理協(xié)議

?動態(tài)主機配置協(xié)議(DHCP

?以太網(wǎng)地址解析協(xié)議(ARP

?AUTOIPIP 地址自動配置

?PPP,點對點協(xié)議,支持

3.網(wǎng)絡設置

使用網(wǎng)線直接連接ZC706開發(fā)板和計算機網(wǎng)口,配置計算機IP地址為192.168.1.11,子網(wǎng)掩碼255.255.255.0,網(wǎng)關(guān)192.168.1.1,其中IP地址的最后一處可以更改為其他值,但是不能和開發(fā)板的相同。

9d1da720-6bf9-11ee-939d-92fbcf53809c.png

9d31f2a2-6bf9-11ee-939d-92fbcf53809c.png

4.開啟監(jiān)聽測試

使用SecureCRT軟件監(jiān)聽,除此之外,使用其他網(wǎng)口助手也可以。

9d4b79de-6bf9-11ee-939d-92fbcf53809c.png

9d691c00-6bf9-11ee-939d-92fbcf53809c.png

9d749b2a-6bf9-11ee-939d-92fbcf53809c.png

9d846168-6bf9-11ee-939d-92fbcf53809c.png

9d945f32-6bf9-11ee-939d-92fbcf53809c.png

二、工程測試

1.測試Echo官方例程

先打開串口,波特率115200,下載官方例程到ZC706開發(fā)板,連接SecureCRT_CN,初始化工程中串口打印信息如下:配置DCHP動態(tài)主機協(xié)議超時,自動轉(zhuǎn)為IPv4,將板子的IP地址配置為192.168.1.10,子網(wǎng)掩碼255.255.255.0,網(wǎng)關(guān)192.168.1.1,使用端口7

9dab0fde-6bf9-11ee-939d-92fbcf53809c.png

SecureCRT_CN界面輸入字符或字符串,回車,通過網(wǎng)口向開發(fā)板發(fā)送數(shù)據(jù),開發(fā)板會返回同樣的數(shù)據(jù),測試正確。

9db24f4c-6bf9-11ee-939d-92fbcf53809c.gif

2.分析源碼

2.1 main函數(shù)

打開main.c文件,找到main()函數(shù)。在main函數(shù)中創(chuàng)建了一個線程,傳入的參數(shù)依次為線程名(調(diào)試用)、函數(shù)指針、函數(shù)需要的參數(shù)、需要的堆棧大小、優(yōu)先級

按照如下配置,調(diào)用了main_thread函數(shù),不需要傳參(用0NULL),堆棧大小由#define定義為1024,優(yōu)先級為2。

int main()    
{        
  sys_thread_new("main_thrd", (void(*)(void*))main_thread, 0,      
                  THREAD_STACKSIZE,      
                  DEFAULT_THREAD_PRIO);      
  vTaskStartScheduler();    
  while(1);    
  return 0;    
}    

2.2 main_thread函數(shù)

此函數(shù)中實現(xiàn)的功能如下:

(1)初始化lwip協(xié)議棧;lwip_init();

(2)調(diào)用network_thread()創(chuàng)建線程;

(3)調(diào)用echo_application_thread()創(chuàng)建線程;

500ms檢測一次DHCP是否成功,若成功則創(chuàng)建echo應用線程,如果10秒還沒有成功,則啟用IPv4,配置IP地址、子網(wǎng)掩碼和網(wǎng)關(guān)后,創(chuàng)建echo應用程序;創(chuàng)建成功后退出while,配置完成;

while (1) {      
  vTaskDelay(DHCP_FINE_TIMER_MSECS / portTICK_RATE_MS);        
  if (server_netif.ip_addr.addr) {        
    xil_printf("DHCP request success
");      
    print_ip_settings(&(server_netif.ip_addr), &(server_netif.netmask), &(server_netif.gw));      
    print_echo_app_header();          
    xil_printf("
");    
    sys_thread_new("echod", echo_application_thread, 0,    
    THREAD_STACKSIZE,    
    DEFAULT_THREAD_PRIO);    
    break;    
}
  mscnt += DHCP_FINE_TIMER_MSECS;      
  if (mscnt >= 10000) {    
    xil_printf("ERROR: DHCP request timed out
");    
    xil_printf("Configuring default IP of 192.168.1.10
");    
    IP4_ADDR(&(server_netif.ip_addr),  192, 168, 1, 10);    
    IP4_ADDR(&(server_netif.netmask), 255, 255, 255,  0);    
    IP4_ADDR(&(server_netif.gw),  192, 168, 1, 1);    
    print_ip_settings(&(server_netif.ip_addr), &(server_netif.netmask), &(server_netif.gw));      
    /* print all application headers */    
    xil_printf("
");      
    xil_printf("%20s %6s %s
", "Server", "Port", "Connect With..");    
    xil_printf("%20s %6s %s
", "--------------------", "------", "--------------------");      


    print_echo_app_header();    
    xil_printf("
");    
    sys_thread_new("echod", echo_application_thread, 0,    
    THREAD_STACKSIZE,    
    DEFAULT_THREAD_PRIO);    
    break;    
  }    
}  

2.3 echo_application_thread函數(shù)

位置:echo.c文件。

1)創(chuàng)建socket,綁定端口,監(jiān)聽;

2)調(diào)用process_echo_request函數(shù)創(chuàng)建線程;

此函數(shù)需要傳入?yún)?shù)。

while (1) {  
  if ((new_sd = lwip_accept(sock, (struct sockaddr *)&remote, (socklen_t *)&size)) > 0) {  
      sys_thread_new("echos",       
process_echo_request,
                    (void*)new_sd,  
                    THREAD_STACKSIZE,  
                    DEFAULT_THREAD_PRIO);  
  }    
}

2.4 process_echo_request函數(shù)

位置:echo.c文件,用戶需要注意的最重要的函數(shù),發(fā)送和接收的移植全部在這個函數(shù)

1)接收數(shù)據(jù),最大數(shù)據(jù)長度2048,char類型,存儲在recv_buff數(shù)組中,若接收出錯,打印錯誤信息并退出while

2)若接收到的數(shù)據(jù)的前4個字符為quit,則退出while

3)將接收到的數(shù)據(jù)發(fā)送出去;

void process_echo_request(void *p)    
{    
  int sd = (int)p;    
  int RECV_BUF_SIZE = 2048;    
  char recv_buf[RECV_BUF_SIZE];    
  int n, nwrote;    


  while (1) {    
    /* read a max of RECV_BUF_SIZE bytes from socket */    
    if ((n = read(sd, recv_buf, RECV_BUF_SIZE)) < 0) {    
      xil_printf("%s: error reading from socket %d, closing socket
", __FUNCTION__, sd);    
      break;    
    }    


    /* break if the recved message = "quit" */    
    if (!strncmp(recv_buf, "quit", 4))    
      break;    


    /* break if client closed connection */    
    if (n <= 0)    
      break;    


    /* handle request */    
    if ((nwrote = write(sd, recv_buf, n)) < 0) {      
      xil_printf("%s: ERROR responding to client echo request. received = %d, written = %d
",    
          __FUNCTION__, n, nwrote);      
      xil_printf("Closing socket %d
", sd);    
      break;    
    }  
  }  


  /* close connection */   
  close(sd);     
  vTaskDelete(NULL);   
}

3.測試網(wǎng)口發(fā)送數(shù)據(jù)

2.4可知,在process_echo_request函數(shù)中更改發(fā)送即可。新增一個字符數(shù)組:

char tx_buf[16]={'H','e','l','l','o',',','W','o','r','l','d','
','
'}; 

在發(fā)送完接收到的數(shù)據(jù)后,新增一個發(fā)送函數(shù),即可發(fā)送tx_buf數(shù)組,長度為16

write(sd, tx_buf, 16);   

9dbde708-6bf9-11ee-939d-92fbcf53809c.png

4.測試網(wǎng)口接收數(shù)據(jù)并控制LED

在向開發(fā)板發(fā)送數(shù)據(jù)時,規(guī)定一組特殊數(shù)據(jù),如“l(fā)ed0”“l(fā)ed5”、“l(fā)ed8”等,前3個字符“l(fā)ed”用于指示這部分數(shù)據(jù)是用于控制LED的,第4個字符表示點亮組合,四個LED使用二進制編碼數(shù)據(jù)為0~15,注意,這里發(fā)送的是ASCII字符,在控制LED時需處理成數(shù)字(減 ’0’。

接收到數(shù)據(jù)后,仿照函數(shù)中對quit字符串的處理方式,新增一個處理,將接收到的字符串與字符串“l(fā)ed”比較,如果收到的字符串的前3個字符是“l(fā)ed”,則使用第4個字符控制LED的亮滅。

strncmp函數(shù),字符串比較函數(shù),字符串大小的比較以ASCII 碼表上的順序來決定。函數(shù)聲明為int strncmp ( const char * str1, const char * str2, size_t n ),把 str1 str2 進行比較,最多比較前n個字節(jié),若str1str2的前n個字符相同,則返回0;若s1大于s2,則返回大于0的值;若s1 小于s2,則返回小于0的值。

if (!strncmp(recv_buf, "led", 3)) { 
  XGpio_DiscreteWrite(&Gpio_Led, 1, recv_buf[3]-'0'); 
  xil_printf("Led Value =  %d
", recv_buf[3]-'0'); 
} 

9dcbde4e-6bf9-11ee-939d-92fbcf53809c.png

9dda076c-6bf9-11ee-939d-92fbcf53809c.png

5.測試LED任務及消息隊列

5.1 包含頭文件,聲明隊列

#include "FreeRTOS.h"  
#include "task.h"  
#include "queue.h"  
#include "timers.h"  
QueueHandle_t xQueue = NULL;

5.2 main函數(shù)中創(chuàng)建消息隊列

傳入兩個參數(shù),分別為隊列長度和隊列中每個元素的長度,xQueueCreate(1,1)表示隊列長度為1,隊列中的每個元素時一個char類型數(shù)據(jù),xQueueCreate(2,15)表示隊列長度為2,每個元素都是一個char[15]類型的字符數(shù)組。

xQueue = xQueueCreate(1,1);  
/* Check the queue was created. 檢查隊列是否創(chuàng)建成功*/  
configASSERT( xQueue );

5.3 main函數(shù)中創(chuàng)建LED任務,接收隊列消息

xTaskCreate( prvPlLedTask,  
            ( const char * ) "PL Led",  
            configMINIMAL_STACK_SIZE,  
            NULL,  
            tskIDLE_PRIORITY + 1,  
            NULL);

其中,調(diào)用的prvPlLedTask定義如下,每次從隊列中讀取一個char類型的數(shù)據(jù),若隊列為空則等待,若隊列不為空則讀出后控制LED,注意這里的rece_led_value一定要加取地址符號&,表示傳入指針,否則出錯。

static void prvPlLedTask( void *pvParameters )  
{  
  const TickType_t x1second = pdMS_TO_TICKS( DELAY_1_SECOND );  
  char rece_led_value;  


  for( ;; )  
  {  
    xil_printf( "PL LED task
" );  
    xQueueReceive( xQueue,  /* The queue being read. */  
          &rece_led_value,  /* Data is read into this address. */  
          portMAX_DELAY );  /* 延時 */  


    xil_printf( "PL LED task
" );  
  xil_printf("rece_led_value=%d
",rece_led_value-'0');  
  XGpio_DiscreteWrite(&Gpio_Led, 1, rece_led_value-'0');  


  /* Delay for 1 second. */  
  vTaskDelay( x1second );  
  }  
}

5.4 process_echo_request中添加發(fā)送隊列消息

若滿足條件,則將對LED的控制信息寫入隊列,注意要加取地址符號&

if (!strncmp(recv_buf, "led", 3)) {  
  xQueueSend(xQueue,  
              &recv_buf[3],  
              0UL );  
}

9df085f0-6bf9-11ee-939d-92fbcf53809c.gif

9e0b9548-6bf9-11ee-939d-92fbcf53809c.png

三、程序固化

1.新建FSBL工程

9e14d540-6bf9-11ee-939d-92fbcf53809c.png

2.生成Boot鏡像文件

生成工程后,右鍵“Create Boot Image,依次添加FSBL工程的elf(默認已添加)、工程的bit文件(默認已添加)、需固化的程序elfAdd找到路徑添加),“Create Image”。

9e2959de-6bf9-11ee-939d-92fbcf53809c.png

3.燒錄QSPI Flash

選擇Image和FSBL的路徑,對Flash,一定選擇“qspi_dual_parallel,若選擇“qspi_single”也能下載成功,但是無法加載,ZC706板載指示燈亮紅燈。

9e475222-6bf9-11ee-939d-92fbcf53809c.png

4.配置啟動模式

9e6405ca-6bf9-11ee-939d-92fbcf53809c.png

9e6fd56c-6bf9-11ee-939d-92fbcf53809c.png


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9009

    瀏覽量

    366113
  • Zynq
    +關(guān)注

    關(guān)注

    9

    文章

    607

    瀏覽量

    47082
  • 千兆網(wǎng)
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    9557

原文標題:ZC706千兆網(wǎng)測試(ZYNQ,F(xiàn)reeRTOS,Echo,lwIP,TCP,RGMII)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何使用Vitis自帶的LWIP模板進行PS端千兆以太網(wǎng)TCP通信?

    開發(fā)板有兩路千兆以太網(wǎng),通過RGMII接口連接,本實驗演示如何使用Vitis自帶的LWIP模板進行PS端千兆以太
    的頭像 發(fā)表于 04-28 10:44 ?2619次閱讀
    如何使用Vitis自帶的<b class='flag-5'>LWIP</b>模板進行PS端<b class='flag-5'>千兆</b>以太<b class='flag-5'>網(wǎng)</b><b class='flag-5'>TCP</b>通信?

    Vivado板文件找不到ZC706

    嗨,我正在使用Vivado 2018.2并擁有ZC706評估套件。啟動一個新項目我在板文件中找不到ZC706??纯碈:\ Xilinx \ Vivado \ 2018.2 \ data
    發(fā)表于 01-03 11:17

    PL DDR是否在ZC706 cachealbe中?

    嗨, 我想知道連接到ZC706板上Zynq的PL部分的外部DDR RAM是否為cachealbe。如果是可緩存的,是否需要任何配置?請幫忙。謝謝。以上來自于谷歌翻譯以下為原文Hi,I want
    發(fā)表于 03-21 16:56

    是否有可能在ZC706上關(guān)閉DDR并仍能加載lwIP?

    是否有可能在ZC706上關(guān)閉DDR并仍能加載lwIP?我將lwIP mem_size配置為0,將pbuf_pool_size配置為16,然后我就可以構(gòu)建一個帶有庫的Hello World應用程序
    發(fā)表于 04-25 11:12

    ZC706開發(fā)板的SI5324配置方法

    ZC706開發(fā)板上的SI5324需要通過I2C配置,官網(wǎng)找了一圈,只有VC709和KC705的例程,都是基于MICROBLAZE的,改到ZC706上問題也不大,準備動手這際,轉(zhuǎn)念一想,何不
    發(fā)表于 07-05 08:22

    為什么zc706的速度等級會有不同?

    大家好?Afaik,zc706的速度等級為-2 soc。(是的,我手中有zc706板。我檢查它的速度等級-2 soc在板上)但是當我在planAhead或xps上選擇zc706時,部件號為
    發(fā)表于 09-04 08:22

    哪里可以找到Zynq 7000 Zc706 ISE設計套件項目?

    大家好,我在ISE設計套件中找不到使用Board Zynq 7000 ZC706的任何手冊。以前我只使用過Digilent Nexys-2 Board。因此,我很難啟動Zynq板的使用。你能給我一些建議嗎?非常感謝。
    發(fā)表于 09-17 09:55

    如何使用Zynq Zc706板作為fpga板?

    我有zc706板,我想用這塊板作為FPGA板。我不想用SDK編程我的板我只需要編寫一個verilog代碼并將此代碼發(fā)送到Zynq的PL部分是可以只使用沒有SDK或Petalinux的Zynq的PL部分。即使有可能你能建議我一些教
    發(fā)表于 10-10 09:01

    Vivado 2016.1無法在ZC706中運行?

    你好,我們今天剛剛收到一個ZC706開發(fā)套件(帶有Zynq XC7Z045),我們非常驚訝,因為在歡迎信中寫道:“隨著Vivado 2015.4的發(fā)布,該產(chǎn)品已被凍結(jié)。它將不會在后來的Vivado軟件中運行”這應該是什么意思?我們正在使用最新的Vivado版本2016.1
    發(fā)表于 10-10 08:24

    vivado Zynq zc706板上使用SFP模塊做4.25Gbps怎么實現(xiàn)?

    大家好, 我想在vivado Zynq zc706板上使用SFP模塊做4.25Gbps。你能指導我嗎?
    發(fā)表于 05-22 09:20

    Zynq-7000 AP SoC ZC706評估套件的特點與應用

    觀看Zynq-7000 AP SoC ZC706評估套件,這是一款基于收發(fā)器的套件,包含所有必需的硬件,工具和IP,可快速完成對基于收發(fā)器的嵌入式系統(tǒng)的評估和開發(fā)。 董事會給出了
    的頭像 發(fā)表于 11-20 06:03 ?5648次閱讀

    如何在ZC706中實現(xiàn)千兆網(wǎng)配置?

    (1)使用ZC706開發(fā)板測試PS端網(wǎng)口(Echo,lwIP協(xié)議棧); (2)配合操作PL端LED(直接驅(qū)動和使用消息隊列兩種方式); (3
    的頭像 發(fā)表于 04-02 16:49 ?3687次閱讀
    如何在<b class='flag-5'>ZC706</b>中實現(xiàn)<b class='flag-5'>千兆</b><b class='flag-5'>網(wǎng)</b>配置?

    Zynq-7000全可編程SoC ZC706評估套件(ISE Design Suite 14.5)入門指南

    Zynq-7000全可編程SoC ZC706評估套件(ISE Design Suite 14.5)入門指南
    發(fā)表于 05-19 14:20 ?20次下載
    <b class='flag-5'>Zynq</b>-7000全可編程SoC <b class='flag-5'>ZC706</b>評估套件(ISE Design Suite 14.5)入門指南

    ADC-FMC插入器&Xilinx ZC706參考設計

    ADC-FMC插入器&Xilinx ZC706參考設計
    發(fā)表于 05-21 20:37 ?11次下載
    ADC-FMC插入器&Xilinx <b class='flag-5'>ZC706</b>參考設計

    ZC706千兆網(wǎng)測試

    ZC706中,MAC 控制器與 PHY 通過 RGMII(Reduced Gigabit Media Independent Interface)接口進行連接,實現(xiàn)千兆網(wǎng)。
    的頭像 發(fā)表于 06-21 10:03 ?1835次閱讀
    <b class='flag-5'>ZC706</b><b class='flag-5'>千兆</b><b class='flag-5'>網(wǎng)</b><b class='flag-5'>測試</b>