MCDF实验——Lab0

2023-11-20

一、MCDF功能描述

该设计我们称之为多通道数据整形器(MCDF,multi-channel data formatter),它可以将上行(uplink)多个通道数据经过内部的FIFO,最终以数据包(data packet)的形式送出。
由于上行数据和下行数据的接口协议不同,我们也将在后面的接口描述和时序部分进一步讲解。此外,多通道数据整形器也有寄存器的读写接口,可以支持更多的控制功能。

二、设计结构

在这里插入图片描述
从上图的MCDF结构来看主要可以分为如下几个部分:

  • 上行数据的通道从端(Channel Slave),负责接收上行数据,并且存储到其FIFO中。
  • 仲裁器(Arbiter)可以选择从不同的FIFO中读取数据,进而将数据进一步传送至整形器(formatter)。
  • 整形器(Formatter)将数据按照一定的接口时序送出至下行接收端。
  • 控制寄存器(Control Registers)有专用的寄存器读写接口,负责接收命令并且对MCDF的功能做出修改。

三、接口描述

1、系统信号接口

  • CLK(0):时钟信号。
  • RSTN(0):复位信号,低位有效。

2、通道从端接口

  • CHx_DATA(31:0):通道数据输入。
  • CHx_VALID(0):通道数据有效标志信号,高位有效。
  • CHx_READY(0):通道数据接收信号,高位表示接收成功。

3、整形器接口

  • FMT_CHID(1:0):整形数据包的通道ID号。
  • FMT_LENGTH(4:0):整形数据包长度信号。
  • FMT_REQ(0):整形数据包发送请求。
  • FMT_GRANT(0):整形数据包被允许发送的接受标示。
  • FMT_DATA(31:0):数据输出端口。
  • FMT_START(0):数据包起始标示。
  • FMT_END(0):数据包结束标示。

4、控制寄存器接口

  • CMD(1:0):寄存器读写命令。
  • CMD_ADDR(7:0):寄存器地址。
  • CMD_DATA_IN(31:0):寄存器写入数据。
  • CMD_DATA_OUT(31:0):寄存器读出数据。

四、接口时序

1、通道从端接口时序

在这里插入图片描述
当valid为高时,表示要写入数据。如果该时钟周期ready为高,则表示已经将数据写入;如果该时钟周期ready为低,则需要等到ready为高的时钟周期才可以将数据写入。

2、整形器接口时序

在这里插入图片描述

  • 整形器发送数据是按照数据包的形式发送的,可以选择数据包的长度有4、8、16和32。整形器必须完整发送某一个通道的数据包后,才可以转而准备发送下一个数据包,在发送数据包期间,fmt_chid和fmt_length应该保持不变,直到数据包发送完毕。
  • 在整形器准备发送数据包时,首先应该将fmt_req置为高,同时等待接收端的fmt_grant。当fmt_grant变为高时,应该在下一个周期将fmt_req置为低。fmt_start也必须在接收到fmt_grant高有效的下一个时钟被置为高,且需要维持一个时钟周期。在fmt_start被置为高有效的同一个周期,数据也开始传送,数据之间不允许有空闲周期,即应该连续发送数据,直到发送完最后一个数据时,fmt_end也应当被置为高并保持一个时钟周期。
  • 相邻的数据包之间应该至少有一个时钟周期的空闲,即fmt_end从高位被拉低以后,至少需要经过一个时钟周期,fmt_req才可以被再次置为高。

3、控制寄存器接口时序

在这里插入图片描述
在控制寄存器接口上,需要在每一个时钟解析cmd。当cmd为写指令时,需要把数据cmd_data_in写入到cmd_addr对应的寄存器中;当cmd为读指令时,即需要从cmd_addr对应的寄存器中读取数据,并在下一个周期,将数据驱动至cmd_data_out接口。

五、寄存器描述

