数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)
大家好我是酸菜鱼,这个系列着重讲解数字IC或FPGA实习面试及秋招面试的高频手撕代码题 。
往期手撕代码题:
数字ic手撕代码-导览目录 - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-分频器(任意奇数分频) - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-序列检测(状态机写法) - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-分频器(任意小数分频) - 哔哩哔哩 (bilibili.com)
......
完全内容,请前往导览目录查看。
数据位宽转换器:
数据位宽转换器,一般常用于模块接口处,比如一个电路模块的输出数据位宽大于另一个模块的输入数据位宽,此时就需要进行数据位宽转换。比如SATA控制器中,内部数据位宽为32bit,但外部物理收发器PHY的接口通常为16bit,或者8bit,在不使用FIFO进行缓存的情况下,可以使用数据位宽转换器,通过时钟倍频在实现数据位宽的转换。
1.由宽到窄的数据转换
假设数据从模块A传入到模块B,模块A的输出数据为32位,模块B的输入数据位宽为16位,那么如何能把数据从A传入B而不损失数据呢。
答:通过时钟的分频与倍频实现。
我们假设一个原时钟clk1,通过二分频,把原时钟变为时钟clk2,那么clk2的时钟周期就是clk1的两倍。在clk2的上升沿,我们读入32bit数据,在clk2x的上升沿我们输出16bit数据,由于clk1的频率是clk2的两倍,每读入一次32bit数据,就会输出两次16bit数据,从而实现了数据位宽的转换,如图:


代码:

Testbench:

波形:

2.由窄到宽的数据转换
由窄到宽的数据位宽转换原理和由宽到窄的是一样的。把频率高一点的时钟用来采样16bit数据,频率低一点的时钟用来输出32bit数据。
代码:

Testbench:

波形:

位宽转换的核心就在于生成一个与原时钟成比例关系的时钟,这样时钟频率的比例关系就可以和数据的位宽扯上联系。