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发送? 如何处理呢?(并行?)

posted @ 2023-02-04 13:16  天下大任望君莫辞  阅读(90)  评论(0编辑  收藏  举报