万兆以太网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,一经查实,立即删除!

相关文章

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貌似不能同时被借用…

香港裸机云多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的仪器信息管理系统显得尤为必…

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

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

python爬豆瓣top250电影

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

每日算法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…

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

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

【Python】异常处理结构

文章目录 1.python异常2.try_except异常处理结构3.try... 多个except异常处理4.try_except_else异常处理结构5.try_except_finally异常处理结构6.常见报错类型 在运行代码时&#xff0c;总是遇到各种异常&#xff0c;且出现异常时&#xff0c;脚本就会自动的的停止运行&#xf…

就业班 第三阶段(nginx) 2401--4.17 day1 nginx1

负载均衡集群 1、集群是什么&#xff1f; 1 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术。 …

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程&#xff1a; VMware 安装配置 Ubuntu&#xff08;最新版、超详细&#xff09;FinalShell 远程连接 Linux&#xff08;Ubuntu&#xff09;系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题&#xff1a;为什么使用 FinalShell 连接&#xff0…

初识ansible服务及ansible主机清单配置

目录 1、什么是自动化批量管理 2、自动化工具ansible架构 3、ansible服务专用术语对照表 4、设置主机清单&#xff08;inventory&#xff09; 4.1实验环境准备 4.2配置主机清单 4.2.1分组基本格式 4.2.2指定用户名&#xff0c;密码。端口 4.2.3子组 4.3查看 4.3.1看…

LeetCode———144—— 二叉树的前序遍历

目录 ​编辑 1.题目 2.解答 1.首先计算二叉树的节点个数&#xff1a; 2.以先序遍历&#xff08;Preorder Traversal&#xff09;的方式遍历一个二叉树&#xff0c;并将遍历到的节点的值存储在一个整数数组中 3.最终代码 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 给…

双碳目标下基于“遥感+”集成技术的碳储量、碳排放、碳循环、温室气体等多领域监测与模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

[stm32]DMA使用

自动重装和M2M(软件trig)不能一起使用&#xff0c;否则会停不下来 void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddrAddrA;//外…

爬楼梯(c)

文章目录 描述分析思路关键代码运行结果 描述 给定一个整数数组 cost &#xff0c;其中 cost[i]是从楼梯第i 个台阶向上爬需要支付的费用&#xff0c;下标从0开始。-旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶 要求&#xff1a;请你计算并返回达到楼梯顶部的…

在使用lombok的@Slf4j时,启动项目报错。java:找不到符号

问题背景&#xff1a; 在使用lombok的Slf4j时&#xff0c;启动项目报错。 java&#xff1a;找不到符号符号&#xff1a; 方法info(java.lang.String,java.lang.String)位置&#xff1a; 类型为org.apache.ibatis.logging.Log的变量 log解决方式&#xff1a; 在如图所示位置加…