当前位置: 首页 > news >正文

咨询网站模板成人职业技能培训有哪些项目

咨询网站模板,成人职业技能培训有哪些项目,做淘客网站哪个cms好,企业网站建立流程的第一步是一、概述 MAC RX模块的需要进行解码、对齐、CRC校验。 因为在空闲的时候10G PCS/PMA会一直向外吐空闲符(x07)所以需要根据开始符、结束符将有效数据从码流中截取,也就是解码。 因为开始字符的所在位置有两种形式,而结束字符的位…

一、概述

MAC RX模块的需要进行解码、对齐、CRC校验。

因为在空闲的时候10G PCS/PMA会一直向外吐空闲符(x07)所以需要根据开始符、结束符将有效数据从码流中截取,也就是解码。

因为开始字符的所在位置有两种形式,而结束字符的位置不确定,所以需要根据开始字符、结束字符的位置将数据进行对齐。

在将数据对齐的同时,还需要将获取到的有效数据进行CRC校验,这里就需要设计64bit CRC-32校验。

开始、结束、空闲、错误 控制字符

二、具体实现

 1、检测开始、结束字符的位置

assign w_sof = (ri_xgmii_rxc[7] && ri_xgmii_rxd[63:56] == 8'hFB) ||(ri_xgmii_rxc[3] && ri_xgmii_rxd[31:24] == 8'hFB) ;
assign w_sof_local = (ri_xgmii_rxc[7] && ri_xgmii_rxd[63:56] == 8'hFB) ? 0: 1;
assign w_eof = (ri_xgmii_rxc[0] && ri_xgmii_rxd[7:  0] == 8'hFE) ||(ri_xgmii_rxc[1] && ri_xgmii_rxd[15: 8] == 8'hFE) ||(ri_xgmii_rxc[2] && ri_xgmii_rxd[23:16] == 8'hFE) ||(ri_xgmii_rxc[3] && ri_xgmii_rxd[31:24] == 8'hFE) ||(ri_xgmii_rxc[4] && ri_xgmii_rxd[39:32] == 8'hFE) ||(ri_xgmii_rxc[5] && ri_xgmii_rxd[47:40] == 8'hFE) ||(ri_xgmii_rxc[6] && ri_xgmii_rxd[55:48] == 8'hFE) ||(ri_xgmii_rxc[7] && ri_xgmii_rxd[63:56] == 8'hFE) ;assign w_eof_local = (ri_xgmii_rxc[1] && ri_xgmii_rxd[15: 8] == 8'hFE) ? 6 :(ri_xgmii_rxc[2] && ri_xgmii_rxd[23:16] == 8'hFE) ? 5 :(ri_xgmii_rxc[3] && ri_xgmii_rxd[31:24] == 8'hFE) ? 4 :(ri_xgmii_rxc[4] && ri_xgmii_rxd[39:32] == 8'hFE) ? 3 :(ri_xgmii_rxc[5] && ri_xgmii_rxd[47:40] == 8'hFE) ? 2 :(ri_xgmii_rxc[6] && ri_xgmii_rxd[55:48] == 8'hFE) ? 1 :(ri_xgmii_rxc[7] && ri_xgmii_rxd[63:56] == 8'hFE) ? 0 :7;

2、获取目的MAC、源MAC、帧类型

//获取目的MAC
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_target_mac <= 'd0;  elseif(r_sof_local == 0 && r_cnt == 1)r_target_mac <= ri_xgmii_rxd_ff1[55:8];else if(r_sof_local == 1 && r_cnt == 1)r_target_mac <= {ri_xgmii_rxd_ff1[23:0],ri_xgmii_rxd[63:40]};elser_target_mac <= r_target_mac;
end
//获取源MAC
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_source_mac <= 'd0;elseif(r_sof_local == 0 && r_cnt == 1)r_source_mac <= {ri_xgmii_rxd_ff1[7:0],ri_xgmii_rxd[63:24]};else if(r_sof_local == 1 && r_cnt == 2)r_source_mac <= {ri_xgmii_rxd_ff1[39:0],ri_xgmii_rxd[63:56]};elser_source_mac <= r_source_mac;
end
//获取帧类型
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_type <= 'd0; elseif(r_sof_local == 0 && r_cnt == 2)r_type <= ri_xgmii_rxd_ff1[23:8];else if(r_sof_local == 1 && r_cnt == 3)r_type <= ri_xgmii_rxd_ff1[55:40];elser_type <= r_type;
end

这里需要了解一下标准以太网帧的帧格式

 在提取MAC字段之前需要去除前导码:56‘h55555555_555555,SFD:8‘hD5。

3、对齐数据

根据开始字符的位置对齐数据

always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_data <= 'd0;elseif(r_sof_local == 0 && r_run)rm_axis_data <= {ri_xgmii_rxd_ff1[7:0],ri_xgmii_rxd[63:8]};else if(r_sof_local == 1 && r_run)rm_axis_data <= {ri_xgmii_rxd_ff1[39:0],ri_xgmii_rxd[63:40]};elserm_axis_data <= 'd0;
end

因为使用的AXI-Stream接口,所以需要根据结束字符的位置处理最后一次传输的KEEP信号、Valid信号、Last信号

//keep信号处理!!!!
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_keep <= 'd0;elseif(r_run && !r_run_ff1)rm_axis_keep <= 8'b1111_1111;else if(rm_axis_last)rm_axis_keep <= 'd0;else if(r_sof_local == 0 && w_eof)case(w_eof_local)0           : rm_axis_keep <= 8'b1000_0000;1           : rm_axis_keep <= 8'b1100_0000;2           : rm_axis_keep <= 8'b1110_0000;3           : rm_axis_keep <= 8'b1111_0000;4           : rm_axis_keep <= 8'b1111_1000;5           : rm_axis_keep <= 8'b1111_1100;6           : rm_axis_keep <= 8'b1111_1110;7           : rm_axis_keep <= 8'b1111_1111;default     : rm_axis_keep <= 8'b1111_1111;endcaseelse if(r_sof_local == 1 && w_eof && w_eof_local <= 3)case(w_eof_local)0           : rm_axis_keep <= 8'b1111_1000;1           : rm_axis_keep <= 8'b1111_1100;2           : rm_axis_keep <= 8'b1111_1110;3           : rm_axis_keep <= 8'b1111_1111;4           : rm_axis_keep <= 8'b1000_0000;5           : rm_axis_keep <= 8'b1100_0000;6           : rm_axis_keep <= 8'b1110_0000;7           : rm_axis_keep <= 8'b1111_0000;default     : rm_axis_keep <= 8'b1111_1111;endcase else if(r_sof_local == 1 && r_eof && r_eof_local >= 4)case(r_eof_local)0           : rm_axis_keep <= 8'b1111_1000;1           : rm_axis_keep <= 8'b1111_1100;2           : rm_axis_keep <= 8'b1111_1110;3           : rm_axis_keep <= 8'b1111_1111;4           : rm_axis_keep <= 8'b1000_0000;5           : rm_axis_keep <= 8'b1100_0000;6           : rm_axis_keep <= 8'b1110_0000;7           : rm_axis_keep <= 8'b1111_0000;default     : rm_axis_keep <= 8'b1111_1111;endcase         elserm_axis_keep <= rm_axis_keep;
endalways@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_last <= 1'b0;elseif(r_sof_local == 0 && w_eof)rm_axis_last <= 1'b1;else if(r_sof_local == 1 && w_eof && w_eof_local <= 3)rm_axis_last <= 1'b1;else if(r_sof_local == 1 && r_eof && r_eof_local >= 4)rm_axis_last <= 1'b1;else rm_axis_last <= 1'b0;end
///valid信号,用r_run的上升沿判断数据开始
always@(posedge i_clk,posedge i_rst)beginif(i_rst)rm_axis_valid <= 1'b0;else if(rm_axis_last)rm_axis_valid <= 1'b0;else if(r_run && !r_run_ff1)rm_axis_valid <= 1'b1;elserm_axis_valid <= rm_axis_valid;
end

4、CRC校验

在进行字节对齐的过程中,需要进行CRC校验,在此过程中使用的标准以太网的CRC-32校验。

因为校验开始的位置是从目的MAC开始的,因此需要从目的MAC字段对齐数据。

always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_crc_data <= 'd0;elseif(r_sof_local == 0)if(r_sof_ff2)r_crc_data <= {ri_xgmii_rxd_ff2[55:0],ri_xgmii_rxd_ff1[63:56]};else if(r_eof || r_eof_ff1)r_crc_data <= {ri_xgmii_rxd_ff2[55:0],ri_xgmii_rxd_ff1[63:56]};else if(r_run_ff1)r_crc_data <= {ri_xgmii_rxd_ff2[55:0],ri_xgmii_rxd_ff1[63:56]};else r_crc_data <= 'd0; else if(r_sof_ff2)r_crc_data <= {ri_xgmii_rxd_ff2[23:0],ri_xgmii_rxd_ff1[63:24]};else if(r_eof || r_eof_ff1)r_crc_data <= {ri_xgmii_rxd_ff2[23:0],ri_xgmii_rxd_ff1[63:24]};else if(r_run)r_crc_data <= {ri_xgmii_rxd_ff2[23:0],ri_xgmii_rxd_ff1[63:24]};elser_crc_data <= 'd0;
end

在此过程中需要一个使能信号,指示需要对当前的数据进行CRC校验

//CRC_en控制
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_crc_en <= 'd0;elseif(r_sof_local == 0)if(r_sof_ff2)r_crc_en <= 1'b1;else if(r_eof)r_crc_en <= 1'b1;else if(r_eof_ff1)case(r_eof_local)0           :r_crc_en <= 1'b0;1           :r_crc_en <= 1'b0;2           :r_crc_en <= 1'b0;3           :r_crc_en <= 1'b0;4           :r_crc_en <= 1'b0;5           :r_crc_en <= 1'b0;6           :r_crc_en <= 1'b1;//剩余一个数据,需要再次拉高crc_en7           :r_crc_en <= 1'b1;//剩余两个数据,需要再次拉高crc_endefault     :r_crc_en <= 1'b0;endcase                else if(r_eof_ff2)r_crc_en <= 1'b0;else r_crc_en <= r_crc_en; else if(r_sof_ff2)r_crc_en <= 1'b1;else if(w_eof)r_crc_en <= 1'b1;               else if(r_eof)case(r_eof_local)0           :r_crc_en <= 1'b0;//1           :r_crc_en <= 1'b0;2           :r_crc_en <= 1'b1;3           :r_crc_en <= 1'b1;4           :r_crc_en <= 1'b1;5           :r_crc_en <= 1'b1;6           :r_crc_en <= 1'b1;7           :r_crc_en <= 1'b1;default     :r_crc_en <= 1'b0;endcaseelse if(r_eof_ff1)r_crc_en <= 1'b0;elser_crc_en <= r_crc_en;
end

最后也需要对CRC数据的最后一次传输的有效数据进行指示,这里加入一个CRC_KEEP信号,指示最后一次传输的有效数据。

//CRC_KEEP处理!!!!
always@(posedge i_clk,posedge i_rst)beginif(i_rst)r_crc_keep <= 'd0;elseif(r_sof_ff2)r_crc_keep <= 8'b1111_1111;// else if((!r_crc_en && r_crc_en_ff1) || r_eof_ff2)//     r_crc_keep <= 8'b0000_0000;else if(r_sof_local == 0 && r_eof)case(r_eof_local)0           : r_crc_keep <= 8'b1110_0000;1           : r_crc_keep <= 8'b1111_0000;2           : r_crc_keep <= 8'b1111_1000;3           : r_crc_keep <= 8'b1111_1100;4           : r_crc_keep <= 8'b1111_1110;5           : r_crc_keep <= 8'b1111_1111;default     : r_crc_keep <= 8'b1111_1111;endcaseelse if(r_sof_local == 0 && r_eof_ff1)case(r_eof_local)6           : r_crc_keep <= 8'b1000_0000;7           : r_crc_keep <= 8'b1100_0000;default     : r_crc_keep <= r_crc_keep;endcase   else if(r_sof_local == 1 && w_eof)case(w_eof_local)0           : r_crc_keep <= 8'b1111_1110;1           : r_crc_keep <= 8'b1111_1111;2           : r_crc_keep <= 8'b1111_1111;3           : r_crc_keep <= 8'b1111_1111;4           : r_crc_keep <= 8'b1111_1111;5           : r_crc_keep <= 8'b1111_1111;6           : r_crc_keep <= 8'b1111_1111;7           : r_crc_keep <= 8'b1111_1111;default     : r_crc_keep <= 8'b1111_1111;endcase else if(r_sof_local == 1 && r_eof)case(r_eof_local)// 0           : r_crc_keep <= 8'b1111_1000;// 1           : r_crc_keep <= 8'b1111_1100;2           : r_crc_keep <= 8'b1000_0000;3           : r_crc_keep <= 8'b1100_0000;4           : r_crc_keep <= 8'b1110_0000;5           : r_crc_keep <= 8'b1111_0000;6           : r_crc_keep <= 8'b1111_1000;7           : r_crc_keep <= 8'b1111_1100;default     : r_crc_keep <= r_crc_keep;endcase // else if(r_sof_local == 1 && r_eof && r_eof_local >= 4)//     case(r_eof_local)//         0           : r_crc_keep <= 8'b1111_1000;//         1           : r_crc_keep <= 8'b1111_1100;//         2           : r_crc_keep <= 8'b1111_1110;//         3           : r_crc_keep <= 8'b1111_1111;//         4           : r_crc_keep <= 8'b1000_0000;//         5           : r_crc_keep <= 8'b1100_0000;//         6           : r_crc_keep <= 8'b1110_0000;//         7           : r_crc_keep <= 8'b1111_0000;//         default     : r_crc_keep <= 8'b1111_1111;//     endcase         elser_crc_keep <= r_crc_keep;
end

 5、CRC模块

CRC的生成公式采用的标准以太网的CRC-32的公式,这里可以参考此篇文章。

三、总结

MAC RX模块主要的难点就在于数据KEEP信号的处理以及相应的64bit的 CRC-32模块的实现。KEEP信号要考虑到开始、结束字符的位置,因此需要处理多种情况。而CEC模块的那点主要在于对于多Bytw数据,一次输入的数据可能不是全部有效的,所以也是需要考虑多种情况。

http://www.hkea.cn/news/216134/

相关文章:

  • html做动态网站cms
  • 一个网站建设需要多少钱百度seo排名优化公司
  • 网站做app的软件友博国际个人中心登录
  • 做网站用什么代码编写可口可乐软文营销案例
  • 宜昌网站建设哪家好厦门百度广告开户
  • 网站做二级域名外链
  • 网站建设服务费属于哪个大类电商seo搜索优化
  • 12380网站建设情况的报告网络seo首页
  • 个人如何在百度上做广告网站seo什么意思
  • java做网站编程合肥seo快排扣费
  • 做律师网站公司google play下载
  • 网站怎么做详情页北京网站制作建设公司
  • 广告网站模板下载不了东莞排名优化团队
  • 网站建设人员培训纲要河北seo网络推广
  • jsp网站开发实例视频教程各大网站的网址
  • 手机网站设计要素推广竞价
  • 久久医药网seo推广培训费用
  • 网站做301顶级域名需要绑定网站排名掉了怎么恢复
  • wordpress app 源码合肥seo整站优化网站
  • 建立网站基本步骤安仁网络推广
  • 网页建设方案怎么写网站seo优化心得
  • 还没有做网站可以先备案域名吗seo怎么提升关键词的排名
  • 做网站原型图软件优化设计七年级下册语文答案
  • 2023年舆情分析报告seo优化宣传
  • 武汉网站建设 熊掌号最佳磁力引擎吧
  • 教育平台网站开发品牌运营
  • 91人才网赣州招聘网安卓优化大师app下载安装
  • 合肥网页模板建站营业推广策划
  • 网站做301根目录在哪教育培训机构平台
  • 企业做网站域名需要自己申请吗深圳百度推广客服电话多少