Verilog:从动态输入中对齐有效和无效字节



我正在尝试设计一个系统,该系统在每个时钟周期中采用8个字节数据输入和8位有效输入,其中有效输入上的每个位都能验证或无效数据字节。

input wire [63:0] d_in;
input wire [7:0]  v_in;

该程序应处理D_IN对齐所有有效字节如下。

(其中b是有效的字节,x是无效的字节)

实例1:

d_in = B1 B2 X X B3 X B4 B5
d_out = B1 B2 B3 B4 B5 X X X

实例2:

d_in = X B1 B2 B3 X B4 B5 B6
d_out = B1 B2 B3 B4 B5 B6 X X

我主要使用算法工作,在所有迭代中,所有位操作都是相同的,例如assign d_out [7:0] = d_in [15:8];但是,有效字节的数量和顺序可以随着每个数据输入而更改的事实,这意味着无法使用此策略。

我的问题:

有没有办法在使用Verilog或VHDL方面实现此功能?如果是这样,有人可以将我指向高级解决方案或一些相关的阅读,以便我可以更好地理解这个概念。我认为,如果我了解高水平,那么我将能够进行编码,但目前我什至不确定我需要编码什么。

谢谢zach

,由于您要求高水平,我将给出一个可能有效或至少让您前进的伪代码示例。

d_out = '0; //Assuming that the X bytes can be set to zero in the output.
bytes = 0;
for i in range(8)
 if v_in[i]
   d_out[bytes*8 +: 8] = d_in[i*8 +: 8] //Note the +: notation which is not pseudo, but verilog.
   bytes++

现在在始终块中执行此顺序代码,您应该设置。

注意:我的综合结果对我来说并不清楚,但我怀疑它会产生很多硬件。

我有类似的东西,但不完全。

将数据输入到FIFO中,预计与FIFO条目的字节启用。在输出侧,读取字节启用部分,并使用它移出字节。因此,只有八个条件可以满足字节启用...

1 byte, byteEn(0 downto 1) = "10", shift left 1 byte
2 bytes, byteEn(0 downto 2) = "110", shift left 2 bytes
3 bytes, byteEn(0 downto 3) = "1110", shift left 3 bytes

...等等...

移动时,使用FIFOS读取启用在下一个单词中读取。请注意,当FIFO为空时,您将需要照顾好管道,因此已经存在的数据继续移出。

不确定我在它上掩盖了一点时会变得多么复杂。

最新更新