<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

如何在ZC706中實現千兆網配置?

FPGA之家 ? 來源:FPGA探索者 ? 作者:FPGA探索者 ? 2021-04-02 16:49 ? 次閱讀

(1)使用ZC706開發板測試PS端網口(Echo,lwIP協議棧);

(2)配合操作PL端LED(直接驅動和使用消息隊列兩種方式);

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

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

ZC706中,MAC 控制器與 PHY 通過 RGMII(Reduced Gigabit Media Independent Interface)接口進行連接,實現千兆網。

一、工程概述

1. 開發板配置

使用Xilinx ZYNQ開發板ZC706,默認配置ARM后即可使用PS端網口、串口和QSPI,放置AXI GPIO的IP核驅動PL端的4個LED。

1af00e94-92eb-11eb-8b86-12bb97331649.png

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

1b1d898c-92eb-11eb-8b86-12bb97331649.png

2. SDK程序

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

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

1b2e45b0-92eb-11eb-8b86-12bb97331649.png

1b7f340c-92eb-11eb-8b86-12bb97331649.png

新建完成后,即可進行最基礎的網絡通信了。這里注意,默認設置的是DCHP動態主機配置協議,需要開發板和電腦都連接到一個路由器上。如果直接使用網線連接開發板和電腦,則啟用 IPv4 協議,默認配置的IP地址為192.168.1.10,子網掩碼255.255.255.0,網關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 協議棧,支持IPv4、IPv6、TCP、UDP、DHCP等。

?IGMP 協議,用于網絡組管理,可以實現多播數據的接收

?Internet 協議(IP),包括 IPv4 和 IPv6,支持 IP 分片與重裝,包括通過多個網絡接口的數據包轉發

?用于網絡維護和調試的 Internet 控制消息協議(ICMP)

?用戶數據報協議(UDP)

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

?DNS,域名解析

?SNMP,簡單網絡管理協議

?動態主機配置協議(DHCP)

?以太網地址解析協議(ARP)

?AUTOIP,IP 地址自動配置

?PPP,點對點協議,支持

3. 網絡設置

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

1b8e8786-92eb-11eb-8b86-12bb97331649.png

1b9bdbfc-92eb-11eb-8b86-12bb97331649.png

4. 開啟監聽測試

使用SecureCRT軟件監聽,除此之外,使用其他網口助手也可以。

1ba996d4-92eb-11eb-8b86-12bb97331649.png

1bbd4eb8-92eb-11eb-8b86-12bb97331649.png

1bd8475e-92eb-11eb-8b86-12bb97331649.png

1bf0090c-92eb-11eb-8b86-12bb97331649.png

1c05c8dc-92eb-11eb-8b86-12bb97331649.png

二、工程測試

1. 測試Echo官方例程

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

1c347722-92eb-11eb-8b86-12bb97331649.png

在SecureCRT_CN界面輸入字符或字符串,回車,通過網口向開發板發送數據,開發板會返回同樣的數據,測試正確。

1c407914-92eb-11eb-8b86-12bb97331649.gif

2. 分析源碼

2.1 main函數

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

按照如下配置,調用了main_thread函數,不需要傳參(用0或NULL),堆棧大小由#define定義為1024,優先級為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函數

此函數中實現的功能如下:

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

(2)調用network_thread()創建線程;

(3)調用echo_application_thread()創建線程;

每500ms檢測一次DHCP是否成功,若成功則創建echo應用線程,如果10秒還沒有成功,則啟用IPv4,配置IP地址、子網掩碼和網關后,創建echo應用程序;創建成功后退出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函數

位置:echo.c文件。

(1)創建socket,綁定端口,監聽;

(2)調用process_echo_request函數創建線程;

此函數需要傳入參數。

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函數

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

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

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

(3)將接收到的數據發送出去;

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. 測試網口發送數據

由2.4可知,在process_echo_request函數中更改發送即可。新增一個字符數組:

char tx_buf[16]={‘H’,‘e’,‘l’,‘l’,‘o’,‘,’,‘W’,‘o’,‘r’,‘l’,‘d’,‘

’,‘

’};

在發送完接收到的數據后,新增一個發送函數,即可發送tx_buf數組,長度為16:

write(sd, tx_buf, 16);

1c712c4e-92eb-11eb-8b86-12bb97331649.png

4. 測試網口接收數據并控制LED

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

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

strncmp函數,字符串比較函數,字符串大小的比較以ASCII 碼表上的順序來決定。函數聲明為int strncmp ( const char * str1, const char * str2, size_t n ),把 str1 和 str2 進行比較,最多比較前 n 個字節,若str1與str2的前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’); }

1c7a59e0-92eb-11eb-8b86-12bb97331649.png

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

5.1 包含頭文件,聲明隊列

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

5.2 在main函數中創建消息隊列

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

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

5.3 在main函數中創建LED任務,接收隊列消息

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

其中,調用的prvPlLedTask定義如下,每次從隊列中讀取一個char類型的數據,若隊列為空則等待,若隊列不為空則讀出后控制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中添加發送隊列消息

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

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

1d086906-92eb-11eb-8b86-12bb97331649.gif

三、程序固化

