牛客网-Verilog篇

VL3 奇偶校验

原题链接

1.原题复现

在这里插入图片描述

2.思路以及代码

以前做过HDLBits,也是有相关的奇偶校验题目,但是被遗忘的差不多啦,特此找了一篇博客,重新学习一下奇偶校验的相关知识:

参考的相关博客为:论述:Verilog中的奇偶校验

用自己的话大概来总结下:
1.首先要明白奇偶校验的定义:在这里插入图片描述
2. 奇偶校验的工作原理:
以 8位的输入 data_in 为例子:

data_in二进制码中“1”的个数^data_in的值偶校验位的值
奇数11
偶数00

探究^data_in和偶校验值之间的关系:
可以发现,当作为单比特数据进行异或运算时候,可以等价理解为:k个一比特数据的异或运算可以被视为"k个一比特数据在不考虑进位和溢出问题时的求和运算"。
即^data_in和偶校验位之间的关系可以理解为:
对data_in的二进制码中所有的比特位进行不考虑进位或者溢出问题的求和:

  • 如果求和最低位的结果为1:即(^data_in)的结果为1,说明data_in的1的个数为奇数,因此偶校验位为1
  • 如果求和最低位的结果为0:即(^data_in)的结果为0,说明data_in的1的个数为偶数,因此偶校验位为0.

针对于奇校验,应该比较容易理解:数据和校验位如果满足偶校验的要求的话,那么数据和取反后的校验位合起来能满足奇校验的要求。
也就是 assign odd_bit = ~even_bit 的原理出处。

据此,再次给出参考博客写好的针对数据进行奇偶校验时候的详细Verilog模块代码:

module generate_parity_bit
#(
    parameter	DATA_WIDTH = 8,
    parameter   PARITY_TYPE = "even parity" //允许的取值:"even parity""odd parity"
)
(
	input	[DATA_WIDTH-1:0]	data_in,
	output						parity_bit_out
);

wire even_bit;//偶校验需求下计算出来的校验位
wire odd_bit; //奇校验需求下计算出来的校验位

assign even_bit = ^data_in;
assign odd_bit = ~even_bit;

if(PARITY_TYPE == "even parity")
begin
    assign parity_bit_out = even_bit;
end
else
begin
    assign parity_bit_out = odd_bit;
end


endmodule

-最后给出 牛客网上相关题目的代码解析:

`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output  check
);
//*************code***********//
    //奇校验
        wire even_bit ;
   assign even_bit = ^bus;
        wire  odd_bit;
   assign odd_bit = ~even_bit;
    reg check_mid;
    assign check = sel? even_bit:odd_bit;
    
    
    //偶校验

//*************code***********//
endmodule
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值