万兆以太网MAC设计(4)CRC_process模块

文章目录

  • 前言
  • 一、模块功能
  • 二、实现过程
  • 三、仿真
  • 总结

前言

上文介绍的MAC_RX模块当中增加了CRC校验和比对的功能,本文将根据CRC校验的结果,来决定将数据输出到上层用户还是丢弃。

一、模块功能

  1. 接收MAC_RX模块输出的AXIS数据,存入本地环形RAM当中
  2. 根据MAC_RX模块给出的CRC校验结果,来决定是否输出数据,只有正确的情况下才会从RAM当中将数据吐出,否则不输出,下一帧数据将会直接覆盖错误数据。
module CRC_process(input           i_clk               ,input           i_rst               ,input  [63:0]   s_axis_rdata        ,input  [79:0]   s_axis_ruser        ,input  [7 :0]   s_axis_rkeep        ,input           s_axis_rlast        ,input           s_axis_rvalid       ,input           i_crc_error         ,input           i_crc_valid         ,output [63:0]   m_axis_rdata        ,output [79:0]   m_axis_ruser        ,output [7 :0]   m_axis_rkeep        ,output          m_axis_rlast        ,output          m_axis_rvalid       
);

二、实现过程

BRAM_SD_64X256 BRAM_SD_64X256_data (.clka         (i_clk              ), // input wire clka.ena          (rs_axis_rvalid     ), // input wire ena.wea          (rs_axis_rvalid     ), // input wire [0 : 0] wea.addra        (r_ram_data_addra   ), // input wire [7 : 0] addra.dina         (rs_axis_rdata      ), // input wire [63 : 0] dina.clkb         (i_clk              ), // input wire clkb.enb          (r_ram_data_enb     ), // input wire enb.addrb        (r_ram_data_addrb   ), // input wire [7 : 0] addrb.doutb        (w_ram_data_doutb   )  // output wire [63 : 0] doutb
);BRAM_SD_16X32 BRAM_SD_16X32_len (.clka         (i_clk              ), // input wire clka             .ena          (rs_axis_rlast      ), // input wire ena              .wea          (rs_axis_rlast      ), // input wire [0 : 0] wea      .addra        (r_ram_len_addra    ), // input wire [4 : 0] addra    .dina         (rs_axis_ruser[79:64]), // input wire [15 : 0] dina    .clkb         (i_clk              ), // input wire clkb             .enb          (r_ram_len_enb      ), // input wire enb              .addrb        (r_ram_len_addrb    ), // input wire [4 : 0] addrb    .doutb        (w_ram_len_doutb    )  // output wire [15 : 0] doutb  
);BRAM_SD_8X32 BRAM_SD_8X32_keep (.clka         (i_clk              ),  // input wire clka            .ena          (rs_axis_rlast      ),  // input wire ena             .wea          (rs_axis_rlast      ),  // input wire [0 : 0] wea     .addra        (r_ram_keep_addra   ),  // input wire [4 : 0] addra   .dina         (rs_axis_rkeep      ),  // input wire [7 : 0] dina    .clkb         (i_clk              ),  // input wire clkb            .enb          (r_ram_keep_enb     ),  // input wire enb             .addrb        (r_ram_keep_addrb   ),  // input wire [4 : 0] addrb   .doutb        (w_ram_keep_doutb   )   // output wire [7 : 0] doutb  
);BRAM_SD_64X32 BRAM_SD_64X32_user (.clka         (i_clk              ),  // input wire clka.ena          (rs_axis_rlast      ),  // input wire ena.wea          (rs_axis_rlast      ),  // input wire [0 : 0] wea.addra        (r_ram_user_addra   ),  // input wire [4 : 0] addra.dina         (rs_axis_ruser[63:0]),  // input wire [63 : 0] dina.clkb         (i_clk              ),  // input wire clkb.enb          (r_ram_user_enb     ),  // input wire enb.addrb        (r_ram_user_addrb   ),  // input wire [4 : 0] addrb.doutb        (w_ram_user_doutb   )   // output wire [63 : 0] doutb
);

通过4个简单双端口的BRAM实现:

  1. 数据、长度信息(在axis_user当中)、尾端keep以及user数据分别存入对应RAM当中。
  2. 当CRC正确时,各个RAM的地址保持不变,下一帧数据紧随其后被填充进RAM,如果CRC错误,则地址回退到上一次结束的地址,即丢弃刚刚写入的错误数据。
  3. 得到一次CRC正确数据r_recv_flag加1,输出一次数据r_send_flag加1,俩者不相等说明此时RAM里存在数据,拉高r_run
  4. r_run被拉高表示需要开始输出RAM当中的各种信息,并且通过AXIS接口形式传递给上层模块。

该部分核心代码:

