1. 程式人生 > >轉發:ZYNQ基礎系列(七) LWIP資料通路 -- PL資料->PS->PC機(TCP)

轉發: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>