1、地址0x00 通道1控制寄存器 32bits 读写寄存器

  • bit(0):通道使能信号。1为打开,0位关闭。复位值为1。 bit(2:1):优先级。0为最高,3为最低。复位值为3。
  • bit(5:3):数据包长度,解码对应表为, 0对应长度4,1对应长度8,2对应长度16,3对应长度32,其它数值(4-7)均暂时对应长度32。复位值为0。
  • bit(31:6):保留位,无法写入。复位值为0。

2、地址0x04 通道2控制寄存器 32bits 读写寄存器

同通道1控制寄存器描述。

3、地址0x08 通道3控制寄存器 32bits 读写寄存器

同通道1控制寄存器描述。

4、地址0x10 通道1状态寄存器 32bits 只读寄存器

  • bit(7:0):上行数据从端FIFO的可写余量,同FIFO的数据余量保持同步变化。复位值为FIFO的深度数。
  • bit(31:8):保留位,复位值为0。

5、地址0x14 通道2状态寄存器 32bits 只读寄存器

同通道1状态寄存器描述。

6、地址0x18 通道3状态寄存器 32bits 只读寄存器

同通道1状态寄存器描述。

六、使用Questasim进行仿真

  1. 首先将这4个设计文件导入到创建好的Project里面

要注意设计文件的路径名不能有中文名
在这里插入图片描述
2. 编译设计文件
在这里插入图片描述
3. 仿真tb文件
在work库里面找到编译好的tb文件,右键进行仿真
在这里插入图片描述
在这里插入图片描述
4. 添加信号波形
选中dut中所有in、out端口信号,右键add ware
在这里插入图片描述
命令窗口执行“run 1us”
在这里插入图片描述

在这里插入图片描述

分析波形
当ch0_data_i要发送数据的时候,波形由x变成了00c00000,同时ch0_valid_i信号由x变成了1,代表发送数据有效,ch0_ready_o也拉高,代表已经准备好接受数据。
在这里插入图片描述
当把数据送进入之后,ch0_margin_o信号的值由20变成1f,是因为当送入一个数据之后fifo的余量减少了一个。
在这里插入图片描述

在这里插入图片描述
当mcdt_data_o把数据送出的时候,fifo余量就会加1,从1f又变成了20。
在这里插入图片描述
整体来看显示通道1发送数据,再是通道2发送数据,最后是通道3发送数据。
在这里插入图片描述
分析设计文件代码

时钟5ns一翻转,也就是时钟周期是10ns

// clock generation
initial begin 
  clk <= 0;
  forever begin
    #5 clk <= !clk;
  end
end

复位信号在仿真开始10ns时置0,等待10个时钟周期后,也就是在10ns+100ns=110ns时置1。

// reset trigger
initial begin 
  #10 rstn <= 0;
  repeat(10) @(posedge clk);
  rstn <= 1;
end

在这里插入图片描述
在这里插入图片描述

然后开始发送数据,通道1先发送。等待复位信号拉高时,再等待5个时钟周期,即第6个周期的上升沿才开始发送数据。也就是说110ns+5*10ns+5ns=165ns时发送数据。此时ch0_valid_i置1,同时把数据写入进去。