//输入数据进如ram,起始地址由r_data_start_addra决定,len和keep同理
always @(posedge i_clk or posedge i_rst)beginif(i_rst)r_ram_data_addra <= 'd0;else if(ri_crc_valid_1d && ri_crc_error_1d)r_ram_data_addra <= r_data_start_addra;//crc错误则回退到上次起始地址写入新数据else if(rs_axis_rvalid)r_ram_data_addra <= r_ram_data_addra + 1;elser_ram_data_addra <= r_ram_data_addra;
endalways @(posedge i_clk or posedge i_rst)beginif(i_rst)r_ram_len_addra <= 'd0;else if(ri_crc_valid_1d && ri_crc_error_1d)r_ram_len_addra <= r_len_start_addra;//crc错误则回退到上次起始地址写入新数据else if(rs_axis_rlast)r_ram_len_addra <= r_ram_len_addra + 1;elser_ram_len_addra <= r_ram_len_addra;
endalways @(posedge i_clk or posedge i_rst)beginif(i_rst)r_ram_keep_addra <= 'd0;else if(ri_crc_valid_1d && ri_crc_error_1d)r_ram_keep_addra <= r_keep_start_addra;//crc错误则回退到上次起始地址写入新数据else if(rs_axis_rlast)r_ram_keep_addra <= r_ram_keep_addra + 1;elser_ram_keep_addra <= r_ram_keep_addra;
endalways @(posedge i_clk or posedge i_rst)beginif(i_rst)r_ram_user_addra <= 'd0;else if(ri_crc_valid_1d && ri_crc_error_1d)r_ram_user_addra <= r_user_start_addra;//crc错误则回退到上次起始地址写入新数据else if(rs_axis_rlast)r_ram_user_addra <= r_ram_user_addra + 1;elser_ram_user_addra <= r_ram_user_addra;
end// 当数据CRC正确,那么记录此时地址,作为下一帧数据的开始地址,否则保持不变,
// 下一帧数据进来后依旧从上上帧数据结束位置开始写入,即覆盖(丢掉了)CRC错误数据
always @(posedge i_clk or posedge i_rst)beginif(i_rst)beginr_data_start_addra <= 'd0;r_len_start_addra  <= 'd0;r_keep_start_addra <= 'd0;r_user_start_addra <= 'd0;endelse if(ri_crc_valid && !ri_crc_error)beginr_data_start_addra <= r_ram_data_addra;r_len_start_addra  <= r_ram_len_addra ;r_keep_start_addra <= r_ram_keep_addra;r_user_start_addra <= r_ram_user_addra;endelse beginr_data_start_addra <= r_data_start_addra;r_len_start_addra  <= r_len_start_addra ;r_keep_start_addra <= r_keep_start_addra;r_user_start_addra <= r_user_start_addra;end
end//得到一次正确数据r_recv_flag加1,输出一次数据r_send_flag加1
//俩者不相等说明此时ram里存在数据,拉高r_run
always @(posedge i_clk or posedge i_rst)beginif(i_rst)r_recv_flag <= 'd0;else if(ri_crc_valid && !ri_crc_error)r_recv_flag <= r_recv_flag + 'd1;elser_recv_flag <= r_recv_flag;
endalways @(posedge i_clk or posedge i_rst)beginif(i_rst)r_send_flag <= 'd0;else if(rm_axis_rlast)r_send_flag <= r_send_flag + 'd1;elser_send_flag <= r_send_flag;
end//r_run指示当前正在输出数据
always @(posedge i_clk or posedge i_rst)beginif(i_rst)r_run <= 'd0;else if(rm_axis_rlast)r_run <= 'd0;else if((r_recv_flag != r_send_flag) && !rm_axis_rvalid)r_run <= 'd1;elser_run <= r_run;
end

三、仿真

黄线时刻CRC发生错误,因此并没有向上层输出AIS数据,并且地址会回退到上一次正确数据输入结束的地址,重新写入新的数据并且进行CRC判断。,
在这里插入图片描述

总结

完整代码参考:https://github.com/shun6-6/Ten_gig_eth_design

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

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

相关文章

js new 操作符

执行过程 核心&#xff1a;原型链、this、返回 创建一个空对象obj建立构造函数与对象间的关系 原型链 将构造函数中的this绑定到新建的obj上 明确this指向将构造函数返回类型作判断&#xff0c;如果原始值被忽略&#xff0c;如果返回对象&#xff0c;需要正常处理 手写new…

rust学习(BorrowMut异常)

现象&#xff1a; 编译没有问题&#xff0c;运行时出现&#xff1a; 代码&#xff1a; pub fn do_test() {let v Arc::new(RefCell::new(100));let v1 v.try_borrow_mut().unwrap();let v2 v.try_borrow_mut().unwrap(); } 原因&#xff1a; 一个cell貌似不能同时被借用…

Qt实现XYModem协议(三)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

springboot项目maven引入本地包没打包进去

当在 Spring Boot 项目中引入本地的 Maven 依赖时&#xff0c;有时会遇到依赖未被正确打包进项目的情况。这可能是由于 Maven 依赖的范围&#xff08;scope&#xff09;或者构建配置问题所致。下面是一些可能的原因和解决方法&#xff0c;以及详细的代码介绍&#xff1a; 依赖范…

