Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

时间:2024-01-17 10:34:50

在使用FIFO_DC的时候,我们知道这个FIFO的一个功能是可以输入输出的数据宽度不一样,比如: 输入数据为128bit,输出数据为16bit,FIFO内部可以实现这样的转换,但是输出的时候是先送出一个数据的高16位呢还是数据的低16bit呢??

最好的验证方法就是实验:

1、建立工程,例化fifo,设置如下:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

在上图的设置中,重点是红色粗方框内,总线命令类型:高位在前低位在后。 另外数据的宽度和深度设置的有点大,只是实验可以小一点。这里就这样设置吧。

设置完成后,跑内部的仿真(自带的仿真)。

先是写数据:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

从图中可以看出在写信号有效的时候,数据先写入个128b的10进制1,然后是2、 3、 4等等,转化为16进制就是上图中的这样,除了最低位为1  2  3  4 其余的高位都是0,这就是说最低的16bit 为 16‘h0001 或 16'h0002、、、、其余的都为16'h0000。为什么化成16bit,而不是8bit,因为输出的数据的宽度是16bit.

写完之后就是读取数据了。

读数据的时序为:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

从上图时序可以看出: 在RdEn有效的时候,数据先出的是16’h0001,然后是16‘h0000,这说明,在输入输出数据宽度不一样的时候,并且总线命令类型为高位在前低位在后,数据输出是先低位再高位的送出。

当然,总线命令类型还有第二种类型: 低位在前高位在后。

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

则生成之后,仍然仿真。

先是写数据:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

和上面一样。

接着读取数据:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

这个截图没做好,左边的信号没有截取进来,不过可以看出,从上到下信号依次是: 读取rdclock,q,rden,从图中可以看出,这次与上次的读取数据是有差别的,

这次是先送出高位,后送出低位的。

这是使用FIFO所要注意的一个地方。

同时在使用低位在前高位在后的时候,他的WCNT和RCNT的数值会乱掉,这里要格外注意。

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

不过可以故意去修正一下:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

修正之后的计数是这样的:

Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项

这样就可以使用了。