轉發: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;
[email protected](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;
[email protected](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>