AcWing 798. 差分矩阵——算法基础课题解

AcWing 798. 差分矩阵 题目描述 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个操作&#xff0c;每个操作包含五个整数 x1,y1,x2,y2,c&#xff0c;其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上…

PostgreSQL数据库高级sql总结2

1、postgresql 数据库update 去重sql 先按重复记录fk分组找最小的记录&#xff0c;然后更新id 不在子查询中的数据 update td_f_stop_history set del_flag1 where "id" not in (select "min"("id") from td_f_stop_history where allowed_re…

香港裸机云多IP服务器都有哪些配置?

香港裸机云多IP服务器是一种高效、灵活的云计算服务&#xff0c;为用户提供了多IP地址的配置选项&#xff0c;以满足各种复杂的网络需求。这种服务器在配置上具有丰富的多样性和高度的可定制性&#xff0c;下面我们就来科普一下香港裸机云多IP服务器的主要配置。 首先&#xff…

开源模型应用落地-chatglm3-6b-模型输出违禁词检测(九)

一、前言 受限于模型本身的一些缺陷&#xff0c;任何模型均可能会生成一些不正确的输出。如何通过技术的手段去规避模型潜在的风险&#xff0c;提升推理质量是需要持续探究的过程。 如何利用第三方内容安全审核服务去检测模型输出内容的合规性&#xff0c;请查看&#xff1a;开…

【资源分享】Stata 17免费下载安装

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

利用AOP数据脱敏

背景 要求对接口中含有的电话、身份证、名字进行脱敏处理显示部分数据&#xff0c;并对老的接口同步改造&#xff0c;由于改动部分较多。想到了利用自定义注解配合切面处理&#xff0c;减少对原本接口的改动。 注意&#xff1a;注解及切面只针对String类型的属性有效 注解定…

魔方网表ERP mailupdate.jsp 任意文件上传漏洞复现

0x01 产品简介 魔方网表ERP是一款高效、灵活的企业资源规划解决方案,旨在帮助企业实现数智化转型,消除信息孤岛,打造全程一体化的管理体系。魔方网表ERP拥有强大的表单功能和模块化的产品特点,使得企业可以根据自身业务需求,通过简单的拖拽和配置,快速搭建符合自身特点的…

python爬豆瓣top250电影

文章目录 前言分析与实现1.对豆瓣网网站进行Ajax分析2.发送请求3.进一步筛选&#xff08;提取&#xff09; 完整代码 前言 通过这个项目&#xff0c;可以让小白对爬虫有一个初步认识&#xff0c;爬取豆瓣top250是一个初学者学爬虫的必经之路&#xff0c;话不多说&#xff0c;我…

解决AGP升级到8.0后编译报错kaptGenerateStubsDebugKotlin

问题描述 升级了Gradle插件到8.0&#xff0c;运行报以下错误. Execution failed for task :app:kaptGenerateStubsDebugKotlin. > compileDebugJavaWithJavac task (current target is 1.8) and kaptGenerateStubsDebugKotlin task (current target is 17) jvm target com…

每日算法4/17

1552. 两球之间的磁力 题目 在代号为 C-137 的地球上&#xff0c;Rick 发现如果他将两个球放在他新发明的篮子里&#xff0c;它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子&#xff0c;第 i 个篮子的位置在 position[i] &#xff0c;Morty 想把 m 个球放到这些篮子里&…

【面试经典 150 | 链表】分隔链表

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Springboot集成JWT token实现权限验证

紧接着上一次的博客&#xff0c;我们现在来给这个项目添加一个jwt的权限验证功能&#xff0c;上一次的博客如下&#xff1a;springboot结合vue实现登录和注册功能-CSDN博客 1.后端 1.1.导入依赖 <dependency><groupId>com.auth0</groupId><artifactId&g…

Redis: 事务操作

文章目录 一、Redis的事务定义二、Redis事务的操作方式三、Redis事务三特性四、事务冲突问题五、使用场景 一、Redis的事务定义 Redis事务是一组命令的集合&#xff0c;这些命令会作为一个单独的执行单位进行执行。在执行事务期间&#xff0c;其他客户端发送的命令不能被插入到…

长页面多模块调接口优化

背景&#xff1a; 查询近3年数据之类的&#xff0c;接口就会有大量数据需要查询做聚合&#xff0c;因此接口响应较慢。同时前端页面有大量不同维度展示的图表&#xff0c;渲染阻塞时间过长&#xff0c;用户体验较差&#xff0c;长时间loading&#xff0c;导致无法交互。因此前…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(一)

01 D题实现效果演示 视频参考微信原文&#xff1a;2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统&#xff08;一&#xff09; 02 D题任务要求 &#xff08;D题原文件参见本文附录&#xff09; 设计并制作一个图中所示的基于互联网的摄像测量系统。图中边长…