MCDF实验0

目录

功能描述

设计结构

从上图中可以看出MCDF的结构如下

接口描述

1.系统信号接口

2.通道从端接口

3.整形器接口

4.控制寄存器接口

接口时序

1.通道从端接口时序

2.整形器接口时序

3.控制寄存器接口时序

寄存器描述:

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

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

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

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

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

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

通过使用 Questasim 来进行仿真,并回答问题

1.其次来看复位 rstn_i 信号:

2.接下来看通道0 channel 的数据发送:

3.再来看整体的数据发送:

问题


前言:整个实验的基础前提必须了解MCDF的功能,故在实验0介绍MCDF的功能描述

功能描述

多通道数据整形器(MCDF,multi-channel data formatter),他可以将上行(uplink)多个通道数据经过内部的FIFO,最终以数据包(data packet)的形式送出。

设计结构

从上图中可以看出MCDF的结构如下

1.上行数据的通道从端(Channel Slave), 负责接收上行数据,并且存储到其FIFO中。

2.仲裁器(Arbiter)可以选择从不同的FIFO中读取数据,进而将数据进一步传送值整形器(formatter)。

3.整形器(Formatter)将数据按照一定的接口时序送出至下行接收端。

4.控制寄存器(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状态寄存器描述。


因为接下来的实验是对MCDF的简化,即只对子模块channel 和 arbiter的MCDT着手,暂时不考虑formatter 的数据打包功能和寄存器的配置作用。因此我们所选择的MCDF的“片段”MCDT即由三个slave channel 和一个 arbiter 构成。从上面的模块功能介绍来看,这个MCDT作用类似于 “MUX”多路选择器,只不过这个选择器无需外部的选择配置,而是会根据slave channel 的数据发起请求来做选择授权,继而将数据送出。其结构如下:

通过使用 Questasim 来进行仿真,并回答问题

运行1us后, 整体的波形如下:

 可以看出三个通道的数据是发送完整了,后面空了一段

1.其次来看复位 rstn_i 信号:

 在10ns 复位信号拉低了

 在105ns 复位信号又拉高了

从代码可以看到:

initial begin
    clk <= 0;
    forever begin
        #5 clk <= !clk;
    end
end
initial begin 
    #10 rstn <= 0;
    repeat(10) @(posedge clk);
    rstn <= 1;
end

 时钟周期是 10ns ,  复位信号在10ns 拉低, 之后在第10个时钟上升沿拉高  故是10ns + 9.5*10ns= 105ns

2.接下来看通道0 channel 的数据发送:

 

 可以看出,发送有效数据时valid = 1, 不发送数据时 valid = 0;

每发送一个数据,空一个时钟周期,再发下一个数据。

并且第一个通道channel 的数据发送是在165ns = 105ns + 6*10ns ,可以看代码:

 可以看到 等待复位信号的上升沿,然后在经过5个时钟上升沿,然后再开始发送数据,也就是下一个时钟上升沿,第6个时钟上升沿开始的时候发送数据。

3.再来看整体的数据发送:

 先发送的通道0的数据,发送完通道1的数据空了一个时钟周期,再发送下一个通道的数据。

问题

1.各个channel 中的数据在输出端口是否完整? 

答: 完整

2.channel的输入数据是否有何特点?如何区分不同channel 的数据内容呢?

答:输入数据是:

通道0: 00C0_0000~00C0_0009

通道1: 00C1_0000~00C1_0009

通道2: 00C2_0000~00C2_0009

数据发送是按顺序发送的,从波形图可以看出,而且每个通道的数据也不一样,第4位代表了通道号

3. arbiter 的输出数据有何特点? 如何区分不同channel 的数据内容呢?

4. 在tb1.v中的测试代码中,哪一个方法是数据激励的基本方法?

5.是否可以每个channel 的数据连续发送? 如何处理呢?(串行?)

6.是否可以让三个channel 的数据同时向arbiter发送? 如何处理呢?(并行?)

剩下的4个问题暂时没想好——后续写

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值