【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真

Verilog奇偶校验

    • 前言
    • 题目
    • 原理
    • RTL设计
    • Testbench
    • 仿真分析

前言

本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:

奇数分频
偶数分频
半整数分批
小数/分数分频
序列检测器
模三检测器
饮料机
异步复位,同步释放
边沿检测(上升沿,下降沿,双边沿)
全加器,半加器
格雷码转二进制
单bit跨时钟域(打两拍,边沿同步,脉冲同步)
奇偶校验
伪随机数生成器[线性反馈移位寄存器]
同步FIFO

应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练
链接如下
HDLBits — Verilog Practice

题目

1.一个输入序列是8位([7:0])其中七位是数据位[6:0],一位是奇校验位[7],设计一个检测模块,其输入为result(result为0代表奇偶校验正确,result为1代表奇偶校验错误)

原理

  • 奇偶校验也是电路设计中常用的一个电路或者说功能,它广泛的应用在串口通讯或者高速缓存中,以UART通讯协议为例,一个字符帧的最后一位的校验方式就可以设置成奇偶校验的方式。

  • 奇偶校验位有两种类型:偶校验位与奇校验位
    偶校验位来说,如果一组给定数据位中1的个数是奇数,补一个bit为1,使得总的1的个数是偶数。例:0000001, 补一个bit为1, 00000011。
    奇校验位来说,如果给定一组数据位中1的个数是奇数,补一个bit为0,使得总的1的个数是奇数。例:0000001, 补一个bit为0, 00000010。

  • 为了搞懂奇偶校验的原理,我们首先需要知道的是异或门,他的真值表如下
    【数字IC手撕代码】Verilog奇偶校验|题目|原理|设计|仿真_第1张图片

  • 以这样的一个双输入异或门为例子,我们可以发现,两个输入,有一个为1的时候,输出为1,有0个1或者2个1的时候输出为零,这里其实异或门的概念与奇偶校验的概念就重叠起来了,0和2是偶数,输出是0,1是奇数输出是1,根据此,我们只需要使用缩位运算符“异或”去处理输入的数据数列,就可以去判断偶校验,异或后取反,就可以去判断奇校验位。

RTL设计

module oddtest (data,result);
input [7:0] data;
output result;

wire oventest;

assign oddtest = ^data[6:0];
assign result = (data[7] == oddtest ? 1 : 0 );

endmodule

Testbench

`timescale 1ns / 1ps
module oventest_tb();
reg [7:0] data;
wire result;

oventest u1(.data(data),.result(result));

initial
begin
data = 8'h01;
#100
data = 8'ha1;
#100
data = 8'h32;
#100
data = 8'he2;
#100
data = 8'hc4;
$stop;
end
endmodule

仿真分析

在这里插入图片描述

这里检测了四个数,可以发现,第三个检测数据有三个1,奇数位判断为0,结果正确,第四个检测数据也是三个1,奇偶位判断为1,结果错误。体现在result拉高上,设计成立。

你可能感兴趣的:(数字IC手撕代码,fpga开发,verilog,硬件架构,fpga,面试)