10G MAC层设计系列-(3)CRC Process 模块

一、前言

前面已经讲述了在Xilinx 10G PCS/PMA IP核的基础上设计的PHY层,已经xgmii接口的MAC_RX模块,本节主要描述MAC_RX之后的CRC_Process模块。

CRC_Prcess的主要作用就是利用RAM地址“返回初始状态”的方式将crc错误的帧丢掉,并将正确的传递到上级。

二、模块设计

首先,将数据帧、最后一次传输的KEEP信号存入RAM

BRAM_DATA_64X512 u_BRAM_DATA_64X512 (.clka     (i_clk                  ),    // input wire clka.wea      (rs_axis_valid          ),      // input wire [0 : 0] wea.addra    (r_bram_wdata_addr      ),  // input wire [8 : 0] addra.dina     (rs_axis_data           ),    // input wire [63 : 0] dina.clkb     (i_clk                  ),    // input wire clkb.enb      (r_bram_data_rden       ),      // input wire enb.addrb    (r_bram_rdata_addr      ),  // input wire [8 : 0] addrb.doutb    (w_bram_data_out        )  // output wire [63 : 0] doutb
);//将每一帧的最后一次传输的KEEP信号存入到RAM
BRAM_KEEP_8X128 your_instance_name (.clka     (i_clk                  ),    // input wire clka.wea      (rs_axis_last           ),      // input wire [0 : 0] wea.addra    (r_bram_wkeep_addr      ),  // input wire [6 : 0] addra.dina     (rs_axis_keep           ),    // input wire [7 : 0] dina.clkb     (i_clk                  ),    // input wire clkb.enb      (r_bram_keep_rden       ),      // input wire enb.addrb    (r_bram_rkeep_addr      ),  // input wire [6 : 0] addrb.doutb    (w_bram_rkeep           )  // output wire [7 : 0] doutb
);

在此过程中存在一个初始化的地址信号,只有检测到CRC校验正确之后才会更新初始的地址信号。

//写数据初始化地址,当CRC校验正确的时候才会改变
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_init_wdata_addr <= 'd0;else if(w_crc_correct)r_init_wdata_addr <= r_bram_wdata_addr + 1;elser_init_wdata_addr <= r_init_wdata_addr;
end
//写数据地址
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_wdata_addr <= 'd0;elseif(s_axis_valid && !rs_axis_valid)r_bram_wdata_addr <= r_init_wdata_addr;else if(rs_axis_valid && !rs_axis_last)r_bram_wdata_addr <= r_bram_wdata_addr + 1;elser_bram_wdata_addr <= r_bram_wdata_addr;
end
//写KEEP信号的初始化地址,当CRC校验正确的时候才会改变
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_init_wkeep_addr <= 'd0;elseif(w_crc_correct)r_init_wkeep_addr <= r_bram_wkeep_addr + 1;elser_init_wkeep_addr <= r_init_wkeep_addr;        
end
//写KEEP信号地址
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_wkeep_addr <= 'd0;elseif(s_axis_last)r_bram_wkeep_addr <= r_init_wkeep_addr;elser_bram_wkeep_addr <= r_bram_wkeep_addr;
end

最后的帧长等信息只有在CRC校验正确之后存入FIFO,用FIFO的empty信号判断RAM中是否有正确的数据。

FIFO_USER_INFO_80X128 u_FIFO_USER_INFO_80X128 (.clk      (i_clk                  ),      // input wire clk.srst     (i_rst                  ),    // input wire srst.din      (r_user_info            ),      // input wire [79 : 0] din.wr_en    (w_crc_correct          ),  // input wire wr_en.rd_en    (r_fifo_user_info_rden  ),  // input wire rd_en.dout     (w_fifo_user_out        ),    // output wire [79 : 0] dout.full     (w_fifo_user_info_full  ),    // output wire full.empty    (w_fifo_user_info_empty )  // output wire empty
);

在读数据的过程中,便是根据FIFO是否为空判断是否有有效数据,之后读出FIFO帧长等信息,根据帧长去读取RAM中的数据。

