VL3 奇偶校验
1.原题复现
2.思路以及代码
以前做过HDLBits,也是有相关的奇偶校验题目,但是被遗忘的差不多啦,特此找了一篇博客,重新学习一下奇偶校验的相关知识:
参考的相关博客为:论述:Verilog中的奇偶校验
用自己的话大概来总结下:
1.首先要明白奇偶校验的定义:
2. 奇偶校验的工作原理:
以 8位的输入 data_in 为例子:
data_in二进制码中“1”的个数 | ^data_in的值 | 偶校验位的值 |
---|---|---|
奇数 | 1 | 1 |
偶数 | 0 | 0 |
探究^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