You need to enable JavaScript to run this app. Verilog实现5位Mealy奇校验器:已编写基础逻辑,如何判断5位中1的个数为奇数
优惠活动
大模型
产品
解决方案
定价
更多

Verilog实现5位Mealy奇校验器:已编写基础逻辑,如何判断5位中1的个数为奇数

5位Mealy奇校验器核心校验逻辑实现

先修掉现有代码里会导致功能完全失效的基础问题

这些问题不解决,核心校验逻辑根本没法正常跑:

  • 寄存器宽度不匹配:你把present/next定义成了2位宽的寄存器,但给出的s0-s10状态编码都是4位的,2位寄存器最多存0-3的数值,根本装不下这么多状态,会直接导致状态跳转完全错乱,需要把寄存器宽度改成和状态编码匹配的4位:reg [3:0] present, next;
  • 输出逻辑的硬伤:你现在的输出判断只覆盖了s10状态下w=1的单个场景,完全漏了第5位输入时所有可能的奇偶分支,这就是你说“尚未实现核心校验功能”的直接原因。

怎么判断5位数据里1的个数是不是奇数

核心逻辑根本不需要循环逐位计数,直接用异或的奇偶特性就行:一串二进制数逐位异或的结果为1,就说明里面1的总数是奇数;结果为0就说明1的总数是偶数。
分两种常见场景对应实现:

  • 如果是一次性并行输入完整5位数据:直接用Verilog自带的归约异或操作就行,没有任何冗余逻辑:z = ^w_parallel;
  • 如果你是当前代码这种逐位串行输入的结构(单bit w,逐拍输入每个数据位):
    1. 每个状态只需要记两个信息就够:已经收到了几个bit(共0/1/2/3/4位5种进度)、截至当前位累计1的个数是奇还是偶(2种状态),满打满算10个状态就够覆盖所有场景,不需要额外冗余状态。
    2. 每收到一个新的w,直接更新累计的奇偶值:新奇偶值 = 旧奇偶值 ^ w。道理很简单,w=1的时候累计奇偶性翻转,w=0的时候奇偶性保持不变,全程不需要做加法计数,就能追踪到当前1的个数奇偶性。
    3. 等收到第5个bit的时候,按照Mealy输出的特性,直接结合当前状态、当前输入w算出最终校验值给z,不用等下一个时钟沿。

对应到你现有代码的核心逻辑补全

你现在写的s0到s8的次态跳转,其实已经刚好匹配了“逐位追踪累计奇偶”的设计,只需要把最后第5位接收阶段的输出逻辑补全就行:

  • 状态为s9(已收4位,累计1的个数为偶)时:如果当前w=1,总1个数为奇,z=1;如果w=0,总1个数为偶,z=0
  • 状态为s10(已收4位,累计1的个数为奇)时:如果当前w=0,总1个数为奇,z=1;如果w=1,总1个数为偶,z=0
    补全后的输出逻辑参考:
always @(w, present) begin
    case(present)
        s9: z = w; // 4位累计偶,加当前w后总奇校验值就是w本身
        s10: z = ~w; // 4位累计奇,加当前w后总奇校验值就是w的取反
        default: z = 1'b0; // 还没到第5位输入阶段时输出0
    endcase
end

内容的提问来源于stack exchange,提问作者Jordan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 19:06:04