//读取USER_INFO FIFO中的信息
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_fifo_user_info_rden <= 'd0;elseif(!w_fifo_user_info_empty && !r_fifo_rden_lock)r_fifo_user_info_rden <= 1'b1;elser_fifo_user_info_rden <= 1'b0;
end
//锁存信号
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_fifo_rden_lock <= 'd0;else if(!w_fifo_user_info_empty)r_fifo_rden_lock <= 1'b1;else if(rm_axis_last)r_fifo_rden_lock <= 1'b0;elser_fifo_rden_lock <= r_fifo_rden_lock; 
end
//读USER INFO
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_user <= 'd0;elserm_axis_user <= w_fifo_user_out;
end//读数据的使能慢读USER INFO的使能一拍
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_data_rden <= 'd0;elseif(r_fifo_user_info_rden)r_bram_data_rden <= 1'b1;else if(r_data_cnt == w_fifo_user_out[79:64])r_bram_data_rden <= 'd0;elser_bram_data_rden <= r_bram_data_rden;
end
//读数据地址
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_rdata_addr <= 'd0;elseif(r_fifo_user_info_rden)r_bram_rdata_addr <= r_init_rdata_addr;else if((r_data_cnt < w_fifo_user_out[79:64]) && r_data_cnt)r_bram_rdata_addr <= r_bram_rdata_addr + 1;elser_bram_rdata_addr <= r_bram_rdata_addr ;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_init_rdata_addr <= 'd0;else    if((r_data_cnt == w_fifo_user_out[79:64]) && r_bram_data_rden)r_init_rdata_addr <= r_bram_rdata_addr + 1;elser_init_rdata_addr <= r_init_rdata_addr;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_data_rden_ff1 <= 'd0; elser_bram_data_rden_ff1 <= r_bram_data_rden;
end
//读keep使能
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_keep_rden <= 1'b0;elseif(r_data_cnt == w_fifo_user_out[79:64] -1)r_bram_keep_rden <= 1'b1;else r_bram_keep_rden <= 1'b0;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_bram_rkeep_addr <= 'd0;else    if(r_data_cnt == w_fifo_user_out[79:64] -1)r_bram_rkeep_addr <= r_init_rkeep_addr;else r_bram_rkeep_addr <= r_bram_rkeep_addr;        
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)r_init_rkeep_addr <= 'd0;else    if((r_data_cnt == w_fifo_user_out[79:64]) && r_data_cnt)r_init_rkeep_addr <= r_bram_rkeep_addr + 1;else r_init_rkeep_addr <= r_init_rkeep_addr;        
end//寻找上升沿
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_data_rden_pos <= 'd0; elseif(r_bram_data_rden && !r_bram_data_rden_ff1)r_data_rden_pos <= 1'b1;elser_data_rden_pos <= 1'b0;
end
//寻找下降沿
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_data_rden_nge <= 'd0; elseif(!r_bram_data_rden && r_bram_data_rden_ff1)r_data_rden_nge <= 1'b1;elser_data_rden_nge <= 1'b0;
end
//读数据计数
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_data_cnt <= 'd0;elseif(r_fifo_user_info_rden || r_bram_data_rden)r_data_cnt <= r_data_cnt + 1;elser_data_cnt <= 'd0;
end
//数据转换成AXIS接口输出
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_data <= 'd0;elserm_axis_data <= w_bram_data_out;
end
//Valid信号
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_valid <= 1'b0;elseif(rm_axis_last)rm_axis_valid <= 1'b0;else if(r_data_rden_pos)rm_axis_valid <= 1'b1;elserm_axis_valid <= rm_axis_valid;
end
//Last信号
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_last <= 'd0;elseif(!r_bram_data_rden && r_bram_data_rden_ff1)rm_axis_last <= 1'b1;elserm_axis_last <= 1'b0;
end
//KEEP信号
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_keep <= 'd0;elseif(w_fifo_user_out[79:64] == 1 && r_data_rden_pos)rm_axis_keep <= w_bram_rkeep;else if(w_fifo_user_out[79:64] > 1 && r_data_rden_pos)rm_axis_keep <= 8'hff;else if(!r_bram_data_rden && r_bram_data_rden_ff1)rm_axis_keep <= w_bram_rkeep;elserm_axis_keep <= rm_axis_keep;
end

