我试图在每个时钟周期设计一个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时实现这个功能?如果是这样,有人可以指向我的高级解决方案或一些相关的阅读,所以我可以更好地理解这个概念。我想如果我在高层次上理解,那么我就可以对其进行编码,但目前我甚至不确定我需要编码。
由于 扎克
答案 0 :(得分:0)
既然你要求高水平,我会给出一个可能有用的伪代码示例,或者至少让你前进。
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++
现在在always块中执行此顺序代码,您应该设置。
注意:这个合成结果看起来并不是很明显,但我怀疑它会产生相当多的硬件。
答案 1 :(得分:0)
我有类似但不完全的东西。
将数据输入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
......等等......
当您移位时,使用FIFO读取启用读取下一个字。 请注意,当FIFO为空但不停止管道时需要注意,因此已经存在的数据会继续移出。
不确定它有多复杂,因为我稍微掩饰了它。