【牛客网刷题】VL3 奇偶校验

👉 写在前面

👉 本系列博客记录牛客网刷题记录

👉 日拱一卒,功不唐捐!


目录

题目描述

奇偶校验

题目分析

仿真结果


题目描述

现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果(1输出奇校验,0输出偶校验)。

信号示意图:

波形示意图:

输入描述:

输入信号

bus

sel

类型

wire

wire

输出描述:

输出信号

check

类型

wire

奇偶校验

奇偶校验是在通信过程中确保节点之间准确数据传输的过程。奇偶校验位附加到原始数据位以创建偶数或奇数位。内存中最小的单位是比特,也称为“位”,位只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数。对于偶校验,校验位就定义为1;对于奇校验,则相反。当 CPU 读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。

奇偶校验在 Uart 协议传输时使用的较多,但是这个校验方法校验的准确度并不是很高,如果想要更严格的检验方法,可以采用 CRC 校验。以下为 CRC 的介绍以及 Verilog 实现方法。

CRC校验(一)什么是CRC校验?

CRC 校验(二)用 Verilog 实现生成 CRC 校验码

题目分析

本题的奇偶校验的方法比较特殊,它是校验方法为:输入的 32 bit 的 bus 数据,若32位中有奇数个1,采用奇校验则check输出为1,否则输出为0;若32位中有偶数个1,采用偶校验则check输出为1,否则输出为0。

要想判定输入的32位数据有多少个1,可以采用位异或的方法,如果数据中有奇数个1,则位异或结果为1,如果数据中有偶数个1,则位异或结果为0。并且输入输出都是 wire 变量,因此采用 assign 语句实现。

Verilog 代码

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// Engineer    : Linest-5                                                             
// File        : odd_sel.v                                                              
// Create      : 2022-10-02 15:51:37                                                   
// Revise      : 2022-10-02 15:51:37                                                  
// Module Name : odd_sel                                                                 
// Description : 奇偶校验,
//               若输入的数据含有奇数个1且为奇校验,则check拉高,否则拉低
//               若输入的数据含有偶数个1且为偶校验,则check拉高,否则拉低                                                                         
// Editor : sublime text3, tab size (4)                                                                                                 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
`timescale 1ns/1ns

module odd_sel(
	input  [31:0]  bus,
	input          sel,
	output         check
);
//*************code***********//
wire       odd_even;

assign odd_even = ^bus; //按位异或,偶数个1为0,奇数个1位1
assign check = sel ? odd_even : ~odd_even;

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

testbench 代码

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// Engineer    : Linest-5                                                            
// File        : tb_odd_sel.v                                                              
// Create      : 2022-10-02 16:32:01                                                   
// Revise      : 2022-10-02 16:32:01                                                  
// Module Name : tb_odd_sel                                                                 
// Description : 奇偶校验仿真模块                                                                         
// Editor : sublime text3, tab size (4)                                                                                                 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
`timescale 1ns/1ns

module tb_odd_sel();

reg  [31:0]     bus;
reg             sel;
wire            check;

initial begin
	bus = 'd0;
	sel = 'd1;
	#20
	bus = 'd1;
	sel = 'd1;	
	#20
	bus = 'd2;
	sel = 'd0;
	#20
	bus = 'd3;
	sel = 'd1;
	#20
	bus = 'd4;
	sel = 'd0;
	#20
	bus = 'd5;
	sel = 'd0;
	#20
	bus = 'd6;
	sel = 'd0;	
	#20
	bus = 'd7;
	sel = 'd1;
	#20
	bus = 'd8;
	sel = 'd1;
	#20
	bus = 'd9;
	sel = 'd0;
	#20
	bus = 'd10;
	sel = 'd0;
end

odd_sel inst_odd_sel (
	.bus(bus), 
	.sel(sel), 
	.check(check)
);

//verdi     
initial begin
   $fsdbDumpfile("tb_odd_sel.fsdb");
   $fsdbDumpvars(0);
end

endmodule

仿真结果

电路结构

仿真结果

可以看到仿真波形中,根据输入的数据且此时的奇偶校验选择,输出相应的 check 值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linest-5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值