三、总结

CRC Process模块比较简单,就是实现丢掉CRC错误帧的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深耕 Python】Quantum Computing 量子计算机(2)绘制电子运动平面波

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 一、所需公式 1、自由空间中电子的波函数公式&#xff1a; 2、常量代换&#xff1a; 3、物理常量&#xff1a; 二、Python代码&#xff1a; …

SpringBoot实现Config下自动关联.xml、.properties配置信息的实例教程

本篇文章主要讲解在SpringBoot实现Config下自动关联.xml、.properties配置信息的实例教程。 日期&#xff1a;2024年5月4日 作者&#xff1a;任聪聪 .properties文件调用方法 步骤一、打开我们的 .properties 创建一个demo参数如下图&#xff1a; 步骤二、创建一个config的包&…

分片上传,分片合并

面是一种基于前端分片上传&#xff0c;后端合并的方法的代码实现&#xff1a; 前端代码&#xff08;HTML JavaScript&#xff09;&#xff1a; <input type"file" id"fileInput"> <button onclick"uploadFile()">Upload</butt…

【docker】maven 打包docker的插件学习

docker-maven-plugin GitHub地址&#xff1a;https://github.com/spotify/docker-maven-plugin 您可以使用此插件创建一个 Docker 映像&#xff0c;其中包含从 Maven 项目构建的工件。例如&#xff0c;Java 服务的构建过程可以输出运行该服务的 Docker 映像。 该插件是 Spot…

(12)配置Notch滤波器(一)

文章目录 前言 1 陷波滤波器设置概述 2 启用陷波滤波器 3 陷波滤波器控制类型 4 确定陷波滤波器的中心频率 5 滤除的谐波数量 6 检查陷波滤波器的有效性 7 双层/三层陷波 前言 ArduPilot 支持两个陷波滤波器&#xff0c;对于电机来说&#xff0c;其滤波频率可以与电机…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.11-1.12

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)1.11 神经网络的权重…

xftp破解版?No!xftp平替开源工具✔

文章目录 一、背景说明二、WindTerm介绍三、简单使用说明3.1 新建一个ssh连接窗口![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bfbe5114916e4a7e94ca0f9ceb05ca37.png)3.2 输入主机ip和端口号3.3 点击Continue3.4 输入密码3.5 登入成功3.6 下载文件到本地3.7 上…

