根据Aurora发送时序,造Aurora 数据包,从而进行AXIS接口数据位宽转换仿真

news2024/11/26 10:17:56

首先Aurora采用AXIS接口

由于后续需要进行AXIS接口 不同时钟域的数据位宽转换(64bit和256bit之间的转换),因此分两次走。

第一种方法:采用AXIS数据位宽转换IP + AXIS跨时钟域IP
在这里插入图片描述
在这里插入图片描述

第二种方法:逻辑完成

下面记录逻辑实现方法。
为了能正常仿真,首先根据Aurora时序制造数据包。
s_tvlaid、s_tdata 通过计数器来创造,创造不同长度的数据包,其中包含非4的倍数的数据包、刚好4个数据的数据包,仅一个数据的数据包。

  //生成计数器(辅助生成s_tvlaid、s_tdata)
  always @(posedge USER_CLK)
      if(SYS_RST)
          r_cnt50 <= 0;
      else if(r_cnt50 == 6'd50)
          r_cnt50 <= 0;
      else 
         r_cnt50 <= r_cnt50 + 1'b1;
  
  //生成s_tvalid
  assign s_tvalid_en = (((r_cnt50 >= 6'd5) && (r_cnt50 <= 6'd15)) || ((r_cnt50 >= 6'd17)&& (r_cnt50 <= 6'd20)) || (r_cnt50 == 6'd40) ) ? 1 : 0;
  assign s_tvalid    =  r_tvalid;
  
  always @(posedge USER_CLK)
      if(s_tvalid_en)
          r_tvalid <= 'b1;
      else
          r_tvalid <= 'b0;
          
  //生成s_tdata    
  assign s_tdata    =  r_tdata;  
  
  always @(posedge USER_CLK)
   if(s_tvalid_en)
       r_tdata  <= r_tdata + 64'h5; //64'hecff_bc1f
   else
       r_tdata  <= 'b0;
       
  //生成s_tlast_en 
  assign s_tlast_en  = ((r_cnt50 == 6'd15) || (r_cnt50 == 6'd20) || (r_cnt50 == 6'd40)) ? 1: 0  ; 
  
    always @(posedge USER_CLK)
      if(s_tlast_en)
          r_tlast <= 'b1;
      else
          r_tlast <= 'b0;
          
  assign s_tlast  =   r_tlast;   
  
  //生成s_tkeep 
  assign s_tkeep  = s_tlast ? 8'hff : 8'b0;

在这里插入图片描述
接下来就是AXIS接口 64bit转256bit

首先设计256bit移位寄存器

第一种方法:

  //设计移位寄存器,先进的放低位
  always @(posedge USER_CLK)
      if(s_tvalid)
          r_s_tdata_SHIFT <= {s_tdata,r_s_tdata_SHIFT[255:64]}; 
      else 
         r_s_tdata_SHIFT <= r_s_tdata_SHIFT;

在这里插入图片描述
第二种方法:

   reg   [63:0]      r1_s_tdata = 'b0;
   reg   [63:0]      r2_s_tdata = 'b0;
   reg   [63:0]      r3_s_tdata = 'b0;
   wire  [255:0]     s_data_256      ;

    //s_tdata打三拍
      always @(posedge USER_CLK)
      begin
          r1_s_tdata <= s_tdata ; 
          r2_s_tdata <= r1_s_tdata;
          r3_s_tdata <= r2_s_tdata;
      end
      
  assign s_data_256 =  {s_tdata,r1_s_tdata,r2_s_tdata,r3_s_tdata};

拼接后的波形图如下:
在这里插入图片描述


生成转换后的m_tvalid信号
由于64bit转256,所以比率是4:1
那么生成4计数器,从而指示转换成的256bit数据有效

 //设计  4:1计数器   
    always @(posedge USER_CLK)
    begin
        if(s_tlast & s_tvalid )
            r_CNT2                   <= 2'd0  ;
        else if(s_tvalid) 
            r_CNT2                   <= r_CNT2 + 1'b1  ;
        else
            r_CNT2                   <= r_CNT2 ;            
    end
    
   //生成 m_tvalid
   always @(posedge USER_CLK)
    begin
        if(((r_CNT2 == 2'd3) || s_tlast) & s_tvalid) 
            m_tvalid           <= 1'b1 ;  
        else
            m_tvalid           <= 1'b0 ;         
    end

生成tlast信号,不管数据包是不是4的倍数,总会被移入256bit寄存器,转换后的m_tlast信号相当于是比之前的s_talst晚一拍

  //生成m_tlast  
    always @(posedge USER_CLK)
    begin
        if( s_tlast & s_tvalid) 
            m_tlast           <= 1'b1 ;  
        else
            m_tlast           <= 1'b0 ;         
    end

在这里插入图片描述

生成m_tkeep ,首先确定最后一个256bit数据,即m_tlast对应的256bit数据的m_tkeep值,这里根据移入寄存器的个数有关。
也就是说,当计数器为0的表示,还没移入数据;当为1移入第一个64bit数据,因此是八个字节有效,所以最后一个数据位置的m_tkeep的低八位为1,即可8‘hff,以此类推。
从而确定最终的m_tkeep值。

  //生成m_tkeep  
    always @(*)
    begin
        case(r_CNT2)
            2'd0           :     r_tkeep_TEMP    =     {  8'h00 ,   8'h00,     8'h00 ,   s_tkeep     }      ;
            2'd1           :     r_tkeep_TEMP    =     {  8'h00 ,   8'h00,     s_tkeep ,  8'hff      }      ;
            2'd2           :     r_tkeep_TEMP    =     {  8'h00 ,   s_tkeep ,  8'hff ,    8'hff      }      ;
            2'd3           :     r_tkeep_TEMP    =     {  s_tkeep , 8'hff ,    8'hff ,    8'hff      }      ;
            default        :     r_tkeep_TEMP    =     32'd0     ;              
        endcase
    end
    //s_tlast位置对应的tkeep
   always @(posedge USER_CLK)
    begin
        if(s_tlast & s_tvalid)
            m_tkeep            <= r_tkeep_TEMP ;
        else
            m_tkeep            <= 32'hffff_ffff;
    end  

由于我们发的第一个数据包中有11个64bit数据,因此最后一拍256bit数据中仅包含3个64bit数据,所以24个字节有效,因此m_tkeep的高两位为0,剩下为f。
在这里插入图片描述
把拼接后的256bit数据取出来。
重点在于,取出的256bit数据要保证在m_tvalid时刻有效,不然是不符合axis接口时序的,后续没办法使用。

    //把拼接数据取出
    reg     [255:0]        r_s_data_256    = 'b0 ;
    reg     [255:0]        data_256_1      = 'b0 ;
    wire    [255:0]        data_256_2            ;
    reg     [255:0]        r_STDATA        = 'b0 ;
    reg     [255:0]        r_s_tdata_tmp   = 'b0 ;
    reg     [255:0]        r_STDATA_1      = 'b0 ;
    
    always @(posedge USER_CLK)
        r_s_data_256 <= s_data_256;
    
    always @(posedge USER_CLK)
        if(m_tvalid)
            data_256_1 <= r_s_data_256;
        else
            data_256_1 <= data_256_1;
            
   assign  data_256_2 = m_tvalid ? r_s_data_256 :'b0 ;
   
    always @(posedge USER_CLK)
    begin
        if(((r_CNT2 == 2'd3) || s_tlast) & s_tvalid)
            r_STDATA   <= s_data_256;
        else
            r_STDATA   <= r_STDATA;
    end 
    
    //方法二
    always @(*)
    begin
        case(r_CNT2)
            2'd0           :     r_s_tdata_tmp    =     {  8'h00 ,   8'h00,     8'h00 ,   s_tdata                       }      ;
            2'd1           :     r_s_tdata_tmp    =     {  8'h00 ,   8'h00,     s_tdata , r_s_tdata_SHIFT[255:192]      }      ;
            2'd2           :     r_s_tdata_tmp    =     {  8'h00 ,   s_tdata ,  r_s_tdata_SHIFT[255:128]                }      ;
            2'd3           :     r_s_tdata_tmp    =     {  s_tdata , r_s_tdata_SHIFT[255:64]                            }      ;
            default        :     r_s_tdata_tmp    =     256'd0     ;              
        endcase
    end
    
   always @(posedge USER_CLK)
    begin
        if(((r_CNT2 == 2'd3) || s_tlast) & s_tvalid)
            r_STDATA_1   <= r_s_tdata_tmp;
        else
            r_STDATA_1   <= r_STDATA_1;
    end  
    

简单记录一下该方法,后面还要用到,还需要在好好理解一下,尤其是转换前后tready信号,还是不大懂。

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

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

相关文章

android display 杂谈(三)WMS

用来记录学习wms&#xff0c;后续会一点一点更新。。。。。。 代码&#xff1a;android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中&#xff0c;调用run方法。 private void run() { // Initialize native services.初始化服务&#xff0c;加载andro…

路由器基础(八):策略路由配置

在实际网络应用中&#xff0c;策略路由也是一种重要的技术手段。尽管 在考试并不注重策略路由&#xff0c;但是实际上应用较多&#xff0c;建议考生除了掌握基本的静态路由协议IP route-static, 动态路由协议RIP 、OSPF的基础配置外&#xff0c;还要掌握如何配置策略路由。…

JavaScript事件委托原理详解!

通过JavaScript事件的冒泡来动态为元素绑定事件的方法称为事件委托&#xff08;Event Delegation&#xff0c;也称为“事件代理”&#xff09;&#xff0c;是 JavaScript 中最热门的技术之一&#xff0c;在笔试和面试中是常考察的重点知识点&#xff0c;今天来简单介绍一下相关…

成人听力筛查的现状

作者&#xff1a;兰明&#xff0c;医学硕士&#xff0c;听力学博士&#xff0c;听觉健康门诊主任。 你有听力障碍吗&#xff1f;你的家人有听力障碍吗&#xff1f;如果有人提出这样的问题&#xff0c;你的回答多数都是“真不知道”。为什么&#xff1f; 因为我们缺乏成人…

【C语法学习】10 - printf()函数

文章目录 1 函数原型2 参数2.1 格式字符串2.1.1 字面文本量2.1.2 转义序列2.1.3 转换说明2.1.3.1 类型2.1.3.2 类型长度2.1.3.3 精度2.1.3.4 最小宽度2.1.3.5 标志 2.2 参数列表2.3 转换说明和参数列表的关系 3 返回值 1 函数原型 printf()&#xff1a;将格式化输出发送至标准…

毅速丨3D打印在零件修复上潜力巨大

随着科技的飞速发展&#xff0c;3D打印技术逐渐渗透到各个领域&#xff0c;在零件修复方面&#xff0c;3D打印也展现出巨大的潜力和优势。 3D打印技术是一种基于数字模型文件的制造技术&#xff0c;采用逐层堆积材料的方式来制造物体。它具有制造复杂形状零件的能力&#xff0c…

腾讯云3年/5年特惠云服务器购买入口及攻略

腾讯云是腾讯旗下云计算品牌&#xff0c;为了吸引用户经常推出各种优惠活动&#xff0c;最吸引用户的还是特惠云服务器&#xff0c;下面给大家分享腾讯云3年/5年时长特惠服务器购买入口及教程&#xff01; 购买入口&#xff1a;传送门>>> 购买攻略&#xff1a; 进入…

阿里云免费服务器

文章目录 最近的阿里云活动By the way在云服务器ECS上搭建个人网站正文补充:定期释放补充:不知道阿里云服务器的密码怎么办?成果补充&#xff1a;怎么找到实例操作的后台&#xff1f;补充&#xff1a;怎么查看服务器到期时间&#xff1f; 究竟白嫖了多少&#xff1f;最后&…

TCP的滑动窗口和拥塞控制

目录 滑动窗口 1.发送窗口和接收窗口 2.滑动窗口的分类 停止等待协议&#xff1a;发送窗口大小 1&#xff0c; 接收窗口大小 1 后退N帧协议&#xff08;GBN&#xff09;&#xff1a;发送窗口大小 > 1&#xff0c;接收窗口大小 1 选择重传协议&#xff08;SR&#xf…

【计算机网络笔记】传输层——TCP的可靠数据传输

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

逆袭Flutter? Facebook 发布全新跨平台引擎 Hermes!

Facebook 于前日发布了新的 JavaScript 引擎&#xff1a;Hermes&#xff0c;专注于提高 React Native 应用的性能&#xff0c;并且在市面上那些内存较少、存储速度较慢且计算能力低下的移动设备上都有良好的表现。但是不是为了追赶Flutter&#xff1f;这块作者没有说明。 移动应…

XXL-JOB默认accessToken身份绕过RCE漏洞复现 [附POC]

文章目录 XXL-JOB默认accessToken身份绕过RCE漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 XXL-JOB默认accessToken身份绕过RCE漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从…

python模块的介绍和导入

python模块的介绍和导入 概念 在Python中&#xff0c;每个Python代码文件都是一个模块。写程序时&#xff0c;我们可以将代码分散在不同的模块(文件)中&#xff0c;然后在一个模块中引用另一个模块的内容。 导入格式 1、在一个模块中引用(导入)另一个模块可以使用import语句…

海康Visionmaster调试脚本:对脚本进行调试的方法

第一步&#xff0c;在脚本模块中使用导出工程功能&#xff0c;将模块中的代码导出 第二步&#xff0c;找到导出的工程&#xff0c;并打开 第三步&#xff0c;生成解决方案&#xff0c;设置断点&#xff0c;点击 VS 菜单调试中的附加到进程&#xff0c;选择 ShellModuleManage…

六氟化硫气体监测装置单位VOL%/LEL%/PPM分别是什么意思?

我们在使用六氟化硫等气体监测装置仪器时&#xff0c;经常看到VOL%、LEL%、PPM等单位&#xff0c;以及仪器中反复性、响应时间、灵敏度等这些词在气体检测仪中代表什么意思呢&#xff1f;今天主要给大家解释气体检测仪一些常见的单位及常用术语的意思。 一、常见单位 &#xff…

VSCode实用远程主机功能

作为嵌入式开发者&#xff0c;经常在各种系统平台或者开发工具之间切换&#xff0c;比如你的代码在Linux虚拟机上&#xff0c;如果不习惯在Linux下用IDE&#xff0c;那么我尝试将Linux的目录通过samba共享出来&#xff0c;在windows下用网络映射盘的方式映射出来&#xff0c;VS…

关于股价比较好的预测方案,仅供参考

1&#xff0c;导包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import keras 2&#xff0c;读取数据 data pd.read_csv(000300.SH.csv) shszdata.rename(columns{收盘价(元):Close,"日期":"Date"}) 3&#xff0c;均值预测法…

代码随想录打卡第六十天|● 739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度 题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来…

东北大学python大作业

目前金属矿开采&#xff0c;爆破还是主要的破岩方式&#xff0c;为了保证巷道采场的安全&#xff0c;需要对爆破震动进行监测&#xff0c;获取的监测数据如附件&#xff0c;第1列数据为震动的序号&#xff0c;第2、3、4列为x,y,z三个方向的震动速度&#xff0c;往往由于各种因素…