Verilog:对齐来自动态输入的有效和无效字节
Verilog: Aligning valid and invalid bytes from a dynamic input
我正在尝试设计一个系统,每个时钟周期接受一个 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来实现这个功能?如果是这样,有人可以指出我的高级解决方案或一些相关阅读,以便我更好地理解这个概念。我想如果我在高层次上理解,那么我就可以尝试编码,但目前我什至不确定我需要编码什么。
谢谢
扎克
既然你要求高水平,我会给出一个可能有用的东西的伪代码示例,或者至少让你继续。
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 块中执行此顺序代码,您应该已设置好。
注意:我不太清楚合成结果的外观,但我怀疑它会生成相当多的硬件。
我有一些类似但不完全相同的东西。
将数据输入到一个 FIFO 中,pre-calculate一个 byte-enable 与 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 为空但不停止管道时,您需要注意,以便继续移出已经存在的数据。
不确定它会有多复杂,因为我略微掩饰了它。
我正在尝试设计一个系统,每个时钟周期接受一个 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来实现这个功能?如果是这样,有人可以指出我的高级解决方案或一些相关阅读,以便我更好地理解这个概念。我想如果我在高层次上理解,那么我就可以尝试编码,但目前我什至不确定我需要编码什么。
谢谢 扎克
既然你要求高水平,我会给出一个可能有用的东西的伪代码示例,或者至少让你继续。
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 块中执行此顺序代码,您应该已设置好。
注意:我不太清楚合成结果的外观,但我怀疑它会生成相当多的硬件。
我有一些类似但不完全相同的东西。
将数据输入到一个 FIFO 中,pre-calculate一个 byte-enable 与 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 为空但不停止管道时,您需要注意,以便继续移出已经存在的数据。
不确定它会有多复杂,因为我略微掩饰了它。