// data test
initial begin 
  @(posedge rstn);
  repeat(5) @(posedge clk);
  // channel 0 test
  chnl_write(0, 'h00C0_0000);
  chnl_write(0, 'h00C0_0001);
  chnl_write(0, 'h00C0_0002);
  chnl_write(0, 'h00C0_0003);
  chnl_write(0, 'h00C0_0004);
  chnl_write(0, 'h00C0_0005);
  chnl_write(0, 'h00C0_0006);
  chnl_write(0, 'h00C0_0007);
  chnl_write(0, 'h00C0_0008);
  chnl_write(0, 'h00C0_0009);
// channel write task
task chnl_write(input reg[1:0] id, input reg[31:0] data); 
  case(id)
    0: begin
      @(posedge clk);
      ch0_valid <= 1;
      ch0_data <= data;
      @(posedge clk);
      ch0_valid <= 0;
      ch0_data <= 0;
    end
    1: begin
      @(posedge clk);
      ch1_valid <= 1;
      ch1_data <= data;
      @(posedge clk);
      ch1_valid <= 0;
      ch1_data <= 0;
    end
    2: begin
      @(posedge clk);
      ch2_valid <= 1;
      ch2_data <= data;
      @(posedge clk);
      ch2_valid <= 0;
      ch2_data <= 0;
    end
    default: $error("channel id %0d is invalid", id);
  endcase
endtask


在这里插入图片描述
在下一拍的时候,会将ch0_valid_i置0,所以从波形上看,相邻的数据之间valid拉低,有一个无效的数据,处于idle的状态。
在这里插入图片描述

当ch0_valid被赋值以后,接下来就会对dut待测设计的输入做操作了。

mcdt dut(
   .clk_i(clk)
  ,.rstn_i(rstn)
  ,.ch0_data_i(ch0_data)
  ,.ch0_valid_i(ch0_valid)
  ,.ch0_ready_o(ch0_ready)
  ,.ch0_margin_o(ch0_margin)
  ,.ch1_data_i(ch1_data)
  ,.ch1_valid_i(ch1_valid)
  ,.ch1_ready_o(ch1_ready)
  ,.ch1_margin_o(ch1_margin)
  ,.ch2_data_i(ch2_data)
  ,.ch2_valid_i(ch2_valid)
  ,.ch2_ready_o(ch2_ready)
  ,.ch2_margin_o(ch2_margin)
  ,.mcdt_data_o(mcdt_data)
  ,.mcdt_val_o(mcdt_val)
  ,.mcdt_id_o(mcdt_id)
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MCDF实验——Lab0 的相关文章

  • 应用在多媒体触摸屏设备中的触摸感应芯片

    多媒体触摸屏设备是触摸液晶显示器结合现代PC机组成的具有触摸显示和计算机操作功能为一体的产品 它包括两个部分 一个是触摸液晶显示器 它具有触控的特性和显示输出的功能 另一个是PC机 也就是所说的计算机 通过两个部分整合到一起 实现了具有触摸
  • 应用在多媒体触摸屏设备中的触摸感应芯片

    多媒体触摸屏设备是触摸液晶显示器结合现代PC机组成的具有触摸显示和计算机操作功能为一体的产品 它包括两个部分 一个是触摸液晶显示器 它具有触控的特性和显示输出的功能 另一个是PC机 也就是所说的计算机 通过两个部分整合到一起 实现了具有触摸
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • System Verilog fork join - 实际上不是并行的?

    我正在学习系统verilog 并认为为每个进程创建单独的线程fork join 但是 我发现如果我有一个while在我的第一个进程中循环 我的第二个进程没有启动 这让我想到fork join实际上并不平行 class A task run
  • System Verilog 中的覆盖点

    是否可以根据参数从特定组中排除某些覆盖点 covergroup NEW string for exclusion clk option per instance 1 option comment for exclusion apples c
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • 在断言中使用“sequence.triggered”时重置感知

    我有一些断言使用triggered序列的性质 这对于检查 当 X 发生时 Y 一定在过去的某个时间发生 形式的属性很有用 让我们举一个简单的例子 给定三个信号 a b and c c仅允许在以下情况下走高 a3 个周期前为高 并且b2 个周
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 在逻辑中使用单端端口期待差异对?

    我使用的逻辑被设置为需要一个差分对时钟端口 然而 对于一个特定的应用程序 我只能输入一个单端时钟 由于硬件限制 修改逻辑以接受单端时钟不是一种选择 因为涉及许多文件和代码行 有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口
  • UVM 测试平台 - 将两个不同驱动程序连接到同一接口的“UVM”方式是什么?

    在我的测试平台中 我有一个需要驱动的接口 该接口可以以两种不同的模式驱动 每种模式都有自己的驱动程序协议和事务类型 到目前为止 我已经分别设计了两个 uvm agents 现在 我需要一种方法来交换其中一个或另一个 具体取决于我正在运行的测
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 如何使用 Verilog 和 FPGA 计算一系列组合电路的传播延迟?

    我是 FPGA 和 HDL 的新手 但我正在尝试学习 但无法弄清楚这一点 如何通过多个级别的组合逻辑来计算或估计传播延迟 我可以仅凭经验确定这一点 还是可以在设计时弄清楚 在这种情况下 我使用 FPGA 来实现奇偶校验设置和检查电路 该电路
  • 始终块中的 Veriloggenerate/genvar

    我试图让一个模块通过 ISE 12 4 中的语法检查 但它给了我一个我不明白的错误 首先是代码片段 parameter ROWBITS 4 reg ROWBITS 1 0 temp genvar c generate always pose
  • 标识符必须用端口模式声明:busy。 (Verilog)

    我有如下所示的 Verilog 代码 当我编译它时 我收到以下错误消息 并且代码的第一行突出显示 Error 标识符必须用端口模式声明 busy Code module main clk rst start busy ready cnt s
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • verilog 中的案例陈述

    我遇到了优先级编码器设计 并找到了一种使用 case 语句来实现它的新方法 唯一令人困惑的是 case语句是否优先考虑case 例子 case 1 b1 A 3 Y lt 4 b1000 A 2 Y lt 4 b0100 A 1 Y lt
  • Verilog 按位或 ("|") 单子

    我见过 Verilog 代码 其中使用了按位或运算符 目的是什么 例如 address 15 14 0 or address 15 14 io din ramrd 不能省略 吗在这些情况下 在这种情况下 它充当归约运算符 例如 4 b100
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐

  • CSDN平台上怎么样才能赚钱?

    CSDN平台上有多种方式可以赚钱 以下是其中几种常见的 1 写作赚钱 CSDN平台鼓励用户积极创作原创技术博客 通过博客的阅读量和转发量来获取广告收益 用户还可以发表付费文章或参与付费专栏 在文章的阅读量和付费订阅量上获得收入 2 交流赚钱
  • java使用visio画类图,【什么是类图使用类图的方法】使用visio画类图

    类图是显示了模型的静态结构 特别是模型中存在的类 类的内部结构以及它们与其他类的关系等 那么你对类图了解多少呢 以下是由小编整理关于什么是类图的内容 希望大家喜欢 类图的概述 类图 Class diagram 由许多 静态 说明性的模型元素
  • 【数据结构--二叉树】平衡二叉树

    题目描述 代码实现 Definition for a binary tree node struct TreeNode int val struct TreeNode left struct TreeNode right int TreeH
  • Could not proxy request /captchaImage from localhost to http://localhost:8080/.

    项目场景 项目场景 配置若依环境前端通过 run npm dev 启动报500 问题描述 根据报错分析 无法将请求 路径 从本地主机代理到http 本地主机 8080 原因分析 我们可以看到前端配置的端口号80 地址就是本机没有问题 排除前
  • 变分模态分解(VMD)运算步骤及源码解读

    1 简述 VMD的目标是将实值输入信号 f f f分解为离散数量的子信号 模态 u k u k uk 我们先假设每个模态在一个中心频率
  • Axure谷歌Chrome浏览器插件安装教程

    1 引言 经常看到这样的问题 1 我用Axure做的原型怎么不能用谷歌浏览器查看 2 到哪里下载Axure谷歌浏览器插件 3 Axure谷歌浏览器插件下载下来怎么安装 其实这些问题百度一下都能找到答案 不过有些答案对于新手来说比较麻烦 就拿
  • c语言函数中调用的参数太多

    c语言函数中调用的参数太多问题 问题展示 问题分析 解决方法 问题展示 图中是我遇到的情况 问题分析 大家可以看到 在函数中 指针变量和后面的整数变量都成了灰色 解决方法 图中问题只需将中文逗号 改为英文逗号即可 一定要检查双引号或者逗号是
  • QT中使用Sqlite

    QT中使用Sqlite 首先要在 pro中引用sql 引用方法 新添加语句 QT sql 在原来的基础上追加 QT core gui sql 然后再widget h中添加对sql头文件的引用 include
  • idea connect timed out 解决方法

    使用IntelliJ IDEA 创建Spring Boot项目时 显示 connect timed out 解决方法 1 很多博客说将 https start spring io 改为 http start spring io 但是我这里不
  • 手动切换 Kinect 的驱动程序(for OpenNI 1.* & Microsoft Kinect SDK 1.7)

    微软最近推出了最新版的 Kinect SDK 能够实现实时的 Kinect Fusion 并提供了丰富的手势交互功能 对体感交互开发人员的吸引力越来越大 而 OpenNI 2 0 以上的版本也转为使用微软官方的 Kinect 驱动 也显示了
  • 移动端适配-01-百分比宽度

    1 图片可以在parent中使用 1 line heigh和text align使水平和竖直居中 2 在img标签中加vertical align middle 2 3 background size 1 两个参数 background s
  • Ubuntu18.04安装cuda10.1+cudnn8.0.5+pytorch1.8.1【亲测~】

    Ubuntu18 04安装cuda10 1 cudnn8 0 5 pytorch1 8 1 亲测 目录 第一步 Cuda10 1的安装 第二步 Cudnn8 05的安装 1 进入官网 https developer nvidia com r
  • [思维模式-15]:《复盘》-3- “行”篇 - 操作复盘- 个人复盘

    目录 前言 一 将军不是教出来的 而是打出来的 二 复盘是能力提升的有效方式 三 对什么进行个人复盘 1 新的事 2 重要的事 3 有价值的事 4 按照规范 惯例处置不太奏效的事件 未达预期的事 四 个人复盘的两种操作手法 1 自我简易复盘
  • cisco 小型园区与网络的构建及其应用

    一 实验目的 熟练构建小型区域网络 二 实验设备 Cisco 2811 路由器 6台 cisco 3650 交换机 6台 cisco 2960 交换机7台 pc机8台 服务器6台 数据线缆若干 三 实验拓扑 四 实验步骤
  • applicationContext.xml第一行无缘无故报错!!!

    eclipse的bug 在projects里clean一下 就好了 右键project的validate不管用
  • python实现OCR识别图片验证码

    用cv2模块读取和显示模块 导包cv2拓展模块 import cv2 先给窗体起名字 cv2 namedWindow ShowImage1 cv2 namedWindow ShowImage2 image1 cv2 imread img01
  • 04757信息系统开发与管理2011版考试大纲思维导图

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 不考 思维导图下载地址 MindMaster绘制 链接 https pan baidu com s 1U BRcRyUgZ8QUqlDuOLy w pwd qwzt 提
  • 通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题

    通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题 问题 当 raft group 发生脑裂的情况下 老的 raft leader 可能在一段时间内并不知道新的 leader 已经被选举出来 这时候
  • C语言冒泡排序和选择排序

    一 冒泡排序法 假设从小到大排序 例一数组 int arr 2 1 34 5 arr 0 先跟相邻的arr 1 比较大小 如果比它大则交换两个数值位置 大的数值放在后面 然后比较arr 1 和arr 2 的大小 以此类推 直至第n 2个和第
  • MCDF实验——Lab0

    MCDF实验 一 MCDF功能描述 二 设计结构 三 接口描述 1 系统信号接口 2 通道从端接口 3 整形器接口 4 控制寄存器接口 四 接口时序 1 通道从端接口时序 2 整形器接口时序 3 控制寄存器接口时序 五 寄存器描述 1 地址