网络安全之弱口令与命令爆破(下篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;九头蛇&#xff08;hydra&#xff09;弱口令爆破工具 1&#xff0c;破解ssh登录密码 2&#xff0c;破解windows登录密码 3&#xf…

展会进行时|百华鞋业亮相第135届中国进出口商品交易会(广交会)三期,展会现场人气爆棚!

第135届中国进出口商品交易会&#xff08;广交会&#xff09;三期如约而至&#xff0c;本届展会汇集了来自世界各地的参展企业&#xff0c;带来各行业前沿技术与新产品展出。百华鞋业携足部安防职业鞋、户外作训靴等系列新产品强势亮相展会&#xff0c;位于2.2 G25-26 H23-24的…

如何免费体验 gpt2-chatbot

如何免费体验 gpt2-chatbot 就在五一假期期间&#xff0c;一个神秘模型在没有任何官方文件的情况下突然发布。发布后不到 12 小时就立即引起人工智能爱好者和专家们的关注。这个名为“gpt2-chatbot”的神秘新模型凭借其令人印象深刻的能力轰动全球。有人猜测它可能是 OpenAI 的…

【Linux】进程exec函数族以及守护进程

一.exec函数族 1.exec函数族的应用 在shell下敲shell的命令都是在创建shell的子进程。而我们之前学的创建父进程和子进程代码内容以及通过pid与0的关系来让父子进程执行不同的代码内容都是在一个代码文件里面&#xff0c;而shell是如何做到不在一个文件里面写代码使之成为子进…

Centos7环境下搭建SVN服务器、迁移svn到其他的服务器

简介&#xff1a; SVN是subversion的缩写&#xff0c;是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;简而言之就是用于多个人共同开发同一个项目&#xff0c;实现共享资源&#xff0c;实现最终集中式的管理。 一、简介 参考链接&…

2024年3月Scratch图形化编程等级考试(二级)真题试卷

2024年3月Scratch图形化编程等级考试&#xff08;二级&#xff09;真题试卷 选择题 第 1 题 默认小猫角色&#xff0c;Scratch运行程序后&#xff0c;舞台上出现的图形是&#xff1f;&#xff08; &#xff09; A. B. C. D. 第 2 题 下列哪个Scratch选项可以使虫子移到…

Banana Pi 推出采用瑞芯微 RK3576芯片设计开源硬件:BPI-M5 Pro

Banana Pi BPI-M5 Pro采用第二代8nm高性能AIOT平台瑞芯微RK3576&#xff0c;拥有6 TOPS算力NPU&#xff0c;支持最高32GB大内存。支持8K视频编解码&#xff0c;提供双千兆网口、WiFi 6 & BT5、多种视频输出等丰富接口。兼容多种操作系统&#xff0c;适用于基于ARM的PC、边缘…

数列与级数(上)

数列与极限 收敛序列 3.1 定义 度量空间 X X X中的序列 { p n } \left\{ p_{n} \right\} {pn​}叫做收敛的(converge)&#xff0c;如果有一个下述性质的点 p ∈ X p \in X p∈X&#xff1a;对于每个 ε > 0 \varepsilon >0 ε>0&#xff0c;有一个正整数 N N N&…

网盘——移动文件

本文主要讲解网盘文件操作部分的移动文件&#xff0c;具体步骤如下&#xff1a; 目录 1、实施步骤&#xff1a; 2、代码实现 2.1、在book里面添加移动文件的按钮 2.2、将他添加到界面 2.3、添加移动文件的槽函数 2.4、关联槽函数 2.5、在book中添加成员函数&#xff0c…

全量知识系统 程序详细设计 之 “Component总线结构” (QA百度文库)

Q1. 今天想聊聊 全量知识系统&#xff08;以下简称全知系统&#xff09;中的 “Component总线结构” 全量知识系统&#xff0c;即全知系统&#xff0c;是一个综合性的平台&#xff0c;旨在整合、处理和应用各类知识。在这个系统中&#xff0c;“Component总线结构”是一个核心…

【opencv4.8.1 源码编译】windows10 OpenCV 4.8.1源码编译并实现 CUDA 12加速

Windows 下使用 CMake3.29.2 Visual Studio 2022 编译 OpenCV 4.8.1 及其扩展模块cuda12.0teslaT4显卡 记录自己在编译时踩过的坑&#xff0c;避免下次再犯或者给有需要的人。 在实际使用中&#xff0c;如果是对处理时间要求比较高的场景&#xff0c;使用OpenCV处理图片数据很…

经济法期末考试题

《经济法》期末大作业 开卷 班级 管院金融学辅修&#xff08;24春&#xff09; 姓名 学号 答案请写在后边答题纸上 题目 一 二 三 总分 成绩 名词解释&#xff08;每小题5分&#xff0c;8小题&#xff0c;共40分&#xff09; 经济法…

什么是Dos攻击和DDos攻击了?

Dos攻击就是一个计算机进行攻击,一个计算机发出多次请求和获取资源等请求,从而使得服务器的资源都用于处理这个计算机发出的请求了,没有资源被其他用户服务了,甚至可能直接导致服务器崩溃了 DDos攻击就是和Dos攻击的区别就是其攻击升级了,不再是一台计算机,而是被病毒感染的多台…