我正在尝试设计一个系统,该系统在每个时钟周期中采用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为空时,您将需要照顾好管道,因此已经存在的数据继续移出。
不确定我在它上掩盖了一点时会变得多么复杂。