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

    文章

    8129

    浏览量

    93051
  • 开发板
    +关注

    关注

    25

    文章

    6122

    浏览量

    113145

原文标题:ZC706千兆网测试(ZYNQ,FreeRTOS,Echo,lwIP,TCP,RGMII)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    何在VS code配置Zephyr集成开发环境

    上一篇文章介绍了如何在VS code中使用瑞萨官方插件为RA芯片创建项目与项目调试,相信大家对RA在VS code的开发有了基础的了解。
    的头像 发表于 11-05 14:46 1049次阅读
    如<b class='flag-5'>何在</b>VS code<b class='flag-5'>中</b><b class='flag-5'>配置</b>Zephyr集成开发环境

    基于LAN9646六端口千兆以太交换机的技术解析与应用

    Microchip Technology LAN9646六端口千兆位以太交换机是一款完全集成的托管第2层、六端口千兆位以太交换机,具有高级特性。Microchip Technolo
    的头像 发表于 09-30 11:02 865次阅读
    基于LAN9646六端口<b class='flag-5'>千兆</b>以太<b class='flag-5'>网</b>交换机的技术解析与应用

    何在 Keil rvmdk 开发环境启用可配置的数据闪存并设置大小?

    何在 Keil rvmdk 开发环境启用可配置的数据闪存并设置大小?
    发表于 08-26 08:18

    何在 IAR Embedded Workbench for ARM 开发环境启用可配置数据闪存并设置大小?

    何在 IAR Embedded Workbench for ARM 开发环境启用可配置数据闪存并设置大小?
    发表于 08-26 07:49

    请问如何在 Keil rvmdk 开发环境启用可配置的数据闪存并设置大小?

    何在 Keil rvmdk 开发环境启用可配置的数据闪存并设置大小?
    发表于 08-20 06:46

    何在多显卡环境下配置OLLAMA实现GPU负载均衡

    本文将带你深入了解如何在多显卡环境下配置OLLAMA,实现GPU负载均衡,并分享生产环境的最佳实践。无论你是刚接触GPU集群还是寻求性能优化的老手,这篇文章都能给你带来实用价值。
    的头像 发表于 07-24 14:12 2704次阅读

    Texas Instruments LM706x0/LM706x0-Q1降压转换器数据手册

    。LM706x0/LM706x0-Q1低I~Q~ 、宽V~IN~ 同步降压转换器采用峰值电流模式控制架构,可轻松实现环路补偿、快速瞬态响应以及出色的负载和线路调节。可将一对LM706A
    的头像 发表于 07-17 14:28 573次阅读
    Texas Instruments LM<b class='flag-5'>706</b>x0/LM<b class='flag-5'>706</b>x0-Q1降压转换器数据手册

    飞凌嵌入式ElfBoard ELF 1板卡-uboot配置详解

    :zmx25_defconfigzynq_microzed_defconfigzynq_picozed_defconfigzynq_zc702_defconfigzynq_zc706_defconfigzynq_zc770_xm010_defconfigzynq_zc770_xm011_defconfigzynq_zc77
    发表于 05-22 11:14

    何在EZ-USB SX3配置实用程序配置它的设置?

    SX3 UVC(CYUSB3017)是否可以使用图像传感器接口以非整数帧速率(如 29.97fps)传输 UVC 视频? 如何在 EZ-USB SX3 配置实用程序配置它的设置?
    发表于 05-15 06:25

    何在Linux配置DNS服务器

    本文详细介绍了如何在Linux配置DNS服务器,包括DNS工作原理、本地缓存、DNS查询过程,以及正向和反向查询的配置。步骤包括服务器配置
    的头像 发表于 05-09 13:38 2268次阅读
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中</b><b class='flag-5'>配置</b>DNS服务器

    cat8线支持千兆

    CAT8线支持千兆网络,并且其性能远超千兆网络的需求。 网线外皮上通常会印有“CAT5”、“CAT5E”、“CAT6”、“CAT6A”、“CAT7”或“CAT8”等字样,这些标识分别代表不同的网线
    的头像 发表于 02-20 09:39 1184次阅读

    hyper v 显卡,hyper-v显卡:如何在虚拟机配置和优化显卡性能

    :如何在虚拟机配置和优化显卡性能。    在虚拟化环境,显卡性能对于需要高图形处理能力的应用场景(如游戏、图形设计和视频编辑)至关重要。Hyper-V提供了多种显卡
    的头像 发表于 01-24 14:19 1w次阅读
    hyper v 显卡,hyper-v显卡:如<b class='flag-5'>何在</b>虚拟机<b class='flag-5'>中</b><b class='flag-5'>配置</b>和优化显卡性能

    AN-0970: 使用ADuC706x微控制器实现RTD接口和线性化

    电子发烧友网站提供《AN-0970: 使用ADuC706x微控制器实现RTD接口和线性化.pdf》资料免费下载
    发表于 01-14 16:00 1次下载
    AN-0970: 使用ADuC<b class='flag-5'>706</b>x微控制器<b class='flag-5'>实现</b>RTD接口和线性化

    utpcat5e网线支持千兆

    速率足以满足千兆以太的需求。 应用场景:由于千兆网络在家庭和办公室网络环境中越来越普及,UTP CAT-5e网线因其较高的传输速率和较好的抗干扰能力,在这些环境得到了广泛应用。 一
    的头像 发表于 12-12 10:39 4916次阅读

    CBM706P 电压监控微处理器监控电路

    CBM706P、CBM706R、CBM706S、 CBM706T 和 CBM708R、 CBM708S、 CBM708T 系列微处理器监控电路适用于 3V 或 3.3V 电压监控。CB
    发表于 12-06 14:08 1次下载