我正在使用串行协议。消息的长度可变,事先已知。在发送和接收方面,我将消息保存到移位寄存器中,该消息与可能的最长消息一样长。 我需要尽可能快地计算这些寄存器的CRC32,与以太网相同。由于消息是可变长度的(从12到64位),我选择了串行实现,它应该与接收/传输消息并行运行。
在计算之前我遇到了数据组织的问题。根据指定的here,数据需要进行位反转,填充32个零并在计算前进行补充。
即使我忘记了与接收或传输数据并行运行的部分,我怎样才能有效地从最大长度寄存器中获取相关信息,以便我可以在计算之前填充它?我知道像
这样的想法newregister[31:0] <= oldregister[X:0] // X is my variable length
不能工作。我也不可能使用generate for循环子句来对旧向量运行变量进行位反转。我可以使用计数器将数据串行移动到所需的长度,但我不能失去这么多时间。
或者,是否有一个直接给我填充和补充结果的操作?我甚至不知道如何开始这样的想法。
提前感谢任何见解。
答案 0 :(得分:0)
由于X
是可用的,因此您需要使用for循环进行位分配。 for循环必须位于always块内,for循环必须静态展开(即起始索引,结束索引和步长值必须是常量)。
for(i=0; i<32; i=i+1) begin
if (i<X)
newregister[i] <= oldregister[i];
else
newregister[i] <= 1'b0; // pad zeros
end
答案 1 :(得分:0)
你误解了如何进行串行CRC;你引用的Python问题是不相关的。您只需要一个32位移位寄存器,并带有适当的反馈抽头。如果您在Google上搜索“serial crc”或“ethernet crc”,您将获得100万次点击。至少有一个Xilinx应用笔记可以为您完成整个过程。您需要注意使用正确的值预加载32位寄存器,以及是否在完成时反转32位数据。
修改的
'xilinx serial crc'的首次亮相是xapp209,它的基本答案如图1所示。除此之外,您需要点击,预加载值,是否反转答案,以及值检查接待。我相信他们曾经在另一个应用笔记中做过这一切,但我现在找不到它。基本参考是以太网802.3规范(3.2.8帧校验序列字段,原始书中的p27)和V42规范(8.1.1.6.2 32位帧校验序列,旧CCITT蓝色中的第311页)书)。两者都给了水龙头。 V42要求所有1的预加载,反转完成,并在接收时给出测试值。 Warren在Hacker's Delight中有一个(新的)章节,它以图形方式显示了点击;看他的网站。
您只需要在线生成器来检查您的解决方案。但要小心:它们通常具有不同的预加载值,可能会或可能不会反转结果,并且可能会或可能不会反转。