基于FPGA实现的自适应三速以太网

news/2024/5/18 13:38:24 标签: fpga开发, udp, 网络协议

一、三速以太网

千兆以太网PHY芯片是适配百兆和十兆的,十兆就不管了,我们的设计只适应千兆和百兆。
在这里插入图片描述
根据上图,我们是可以获取当前主机网口的速率信息的。

always@(posedge w_rxc_bufr)
begin
    if(w_rec_valid == 'd0) begin
        ro_speed <= w_rec_data[2:1];
        ro_link  <= w_rec_data[0];
    end else begin
        ro_speed <= ro_speed;
        ro_link  <= ro_link ;
    end
end

千兆网的设计我们前面的章节介绍的很详细了,至于百兆,主要区别就在于时钟速率从125Mhz变为了25Mhz,双沿采样变为单沿采样,所以我们只需要在ODDR和IDDR使用的时候注意单沿问题即可。
对于接收数据而言,上下沿采样到的数据是一样的,也就是说一次收到的数据高四位和低四位一样,完整的8bit数据需要前一拍数据后一拍数据拼接

always@(posedge w_rxc_bufr)
begin
    if(i_speed1000)
        ro_rec_data <= w_rec_data;
    else 
        ro_rec_data <= {w_rec_data[3:0],ro_rec_data[7:4]};
end

对于发送数据而言,r_tx_cnt_10_100信号是1bit的,不断在01变化,相当于一个时钟指示信号,通过这样的方式实现单沿传输,一个时钟只传输4bit,在下一个时钟再去传输延迟一拍数据的高4bit,这是因为用户进来的数据是8bit的。

genvar txd_i;
generate for(txd_i = 0 ;txd_i < 4 ; txd_i = txd_i + 1)
begin
    assign w_send_d1[txd_i] = i_speed1000 ? i_send_data[txd_i]     :  
                              r_tx_cnt_10_100 == 0 ? i_send_data[txd_i] : ri_send_data[txd_i + 4];

    assign w_send_d2[txd_i] = i_speed1000 ? i_send_data[txd_i + 4] : 
                              r_tx_cnt_10_100 == 0 ? i_send_data[txd_i] : ri_send_data[txd_i + 4];

    ODDR #(
        .DDR_CLK_EDGE    ("OPPOSITE_EDGE"       ),
        .INIT            (1'b0                  ),
        .SRTYPE          ("SYNC"                ) 
    ) 
    ODDR_u 
    (
        .Q               (o_txd[txd_i]          ),  
        .C               (w_txc                 ),
        .CE              (1                     ),
        .D1              (w_send_d1[txd_i]      ),    
        .D2              (w_send_d2[txd_i]      ),    
        .R               (0                     ),
        .S               (0                     ) 
    );
end
endgenerate

二、上板效果

网口速率在这里更改
在这里插入图片描述
wireshark抓包和网络调试助手回环检测,一切正常

在这里插入图片描述
VIVADO上板通过ILA抓包:数据与发送数据一致
注:JTAG进行抓信号时,ILA频率要大于JTAG频率2.5倍,对于千兆而言不用管,但是抓百兆数据信号时,要调整一下JTAG的时钟频率!!

在这里插入图片描述


http://www.niftyadmin.cn/n/5451319.html

相关文章

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现一

【简单介绍】 基于YOLOv8与PyQt5的精美界面GUI设计&#xff0c;旨在为用户提供一个直观、易用且功能强大的目标检测平台。通过结合YOLOv8的先进目标检测能力与PyQt5的丰富界面设计元素&#xff0c;我们打造了一款高效、稳定的软件产品。 在界面设计上&#xff0c;我们注重用户…

MySQL基础(DDL,DML,DQL)

目录 一DDL 1.1数据库操作 1.1.1查询所有数据库&#xff1a; 1.1.2创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2表操作 1.2.1表操作 1.2.1.1创建表 1.2.1.1.1约束 1.2.1.1.2 数据类型 1.2.1.1.2.1 数值类型 1.2.1.1.2.2 字符串类型 1.2.1.1.2.3日期类型 1.…

【机器学习】引领未来的力量:技术革新与应用探索

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

java实现https连接总是要报no cipher suites in common

遇到“no cipher suites in common”这样的错误通常意味着客户端和服务器之间没有共同支持的加密套件&#xff08;Cipher Suite&#xff09;。这个问题可能由多个原因引起&#xff0c;包括但不限于SSL/TLS配置错误、Java安全策略限制、客户端或服务器不支持的加密算法等。解决这…

使用 NocoDB 一键将各种数据库转换为智能表格

NocoDB 是一款开源的无代码数据库平台&#xff0c;可以进行数据管理和应用开发。它的灵感来自 Airtable&#xff0c;支持与 Airtable 类似的电子表格式交互、关系型数据库 Schema 设计、API 自动生成等特性。 但与 Airtable 相比&#xff0c;NocoDB 完全免费且代码开源&#xf…

python笔记(2)基础语法

python 保留字 import keyword print(keyword.kwlist)运行 "Import-Module PSReadLine"。PS F:\学习\python\测试> & C:/Users/Python/Python311/python.exe f:/学习/python/测试/test.py [False, None, True, and, as, assert, async, await, break, class,…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-乘积尾零

solution 找末尾0的个数&#xff0c;即找有多少对2和5 >问题等价于寻找所给数据中&#xff0c;有多少个2和5的因子&#xff0c;较少出现的因子次数即为0的个数 #include <iostream> using namespace std; int main() {// 请在此输入您的代码printf("31");…

Java中SPI机制简单演示

Java中SPI机制简单演示 写一个SpiService接口 public interface SpiService {void run();}写两个实现类&#xff0c;注意&#xff1a;实现类可以跨包 Slf4j public class SpiServiceImpl1 implements SpiService {Overridepublic void run() {log.warn("SpiServiceImpl…