题解 | #奇偶校验#

奇偶校验

https://www.nowcoder.com/practice/67d4dd382bb44c559a1d0a023857a7a6

1.题目:对输入的32位数据d[31:0]进行奇偶校验,如果sel=0,则此次进行偶校验,即check输出的值要保证{d,check}中有偶数个“1”;如果sel=1,则为奇校验,即数据d加上check的值要有奇数个‘’1”
2.解题思路:

        考虑到异或的功能是:相同为0,不同为1,那么数据d中所有的“0”可以不用考虑(所有“0”异或为0),那么数据d[31:0]按位异或结果为“0”,说明d中 有偶数个“1”;
如果数据d[31:0]按位异或的结果为“1”,则说明d中存在奇数个“1”。将所有情况列出如下表所示:
例如:当sel=0时,校验方式位偶校验,如果按位异或^d的结果为0(说明d中偶数个“1”),因为是偶校验,check的结果给“0”即可;同理,如果^d的结果为“1”,则说明d中奇数个“1”,因为是偶校验,所以check输出1
备注:
奇校验:  数据d[31:0]和校验位check中“1”的个数总和为奇数个
偶校验:数据d[31:0]和校验位check中“1”的个数总和为偶数个
但是可以发现,如果按照sel =0 作为偶校验,sel=1作为奇校验得到的波形和参考波形相反,所以按照本题的参考波形 应该把sel=1作为偶校验,sel=0为奇校验。
3.参考代码:
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//

    wire sum_odd;
    assign sum_odd = ^bus;
    assign check = (sel == 0) ? (sum_odd ? 1'b1 : 1'b0) : (sum_odd ? 1'b0: 1'b1);

//*************code***********//
endmodule

Sel

校验方式

^d的值

含义

check

0

偶校验

“0”

d 中偶数个1

Check = “0”

“1”

d 中奇数个1

Check = 1

1

奇校验

0

d 中偶数个1

Check = 1

1

d 中奇数个1

Check = 0

全部评论

相关推荐

VirtualBool:都去逗他了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务