【问题标题】:Variable length messages in Verilog (serial CRC-32)Verilog 中的可变长度消息(串行 CRC-32)
【发布时间】:2016-01-11 17:43:20
【问题描述】:

我正在使用串行协议。消息的长度是预先知道的。在发送端和接收端,我都将消息保存到尽可能长的移位寄存器中。 我需要尽可能快地计算这些寄存器的 CRC32,就像以太网一样。由于消息是可变长度的(从 12 位到 64 位不等),我选择了应该已经与消息的接收/传输并行运行的串行实现。

我在计算之前遇到了数据组织问题。根据here 的规定,计算前需要对数据进行位反转,填充32个零并补足。

即使我忘记了与接收或传输数据并行运行的部分,我怎样才能有效地从最大长度寄存器中只获取我的相关消息,以便在计算之前填充它?我知道这样的想法

newregister[31:0] <= oldregister[X:0]    // X is my variable length

不工作。也不可能让用于对旧向量进行位反转的 generate for 循环子句运行可变次数。我可以使用计数器将数据连续移动到所需的长度,但我不能浪费这么多时间。

或者,是否有一种操作可以直接给我填充和补充的结果?我什至不知道如何开始开发这样的想法。

提前感谢您的任何见解。

【问题讨论】:

    标签: verilog crc32


    【解决方案1】:

    您误解了如何进行串行 CRC;您引用的 Python 问题不相关。您只需要一个带有适当反馈抽头的 32 位移位寄存器。如果您在 Google 上搜索“serial crc”或“ethernet crc”,您将获得一百万次点击。至少有一个 Xilinx 应用说明可以为您完成所有工作。您需要小心使用正确的值预加载 32 位寄存器,以及在完成时是否反转 32 位数据。

    编辑

    “xilinx serial crc”的第一个命中是 xapp209,其基本答案如图 1 所示。除此之外,您还需要抽头、预加载值、是否反转答案以及要反转的值检查接收。我确定他们曾经在另一个应用笔记中完成所有这些操作,但我目前找不到。基本参考是以太网 802.3 规范(3.2.8 帧检查序列字段,原书中为 p27)和 V42 规范(8.1.1.6.2 32 位帧检查序列,旧 CCITT Blue 中的第 311 页书)。两者都给水龙头。 V42 要求预加载全 1,完成反转,并在接收时给出测试值。 Warren 在 Hacker's Delight 中有一个(新的)章节,以图形方式显示水龙头;看看他的网站。

    您只需要在线生成器即可检查您的解决方案。但要小心:它们通常具有不同的预加载值,可能会或可能不会反转结果,可能会或可能不会反转位。

    【讨论】:

    • 愿意详细说明或给我一个关于“百万点击”的例子吗?我找到了一些 Xilinx 应用说明,但对于我们的设备来说已经过时了,我的上级决定不使用它。我还找到了一些计算器和代码生成器,但据我了解后者,它们只进行CRC计算,而我仍然需要组织它之前和之后的数据。确实,我只是在不同的 CRC 计算上尝试了它们,而不是这里提到的 CRC-32,因为我需要在那里做额外的工作,所以我希望它在这里是一样的。
    【解决方案2】:

    由于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
    

    【讨论】:

    • 所有东西都需要包装在一个 always 块中才能工作?
    • 另外,我现在在另一个示例中尝试了这个,但它不起作用。看起来只执行了 if 部分,但没有执行 else。
    • (A) 是的,它需要在一个 always 块中。 (B) 它应该可以工作,你能展示更多你的代码吗?如果X也是一个寄存器,那么我建议将逻辑计算从同步逻辑(例如always @(posedge clk))转移到组合逻辑(例如always @*),将寄存器分配保留在同步逻辑块中。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2014-03-02
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多