1. 程式人生 > >FPGA千兆網系列2-----UDP傳送與接收

FPGA千兆網系列2-----UDP傳送與接收

文章目錄

開發環境

  • 小梅哥AC6102開發板(內含RTL8211E千兆乙太網phy晶片)
  • quartus prime17.1
  • win10
  • 千兆網絡卡 這個需要電腦支援,不支援就玩不了了
  • udp協議介紹請參考我之前寫的udp和arp
  • 本例項支援udp的傳送與接收
  • 支援arp的傳送和接收

系統框圖

在這裡插入圖片描述

傳送

本例項支援傳送3種包

  • 傳送udp包,s3_in是外部按鍵,按下時為低,鬆開為高。當s3_in被按下時,經過udp_debounce濾波,會輸出一個udp_wr訊號給generate_data模組,當udp_wr為低時,generate_data就會每隔1s產生1024個數據,並寫入到wfifo中,當wfifo中的資料到達1024個時,也就是wfifo_wrusedw >= 1024時,auto_read_write模組就會產生一個udp_tx訊號。然後通知eth_mac_send去傳送一個udp包。
    auto_read_write產生udp_tx程式碼如下:
//tx_en
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        tx_en   <=  1'b0;
    end
    else if(wfifo_wrusedw >= 'd1024)begin
        tx_en   <=  1'b1;
    end
    else begin
        tx_en   <=  1'b0;
    end
end

//tx_en_r
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        tx_en_r <=  1'b0;
    end
    else begin
        tx_en_r <=  tx_en;
    end
end

assign  udp_tx      =   tx_en && (~tx_en_r);
  • 傳送arp請求包
    當s2_in被按下時,會經過arp_debounce模組,並且在你鬆手時,產生一個高脈衝arp_req_tx訊號,(注意arp_debounce和udp_debounce模組功能是不一樣的,具體的自己看看程式碼就知道了),然後再通知eth_mac_send去傳送一個arp請求包。
    arp_debounce產生arp_req_tx程式碼如下:
//對低電平期間的高脈衝進行濾波
//cnt
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= cnt;  
        else
            cnt <= cnt + 1;
    end
    else begin
        cnt <=  0;
    end
end

assign  add_cnt     =       key_r[2] == 1'b0;       
assign  end_cnt     =       add_cnt && cnt == TIME_10US-1;   

//end_cnt_r
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        end_cnt_r   <=  1'b0;
    end
    else begin
        end_cnt_r   <=  end_cnt;
    end
end

//捕獲下降沿  這個訊號會接到eth_mac_send的arp_req_tx上
assign  key_out     =   (~end_cnt) && end_cnt_r;
  • 傳送arp應答包,當pc向fpga傳送arp請求包時,eth_receive模組會解析接收到的資料,這個模組目前只支援udp和arp的解析,當其將資料解析為arp請求包時,就會產生一個arp_ack_tx訊號給eth_mac_send,並通知他傳送一個arp應答包。
    eth_receive產生arp_ack_tx程式碼如下:
//arp_ack_tx
always  @(posedge clk or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        arp_ack_tx  <=  1'b0;
    end
    else if((state_c == CRC) && end_cnt && opcode_req && arp_src_ip_ok)begin
        arp_ack_tx  <=  1'b1;
    end
    else begin
        arp_ack_tx  <=  1'b0;
    end
end

接收

接收模組為eth_receive,目前只支援udp和arp兩種協議

  • UDP,當解析資料為udp時,會產生cmd_flag和cmd_data兩個訊號,cmd_flag與udp包中的資料對齊,cmd_data就是udp的資料匯流排。
    使用網路除錯助手向fpga傳送1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9,一共18個數據(如果不足18個數據,會自動補0到18位為止)。

在這裡插入圖片描述
signaltap捕獲的波形:
在這裡插入圖片描述

  • ARP請求,當解析為arp請求時,會產生arp_ack_tx訊號。
    為了使pc能傳送arp請求包給fpga,我們可以先把arp表清空。arp -d:清空arp表指令。
    arp
    可以看出192.168.0.3介面下已經沒有192.168.0.2的資訊了,這個時候我們再拿網路除錯助手向fpga傳送udp包時,因為arp表被清空,所以他會先發一個arp的請求包,然後才再發udp包(因為網路除錯助手發不了arp包,我就想到了這個辦法,哈哈,有知道怎麼直接發arp包的可以在下面評論留言一下),順便拿wireshark看一下到底發了什麼包。
    在這裡插入圖片描述
    在這裡插入圖片描述
    可以看出網路助手先發了一個arp的請求包,然後fpga響應了,產生了arp_ack_tx訊號,通知eth_mac_send發arp應答包給pc,這時pc的arp表就會把fpga的ip地址和mac地址對應上
    在這裡插入圖片描述
    知道了fpga的ip地址和mac後,他接著又發了udp包。
  • ARP應答,當fpga向pc傳送了arp請求時,pc也會響應,並且傳送arp應答包給fpga,我設計這個功能,是因為每個pc的mac地址都不一樣,我們就自己向pc傳送arp請求包,然後再解析pc發的arp應答包,並把pc的mac地址給獲取,用於以後傳送udp包。所以這個主要目的是獲取pc的mac地址。
  • 在這裡插入圖片描述

總結

本例項可以用於資料的傳輸,只需要把資料一直往generate_data模組中寫即可,它自動將資料通過udp傳送給pc。所以再稍微封裝一下就可以當成一個udp的ip核了。過幾天還會有個實際的例子,網路攝像頭專案,後續有時間的話,還會在攝像頭的接觸上增加一點影象處理,比如sobel運算元。

福利

專案工程下載連結:

相關推薦

FPGA系列2-----UDP傳送接收

文章目錄開發環境系統框圖傳送接收總結福利 開發環境 小梅哥AC6102開發板(內含RTL8211E千兆乙太網phy晶片) quartus prime17.1 win10 千兆網絡卡 這個需要電腦支援,不支援就玩不了了 udp協議介紹請參考我之前寫的udp和ar

FPGAUDP協議實現

技術 pga 進程 linux class inf fin font spa 上一篇百兆網接口的設計與使用,我們接著來進行FPGA百兆網UDP(User Datagram Protocol)協議的設計。 1)UDP簡介 在此,參考博主夜雨翛然的博文“https://w

Tor釋出洋蔥絡可進行傳送接收檔案OnionShare 2

img 提醒 郵件 圖片 macos process fff win sage Tor項目釋出了可以使用Tor洋蔥網絡傳送與接收檔案的OnionShare 2,官方提到,OnionShare與其他電子郵件以及雲端硬盤的傳文件方法不同,沒有任何第三方能夠存取OnionShar

CentOS 7下的KVM卡配置為

mode org network pre color pan 配置 strong 替換 在KVM下可以生成兩種型號的網卡,RTL8139和E1000,其實應該是底層生成不同芯片的網卡,而不是附帶宿主機網卡是什麽型號就是什麽型號的,其中默認為100兆網卡,即RTL8319的螃

絡卡如何才能達到全速

1000Mb網絡卡如何才能跑滿,跑到100%? 作者:趙磊 部落格:http://elf8848.iteye.com 千兆網絡卡理論最大傳輸速度是(1024Mbit/s=128MByte/s),注意b與B差了8倍。 要想達到最大傳輸速度要滿足三個條件 : 1

LINUX絡卡(設定絡卡速度及模式)

http://blog.chinaunix.net/uid-23381466-id-58878.html Ethtool是用於查詢及設定網絡卡引數的命令。 概要: ethtool ethX    //查詢ethX網口基本設定 ethtool –h        //顯示

Linux下絡卡和萬絡卡ethtool對比

[[email protected] ~]# ethtool em3 Settings for em3:         Supported ports: [ TP ]         Su

卡的傳輸速度

tps 服務 交換 占用cpu時間 www byte 1.5 自帶 隨著 千兆光纖網卡為1000Mbit/s網卡,最大傳輸速度能達到1000Mbit秒,只能提供一種固定傳輸速度,不能實現10/100/1000M自適應。千兆網卡多用於服務器,以便提供服務器與交換機之間的高速連

PCI卡和PCI Express

之間 性能 2.0 很快 程序 解碼 alt ext nag 千兆網卡按總線接口標準分為PCI千兆網卡和PCI Express千兆網卡。 PCI網卡,即PCI插槽的網卡。是工作在數據鏈路層的網路組件,是局域網中連接計算機和傳輸介質的接口,不僅能實現與局域網傳輸介質之間的物理

intel芯片雙口

bubuko 虛擬機 rss 網絡連接 多個 連接 qos功能 分享圖片 包括 intel芯片雙口千兆網卡 飛邁瑞克(femrice)可提供intel芯片千兆網卡,千兆網卡最大傳輸速度能達到1000Mbit秒,多用於服務器,提供服務器與交換機之間的高速連接,提高網絡傳輸速度

Spark入門實戰系列--2.Spark編譯部署(中)--Hadoop編譯安裝

二進制包 1.10 不能 mapr 修復 att 機器 mave end 【註】該系列文章以及使用到安裝包/測試數據 能夠在《[傾情大奉送–Spark入門實戰系列] (http://blog.csdn.net/yirenboy/article/deta

用C寫一個UDP傳送接收程式

1、UDP網路程式設計主要流程 UDP協議的程式設計框架,客戶端和伺服器之間的差別在於伺服器必須使用bind()函式來繫結偵聽的本地UDP埠,而客戶端則可以不進行繫結,直接傳送到伺服器地址的某個埠地址。框圖如圖1.3所示 UDP協議的伺服器端流程 伺服器流程主要分為下述6個部分,即建立套

【linux c】簡單UDP應用,資料傳送接收

主要函式: 接收recvfrom()     ssize_t recvfrom (int sockfd, void *buf, size_t len, int flags, stru

Python TCP伺服器/客戶端+UDP傳送端/接收

''' socketserver ''' import time import socket import socketserver class RequestHandler(socketserver.StreamRequestHandler): def handle(self):

通過UDP傳送接收資料包

傳送端: package net.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.Da

絡卡如何傳送接收資料包

 IP報文可以看作一個包。     Linux網絡卡驅動程式,將IP包新增14位元組的MAC包頭,構成MAC包。     MAC包中含有傳送端和接收端的MAC地址資訊。既然是驅動程式建立的MAC包頭資訊,當然可以隨便輸入地址資訊的,主機偽裝就是這麼實現的。    

STM32 HAL庫學習(四) SPI查詢傳送接收

又是花了兩天時間調SPI......細心細心還是需要細心啊,還是用的上次的SPI Flash晶片mx25l04600E,主要是測試晶片的初始化和讀取晶片ID是否成功。 STM32F070晶片只有一個SPI,但可用作SPI訊號管腳的引腳卻不只一組,建議通訊前先連線MOSI和MISO測試自發自收是否

RabbitMQ的學習(二):簡單的java demo實現RabbitMQ的傳送接收

通過第一章已經很輕鬆地實現了RabbitMQ的安裝和啟動,第二章開始最簡單的java demo學習,一層一層深入瞭解RabbitMQ的牛逼之處,期間肯定也會碰到很多問題,這些問題,將會收集起來,最後面去解決同時也會寫相關的文章。 一、專案相關jar包匯入: 新建一個maven工程,p

JSON傳送接收(java)

var xmlHttp;function createXMLHttpRequest() {    if(window.XMLHttpRequest) {        xmlHttp = new XMLHttpRequest();    }    else if(window.ActiveXObject) {

JSON傳送接收

var xmlHttp;function createXMLHttpRequest() {    if(window.XMLHttpRequest) {        xmlHttp = new XMLHttpRequest();    }    else if(window.ActiveXObject) {