题解 | #奇偶校验#
奇偶校验
https://www.nowcoder.com/practice/67d4dd382bb44c559a1d0a023857a7a6
前言:
通过牛友们的讨论大概理清了题目要表达的意思,但因为看不懂题设中的波形图,所以无法判断此种解法正误
奇偶校验
奇校验:原始码流+校验位 其中总的1个数为奇数个
偶校验:原始码流+校验位 其中总的1个数为偶数个
注:校验位的目的就是为了让最后1的总数达到想要的奇数个(奇校验)或偶数个(偶校验)
如:
其中红色字体即为校验位
实在不懂看这个:秒懂 奇偶校验码 - 知乎 (zhihu.com)
解读题目
题目目的:任意给出一组32位的数据流bus,通过sel确定要采用的校验方式(sel=1为偶校验,sel=0为奇校验,注意这里的sel对应关系为正确的,牛友们根据波形判断,发现题设条件给反了),让求在该种校验方式下,我的校验位check应该取何值。
Verilog Code
`timescale 1ns/1ns module odd_sel( input [31:0] bus, //数据流 input sel, //决定使用奇校验还是偶校验,当sel=1时为偶校验,sel=0时为奇校验 output check //奇/偶校验位 ); //*************code***********// wire is_odd; assign is_odd = ^bus; //判断bus中1的个数,当1的总数为奇数个时is_odd=1;当1的总数为偶数个时is_odd=0; assign check = sel ? (is_odd? 1'b1:1'b0):(is_odd? 1'b0:1'b1); //*************code***********// endmodule
知识储备
- “^”为异或符号
- is_odd = ^bus等价于is_odd = bus[0]^bus[1]^bus[2]^...^bus[30]^bus[31]
- 判断一个数(bus)中1的个数是奇数个还是偶数个:奇数个:^bus=1; 偶数个:^bus=0;