写在前面
牛客网中有各类题库,其中就有 FPGA/IC 的 Verilog 题库,通过刷题可以巩固基础。
牛客网 Verilog 题库包括基础、进阶以及企业笔试真题,并且全部免费!
本系列持续更新自己的刷题历程。
牛客网刷题直达链接
牛客网 Verilog 刷题链接(FPGA/IC)
目录
题目描述
奇偶校验
题目分析
仿真结果
现在需要对输入的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位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。
本题的奇偶校验的方法比较特殊,它是校验方法为:输入的 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 值。