转发:ZYNQ基础系列(七) LWIP数据通路 -- PL数据->PS->PC机(TCP)

LWIP数据通路

实验准备:

基础概念
以太网MAC是一个基础模块,它使得我们可以实现一个TCP/IP协议栈,协议使得应用可以基于网络来通信。如果想要解析一个TCP/IP协议栈,需要了解以下层次:
• 第一层——物理层:(描述物理连接)主要由外部物理层芯片实现
• 第二层——数据链路层:(描述物理层上数据传输的途径)可以由PS的MAC实现
• 第三层——网络层:(描述不同网络间数据传输的途径)提供网络路由和寻址层,可以使IPv4或者IPv6
• 第四层——传输层:(提供终端用户间的数据传输)TCP
• 第五层——应用层:应用层操作数据
这里写图片描述
SDK开发环境包含一个轻量级的IP栈(lwIP),lwIP是个开源IP栈,在Zynq上的PS中有两个千兆以太网控制器,每个控制器都是可配置的,并且可以单独控制,千兆以太网控制器可以实现一个MAC(介质访问控制层)(数据链路层的组成之一),物理层主要是由外部的PHY芯片、电缆或光纤完成

应用和lwIP栈接口的主要方法:(详情参考XAPP1026)
  • Raw——没有操作系统时使用的基本API,基于事件驱动,使用lwIP的应用在该模式下在触发如接收数据等事件时调用相应的回调函数
  • Sockets——使用在运行操作系统的Zynq上,该方法使用到线程,应用使用它来和lwIP栈通信

实验目的:
PS通过AXI-GPIO核通知PL循环构造32bit位宽的0-1001的数据,写入FIFO,利用AXI-DMA核将FIFO中的数据读入到DDR中,PL每发完一次 0-1001,AXI-DMA核便会产生一个中断信号到PS,PS 得到中断信号后将 DDR3缓存的数据以乒乓操作的方式通过TCP协议发送至PC机

硬件环境搭建:

0.创建工程,创建原理图,调出PS的核等
1.根据实际硬件设置PS的相关参数
这里写图片描述
设置PS输入时钟频率,和输出到PL的频率
这里写图片描述
设置DDR型号
这里写图片描述
添加一个HP口
这里写图片描述
添加PL到PS的中断口
这里写图片描述
更改bank电压和网口引脚配置
这里写图片描述
添加串口用于调试
2.调出并配置AXI-GPIO的参数
这里写图片描述
3.调出并配置AXI-DMA的参数
这里写图片描述
只配置写通道
4.调出并配置AXI-FIFO的参数
这里写图片描述
直接设置为同步FIFO,输入宽度为32bit
5.创建数据生成逻辑模块

module ctrl(
input clk,
input rst,
input start,
input S_AXIS_tready,
output S_AXIS_tvalid,
output S_AXIS_tlast,
output [31:0] S_AXIS_tdata
);
reg S_AXIS_tvalid;
reg S_AXIS_tlast;
reg [31:0] S_AXIS_tdata;
reg [1:0] state;

always@(posedge clk) begin
  if(!rst) begin 
    S_AXIS_tvalid <= 1'b0;
    S_AXIS_tlast <= 1'b0;
    S_AXIS_tdata <= 32'd0;
    state <= 0;
  end
  else begin
    case(state) //状态机
    0: begin
      if(start&&S_AXIS_tready) begin //启动信号到来且FIFO可写
        S_AXIS_tvalid <= 1'b1;       //设置写FIFO有效
        state <= 1;
      end
      else begin
        S_AXIS_tvalid <= 1'b0;
        state <= 0;
      end
    end
    1:begin
      if(S_AXIS_tready) begin //FIFO可写
        S_AXIS_tdata <= S_AXIS_tdata + 32'b1;
        if(S_AXIS_tdata == 32'd1000) begin //判断是否结束
          S_AXIS_tlast <= 1'b1;//发送最后一个数据
          state <= 2;
        end
        else begin//等待数据发完
          S_AXIS_tlast <= 1'b0;
          state <= 1;
        end
      end
      else begin//等待FIFO可写
        S_AXIS_tdata <= S_AXIS_tdata;
        state <= 1;
      end
    end
    2:begin
      if(!S_AXIS_tready) begin //FIFO满则等待
        S_AXIS_tvalid <= 1'b1;
        S_AXIS_tlast <= 1'b1;
        S_AXIS_tdata <= S_AXIS_tdata;
        state <= 2;
      end
      else begin //写入结束
        S_AXIS_tvalid <= 1'b0;
        S_AXIS_tlast <= 1'b0;
        S_AXIS_tdata <= 16'd0;
        state <= 0;
      end
    end
    default: state <=0;
    endcase
  end
end
endmodule
   
     
     
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

6.向工程中添加ctrl模块,并拖拽到原理图中
这里写图片描述

7.连接模块
这里写图片描述
注意:上图中的AXI-DMA到PS的中断线忘记接了,导致SDK中找不到中断的ID,SDK报错
解决方案:在上图的基础上,将AXI-DMA中断输出信号连接至PS中断输入

8.进行以下操作后,生成bit文件
Gerate Output products、Create wrappers、Generate Bitstream、导出硬件、运行SDK

SDK环境搭建:

0.新建工程应用
1.设置BSP
这里写图片描述
添加LWIP库

2.设置LWIP库参数
这里写图片描述
设置为RAW模式裸机运行,上述两项写0
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
增大以上参数提高TCP传输效率

3.SDK的主要程序已上传至
https://gitee.com/long_fly/LWIP
大致分析:
main.c:对各设备和IP协议栈初始化,与服务器建立连接,通知PL产生数据并写到FIFO,在while循环中将PL产生的数据通过TCP发送给PC机
tcp_transmission.c:包含tcp的初始化函数、连接服务器成功的回调函数、和将DMA数据通过TCP发送给PC的函数,需要注意的是SEND_SIZE和PAKET_LENGTH是按照字节数算的,要不小于FIFO的一帧数据的字节数
dma_intr.c:DMA初始化和接收中断的处理函数
sys_intr.c:系统初始化函数
timer_intr.c:定时器初始化

4.实验测试
连上网线,设置电脑本地连接的属性
这里写图片描述
使用网络调试助手,设置为TCP服务器模式,IP填192.168.1.209(和上图一致),端口号为7(SDK中设置的目的端口),最后测速可达500多M带宽

本实验主要是通过LWIP大致的了解一下网络的相关知识,为之后的SFP万兆光网通信开路,本实验的IP协议栈是通过LWIP实现,数据链路层以PS的MAC为主实现,最后直接接到外部PHY物理层芯片,通过网络变压器连接水晶头,而之后要用的万兆光网通信需要用到PL中的10G MAC的IP核,然后连接至外部的SFP模块,IP协议栈可能要通过逻辑实现,之后会再夯实网络相关的基础知识

        
            

你可能感兴趣的:(转发:ZYNQ基础系列(七) LWIP数据通路 -- PL数据->PS->PC机(TCP))