前言: 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发送? 如何处理呢?(并行?)
标签:数据,发送,实验,寄存器,MCDF,时钟,数据包,通道 From: https://www.cnblogs.com/Dukefish/p/17091170.html