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协议栈可能要通过逻辑实现,之后会再夯实网络相关的基础知识
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>
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协议栈可能要通过逻辑实现,之后会再夯实网络相关的基础知识
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>