1. 新建FSBL工程

1d8114b4-92eb-11eb-8b86-12bb97331649.png

2. 生成Boot鏡像文件

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

1db1d3d8-92eb-11eb-8b86-12bb97331649.png

3. 燒錄QSPI Flash

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

1de0b234-92eb-11eb-8b86-12bb97331649.png

4. 配置啟動模式

1df89fb6-92eb-11eb-8b86-12bb97331649.png

原文標題:ZC706千兆網測試(ZYNQ,FreeRTOS,Echo,lwIP,TCP,RGMII)

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    14

    文章

    7289

    瀏覽量

    87762
  • 開發板
    +關注

    關注

    25

    文章

    4575

    瀏覽量

    94978

原文標題:ZC706千兆網測試(ZYNQ,FreeRTOS,Echo,lwIP,TCP,RGMII)

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

收藏 人收藏

    評論

    相關推薦

    基于FPGA的千兆以太設計

    今天給大俠帶來基于FPGA的千兆以太設計,話不多說,上貨。 一、設計概述 由于設計比較復雜,本篇帶來設計流程以及設計思路,僅供各位大俠參考。 本篇通過管理數據輸入輸出MDIO配置
    發表于 06-10 16:44

    STM32H743ZIT6想要實現千兆口,需要外掛什么樣的PHY芯片?

    各位大佬,我想咨詢一個問題,關于STM32H743ZIT6想要實現千兆口,需要外掛什么樣的PHY芯片,謝謝
    發表于 05-31 07:59

    如何使用程序的PIN為RMII0配置以太?

    編碼,在 IfxGeth_PinMap.c 實現。 從 IDE 看來,它甚至沒有顯示配置。 手動配置后如下 但所有代碼都是在上述文件
    發表于 05-24 06:13

    請問STM32H7與千兆如何進行通訊?

    各位大佬,百兆口和千兆口能否直接進行連接實現通訊,千兆是否會自動降速匹配? 以前沒用過ST
    發表于 04-24 08:23

    請問STM32MP157如何測試千兆的帶寬?

    速度。 在與其連接的WINDOWS 10 PC 上用scp 向它發送文件和下載文件, 速度分別只有3.3MB/s 和3.1MB/s ,速度遠遠未達千兆應有的100MB/s 速度。 已經確信DK2
    發表于 04-12 06:16

    請問CUBEMX如何在middleware配置motorcontrol?

    各位大佬,CUBEMX如何在middleware配置motorcontrol??打開官方工程里面有motorcontrol,我打算自己新建工程,cubemx里面卻沒有motorcontrol??
    發表于 03-25 07:34

    何在code通過軟件實時配置各個PWM component的引腳?

    PWM component連接到P2.6 P3.0 P3.4 P3.6上,實現下一個功能。 那么請問,如何在code通過軟件實時配置各個PWM component的引腳?能否提供相應
    發表于 02-21 08:00

    何在aurix TC333微控制器配置內存分區?

    誰能建議如何在 aurix TC333 微控制器配置內存分區。
    發表于 01-30 07:10

    RKD706KV 數據表

    RKD706KV 數據表
    發表于 11-16 18:30 ?0次下載
    RKD<b class='flag-5'>706</b>KV 數據表

    ZC706千兆網測試(ZYNQ,FreeRTOS,Echo,lwIP,TCP,RGMII)

    ARM端配置如下圖所示,以5處的ARM-A9為核心,使用1處的UART1打印調試信息,使用2處的網口0進行以太網通信,使用3處的AXI GP(General Port)Master通用主設備接口連接PL端的AXI GPIO
    的頭像 發表于 10-16 16:43 ?1122次閱讀
    <b class='flag-5'>ZC706</b><b class='flag-5'>千兆</b>網測試(ZYNQ,FreeRTOS,Echo,lwIP,TCP,RGMII)

    千兆口rj45室外防雷保護方案

    千兆口rj45室外防雷保護方案
    發表于 10-09 06:38

    ISL706xRHEVAL1Z 用戶指南

    ISL706xRHEVAL1Z 用戶指南
    發表于 09-04 18:30 ?0次下載
    ISL<b class='flag-5'>706</b>xRHEVAL1Z 用戶指南

    是否有芯片支持千兆口?

    我有一個項目需要千兆口,不知道咱們是否有這樣的芯片。
    發表于 06-28 06:03

    ZC706評估板IBERT誤碼率測試和眼圖掃描

    IBERT(Integrated Bit ErrorRatio Tester,集成誤比特率測試工具),是Xilinx提供用于調試FPGA高速串行接口比特誤碼率性能的工具,最常用在GT高速串行收發器測試
    的頭像 發表于 06-21 11:29 ?2357次閱讀
    <b class='flag-5'>ZC706</b>評估板IBERT誤碼率測試和眼圖掃描

    ZC706千兆網測試

    ZC706中,MAC 控制器與 PHY 通過 RGMII(Reduced Gigabit Media Independent Interface)接口進行連接,實現千兆網。
    的頭像 發表于 06-21 10:03 ?1529次閱讀
    <b class='flag-5'>ZC706</b><b class='flag-5'>千兆</b>網測試
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>