提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
MCDF功能描述:
多通道数据整形器(MCDF,multi-channle data formatter),它可以将上行(uplink)多个通道数据经过内部的FIFO,最终以数据包(data packet)的形式送出。
需要注意的是上行数据和下行数据的接口协议不同,此外多通道数据整形器也有寄存器的读写接口,可以支持跟多的控制功能。
设计结构:
1.上行数据的通道从端(Channel Slave),负责接收上行数据,并储存到其FIFO中
2.仲裁器(Arbiter)可以选择从不同的FIFO中读取数据,进而将数据进一步传送至整形器(formatter)
3.整形器(Formatter)将数据按照一定的接口时序送出至下行接收端
4.控制寄存器(Control Registers)有专用的寄存器读写接口,负责接收命令并对MCDF的功能做出修改
提示:以下是本篇文章正文内容,下面案例可供参考
一、MCDT
先从MCDF的子模块channel 和 arbiter的组合MCDT入手,暂不考虑formatter的数据打包功能和寄存器的配置作用
MCDT由三个slave channel 和一个arbiter构成,作用类似于一个多路选择器,结构如下:
图片引自@changshengqiu
新建project将实验文件导入。编译并仿真。添加信号波形,仿真1us,观察波形输出。
可以看到三个slave channel,以及时钟信号和复位信号的值,如果是输入端口则为高阻态z,而输出端口是不定态x。
二、添加验证文件
添加验证文件tb1.v,编译仿真。
在tb1.v中已经给出了基本测试代码。它通过调用任务 chnl_write 使用case分支语句分别对channel0,channel1,channel2进行了数据输入
根据测试代码,在复位信号 rstn 的上升沿触发后,等待5个时钟周期再开始数据输入测试。
仿真波形如下:
二、分析波形
1.复位信号
2.各个channel信号
channel0信号
之所以经过6个周期而不是5个原因在于task chnl_write开始时需要等待一次上升沿,这个上升沿同时规定了之后chnl1与chnl0发送数据的间隔时间是一个时钟周期。
数据完整写入
channel1信号
与chnl0最后一个数据间隔1个周期
数据同样完整写入
channel2信号
观察三个通道发送的数据可以发现他们是串行发送的。
3.arbiter输出端信号
valid有效期内(高电平期间)输出data,每次发送2个数据,且显示对应的输入通道id,串行输出。
拓展
连续发送
- 如何使每个通道的数据在arbiter连续发送?
问题出在这里:
保持ch0_valid拉高即可使数据连续发送。
但是仲裁器的输出端有些问题
原因:由于chx_valid一直保持着拉高的状态chnl1和chnl2最后一次发送的数据持续发送
可以在调用完最后一次chnl_write后对valid和data置0
这样仲裁器的输出就是连续的了。
并行发送
- 如何使三个channel的数据同时向arbiter发送?
在解决完连续输出的问题后接着是并行发送。可以从上图看到3个channel的数据是串行发送的。
将三个channel的测试代码分别放到相同的initial块中:
仿真波形:可以看到data发送的数据包有误,改一个initial块,将三个channel的测试分别用begin-end块包起来再放入fork-join内,仿真结果依旧不变
这个问题先留着,如果您有想法可以在评论区留言,跪谢!!!
6.19更新
连续发送数据时三个channel的最后一个数据**'h00Cx_009**没有发出来就置0了。可以在这之前添加等待语句等到下一个时钟上升沿再置0.
FIFO的余量显示也有些问题,slave从端数据进入FIFO后,经arbiter仲裁后输出,由原波形可知该过程是一放一拿的过程,FIFO的容量应该是32-31-32-31-32…也许是数据连续发送导致容量的计算方式有误?