Verilog 中的可变长度消息(串行 CRC-32)
Variable length messages in Verilog (serial CRC-32)
我正在使用串行协议。消息的长度是事先已知的。在 t运行 发送端和接收端,我都将消息保存到一个移位寄存器中,该寄存器与最长的消息一样长。
我需要尽快计算这些寄存器的 CRC32,就像以太网一样。由于消息的长度可变(从 12 位到 64 位不等),我选择了应该 运行 已经与消息的 reception/transmission 并行的串行实现。
我 运行 遇到计算前数据组织的问题。按照规定 here ,数据需要进行位反转,用32个零填充并在计算前补足。
即使我忘记了关于 运行ning 与接收或 t运行smitting 数据并行的部分,我如何才能有效地只从最大长度寄存器中获取我的相关消息,以便我可以在计算之前填充它?我知道
这样的想法
newregister[31:0] <= oldregister[X:0] // X is my variable length
不工作。也不可能有我用来对旧向量 运行 可变次数进行位反转的 generate for 循环子句。我可以使用计数器将数据连续移动到所需的长度,但我不能浪费这么多时间。
或者,有没有一种操作可以直接给我填充和补充的结果?我什至不知道如何开始发展这样的想法。
提前感谢您的任何见解。
由于 X
是一个可行的,您将需要使用 for-loop 进行位分配。 for-loop 需要在 always 块内并且 for-loop 必须静态展开(即起始索引、结束索引和步长值必须是常量)。
for(i=0; i<32; i=i+1) begin
if (i<X)
newregister[i] <= oldregister[i];
else
newregister[i] <= 1'b0; // pad zeros
end
您误解了如何进行串行 CRC;您引用的 Python 问题不相关。您只需要一个 32 位移位寄存器和适当的反馈抽头。如果您对 "serial crc" 或 "ethernet crc" 进行 Google 搜索,您将获得一百万次点击。至少有一份 Xilinx 应用说明可以为您完成全部工作。您需要小心地用正确的值预加载 32 位寄存器,以及是否在完成时反转 32 位数据。
编辑
第一个打'xilinx serial crc'的是xapp209,基本答案如图1,除此之外,还需要taps,preload值,是否反转答案,在接待处核对的价值。我敢肯定他们曾经在另一篇应用笔记中做过这一切,但我现在找不到了。基本参考是Ethernet 802.3 spec(3.2.8 Frame check Sequence field,原书p27)和V42 spec(8.1.1.6.2 32-bit frame check sequence,老CCITT Blue的311页)书)。两者都提供水龙头。 V42 需要预加载全 1,完成反转,并在接收时给出测试值。 Warren 在 Hacker's Delight 中有一个(新的)章节,它以图形方式显示了水龙头;查看他的网站。
您只需要在线生成器来检查您的解决方案。但是要小心:它们通常会有不同的预加载值,并且可能会或可能不会反转结果,并且可能会或可能不会 bit-reversed.
我正在使用串行协议。消息的长度是事先已知的。在 t运行 发送端和接收端,我都将消息保存到一个移位寄存器中,该寄存器与最长的消息一样长。 我需要尽快计算这些寄存器的 CRC32,就像以太网一样。由于消息的长度可变(从 12 位到 64 位不等),我选择了应该 运行 已经与消息的 reception/transmission 并行的串行实现。
我 运行 遇到计算前数据组织的问题。按照规定 here ,数据需要进行位反转,用32个零填充并在计算前补足。
即使我忘记了关于 运行ning 与接收或 t运行smitting 数据并行的部分,我如何才能有效地只从最大长度寄存器中获取我的相关消息,以便我可以在计算之前填充它?我知道
这样的想法newregister[31:0] <= oldregister[X:0] // X is my variable length
不工作。也不可能有我用来对旧向量 运行 可变次数进行位反转的 generate for 循环子句。我可以使用计数器将数据连续移动到所需的长度,但我不能浪费这么多时间。
或者,有没有一种操作可以直接给我填充和补充的结果?我什至不知道如何开始发展这样的想法。
提前感谢您的任何见解。
由于 X
是一个可行的,您将需要使用 for-loop 进行位分配。 for-loop 需要在 always 块内并且 for-loop 必须静态展开(即起始索引、结束索引和步长值必须是常量)。
for(i=0; i<32; i=i+1) begin
if (i<X)
newregister[i] <= oldregister[i];
else
newregister[i] <= 1'b0; // pad zeros
end
您误解了如何进行串行 CRC;您引用的 Python 问题不相关。您只需要一个 32 位移位寄存器和适当的反馈抽头。如果您对 "serial crc" 或 "ethernet crc" 进行 Google 搜索,您将获得一百万次点击。至少有一份 Xilinx 应用说明可以为您完成全部工作。您需要小心地用正确的值预加载 32 位寄存器,以及是否在完成时反转 32 位数据。
编辑
第一个打'xilinx serial crc'的是xapp209,基本答案如图1,除此之外,还需要taps,preload值,是否反转答案,在接待处核对的价值。我敢肯定他们曾经在另一篇应用笔记中做过这一切,但我现在找不到了。基本参考是Ethernet 802.3 spec(3.2.8 Frame check Sequence field,原书p27)和V42 spec(8.1.1.6.2 32-bit frame check sequence,老CCITT Blue的311页)书)。两者都提供水龙头。 V42 需要预加载全 1,完成反转,并在接收时给出测试值。 Warren 在 Hacker's Delight 中有一个(新的)章节,它以图形方式显示了水龙头;查看他的网站。
您只需要在线生成器来检查您的解决方案。但是要小心:它们通常会有不同的预加载值,并且可能会或可能不会反转结果,并且可能会或可能不会 bit-reversed.