奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)

这篇具有很好参考价值的文章主要介绍了奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)



数字IC经典电路设计
经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。

个人主页链接
1.数字分频器设计
2.序列检测器设计
3.序列发生器设计
4.序列模三检测器设计
5.奇偶校验器设计
6.自然二进制数与格雷码转换



一、前言

奇偶校验是一种简单、实现代价小的检错方式,常用在数据传输过程中。对于一组并行传输的数据(通常为8比特),可以计算岀它们的奇偶校验位并与其一起传输。接收端根据接收的数据重新计算其奇偶校验位并与接收的值进行比较,如果二者不匹配,那么可以确定数据传输过程中岀现了错误;如果二者匹配,可以确定传输过程中没有出错或者出现了偶数个错误(出现这种情况的概率极低)。

需要指出当出现偶数个错误时,奇偶校验是无法检测此时电路出现传输错误。例如,发送的数据为8’b1010_1011此时计算出的偶校验值是1。如果在传输中后两位从11跳变为00,那么此时接收到的数据为8’b10100100,接收的偶校验值仍然为1。对接收的数据进行偶校验计算,得到的结果仍然为1,这与收到的校验值是相同的,接收电路无法检测出接收数据中岀现的错误。

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

奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)

简单理解奇偶校验:
奇校验:原始码流+校验位 总共有奇数个1
偶校验:原始码流+校验位 总共有偶数个1

二、XOR法

2.1 XOR法

题目:采用XOR法试写一个发送端奇偶校验器,在发送端会输入一段8bit的数据,可以选择切换奇数校验或者偶数校验,并且将校验值附在末位输出。

2.2 verilog代码

//使用XOR法设计奇偶校验器
module parity_checker01(
    input           clk,
    input           rst_n,
    input           parity_odd,	//是否为奇校验:奇数校验为1,偶数校验位0
    input   [7:0]   data_in,	//输入的八位数据
    output  [8:0]   data_out,	//输出的九位数据
    output  reg     even_bit,	//偶数校验码
    output  reg     odd_bit		//计数校验码
    );
 
 //使用按位异或确定偶数校验码和奇数校验码   
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    even_bit <= 1'b0;
	    odd_bit  <= 1'b0;
    end
    else begin
	    even_bit <= ^data_in;   //偶校验条件下计算出来的校验位
	    odd_bit  <= ~(^data_in);//奇校验条件下计算出来的校验位
    end
end
 
 //组合逻辑完成输入数据与校验码的拼接
assign data_out = parity_odd ? {data_in[7:0],odd_bit} 
		      	     : {data_in[7:0],even_bit};
   
endmodule

2.3 Testbench

`timescale 1ns / 1ps		//仿真时间单位1ns 仿真时间精度1ps
module parity_checker01_tb();

//信号申明
reg			clk;
reg			rst_n;
reg         parity_odd;
reg  [7:0] 	data_in;
wire [8:0]  data_out;
wire    	even_bit;
wire     	odd_bit;

//模块实例化(将申明的信号连接起来即可)
parity_checker01 u_parity_checker01(
    .clk          (clk),
    .rst_n        (rst_n),
    .parity_odd	  (parity_odd),
    .data_in      (data_in),
    .data_out     (data_out),
    .even_bit     (even_bit),
    .odd_bit      (odd_bit)
    );
    
//生成时钟信号
always #5 clk = ~clk;

//生成复位信号
//为时钟信号和复位信号等赋初值
initial begin
    clk        = 1;
    rst_n      = 1;
    data_in    = 0;
    parity_odd = 1;
    #5  rst_n <= 0;
    #5  rst_n <= 1;
    data_in = 8'h01;
    #20
    data_in = 8'hb7;
    #20
    data_in = 8'h32;
    #20
    data_in = 8'he9;
    #20
    data_in = 8'hd3;
end

endmodule


2.4 仿真结果

奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)

三、计数器法

3.1 计数器法

题目:采用计数器法试写一个发送端奇偶校验器,在发送端会输入一段8bit的数据,可以选择切换奇数校验或者偶数校验,并且将校验值附在末位输出。

3.2 verilog代码

//使用计数器法设计奇偶校验器
module parity_checker02(
    input           clk,
    input           rst_n,
    input           parity_odd,	//是否为奇校验:奇数校验为1,偶数校验位0
    input   [7:0]   data_in,	//输入的八位数据
    output  [8:0]   data_out,	//输出的九位数据
    output  reg     even_bit,	//偶数校验码
    output  reg     odd_bit		//奇数校验码
    );

//定义一个三位宽的计数器
reg	[2:0] cnt;

//计数器模块
//输入数据data_in逢1逐位计数
integer i;
always @(*) begin
    cnt = 3'd0;
    for (i=0;i<8;i=i+1) begin
        if(data_in[i]==1'b1) begin
            cnt = cnt + 1;
        end
    end
end

//计数器校验模块
//使用时序逻辑对计数器中的1校验奇数or偶数
//计数器最低位为奇数,则整体为奇数,反之为偶数
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
		even_bit <= 1'b0;
	    odd_bit  <= 1'b0;
    end
    else if(cnt[0] == 1'b1) begin	//通过计数器最低位判断是否为偶数
		even_bit <= 1'b1;  
		odd_bit  <= 1'b0;
    end
    else begin
		even_bit <= 1'b0;
		odd_bit  <= 1'b1;
    end
end

//组合逻辑完成输入数据与校验码的拼接
assign data_out = parity_odd ? {data_in[7:0],odd_bit} 
		      	     : {data_in[7:0],even_bit};

endmodule

3.3 Testbench

`timescale 1ns / 1ps		//仿真时间单位1ns 仿真时间精度1ps
module parity_checker02_tb();

//信号申明
reg			clk;
reg			rst_n;
reg         parity_odd;
reg  [7:0] 	data_in;
wire [8:0]  data_out;
wire    	even_bit;
wire     	odd_bit;

//模块实例化(将申明的信号连接起来即可)
parity_checker02 u_parity_checker02(
    .clk          (clk),
    .rst_n        (rst_n),
    .parity_odd	  (parity_odd),
    .data_in      (data_in),
    .data_out     (data_out),
    .even_bit     (even_bit),
    .odd_bit      (odd_bit)
    );
    
//生成时钟信号
always #5 clk = ~clk;

//生成复位信号
//为时钟信号和复位信号等赋初值
initial begin
    clk        = 1;
    rst_n      = 1;
    data_in    = 0;
    parity_odd = 1;
    #5  rst_n <= 0;
    #5  rst_n <= 1;
    data_in = 8'h01;
    #10
    data_in = 8'hb7;
    #10
    data_in = 8'h32;
    #10
    data_in = 8'he9;
    #10
    data_in = 8'hd3;
end

endmodule


3.4仿真结果

奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)

四、总结

奇偶校验器设计主要思路是通过弄清一组数据中“1”和“0”的数目。若是奇校验则原始码流+校验位总共有奇数个“1”;若是偶校验则原始码流+校验位总共有偶数个“1”。 设计方法主要有XOR法和计数器法。XOR法最简单,只需要对数据使用按位异或,输出为“0”代表数据中“1”位偶数个;计数器法最直观,计数器中数值的奇偶性表示对应数据中“1”个数的奇偶。
Tips:判断计数器是奇数还是偶数主要有判断data_out[0]和取余数两种方法,前者综合后耗损的资源太多不推荐前者。

不定期检查、补充、纠错,欢迎随时交流纠错
最后修改日期:2023.5.06

软件版本:

仿真软件:Modelsim 10.6c
绘图软件:亿图图示
描述语言:verilog文章来源地址https://www.toymoban.com/news/detail-505338.html

到了这里,关于奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL性能深度优化

    这里的深度优化是指,除了建索引、左匹配索引等等其他的优化手段。 文章涉及到操作系统连接数、IO、Mysql本身的某些参数设置,值得记录下来。 CPU:48C 内存:128G DISK:3.2TSSD innodb_thread_concurrency=32 表示SQL经过解析后,允许同时有32个线程去innodb引擎取数据,如果超过32个,

    2024年02月09日
    浏览(44)
  • FPGA基础设计(八):串口访问ROM

    将ROM中的数据读取出来,通过串口发送到上位机。 1、按键消抖模块 2、ROM控制器模块 3、创建ROM IP核模块 4、串口发送模块 前面已经设计好了串口发送模块和按键消抖模块,还剩ROM IP的创建和控制ROM模块的设计。 读ROM控制模块设计 : 1、 address :读地址端口 2、 q :读数据端

    2024年02月03日
    浏览(50)
  • Flutter知识点(二)处理Json

    flutter不支持反射,所以本来很简单的事情,一下子变复杂了。当然官方也提供了一些工具来方便开发者。 由于Dart的map和array的数据结构和json一样,所以在flutter中,变成了json string与Map,array之间的砖换。 那么如何在实体类和json之间转换呢? 这时就要用到工具了。在pubspec

    2024年02月11日
    浏览(26)
  • 安路FPGA烧录程序

    首先编译生成bit文件后,单击下载或者双击Downlod如图所示:  弹出下面窗口: Add添加bit文件 mode选择JTAG 2Mbps,点击Run下载,下面有进度条显示 固化程序,上面介绍的下载方式断电后程序就丢失了,需要烧录到flsh里断电程序不会丢失,设置如图: 把mode改到flsh模式在烧录即

    2024年02月07日
    浏览(39)
  • C#小轮子:MiniExcel,快速操作Excel

    Excel的操作是我们最常用的操作,Excel相当于一个小型的数据库,目的是为了方便查看。 最近淘到了MiniExcel,简单来说就是特别好用 MiniExcel Github仓库 Visual Studio 2022 .NET Core 6.0 Nuget MiniExcel Newtonsoft.Json(方便查看数据) 普通读写就是列名和实体类完全一致 读 新建Person测试类 新建

    2024年02月12日
    浏览(26)
  • GPT Store开业大吉:一场AI技术与创新的盛宴

    就在1.11 日,ChatGPT 正式上线 GPT Store ! OpenAI CEO 山姆·奥特曼第一时间确认了这个消息: 自从GPTs的概念提出以来,短短两个月内,全球用户已经创造了超过300万个GPTs。 点击 GPT Store 或者进入ChatGpt页面,点击左边的 Explore GPTs就可以进入GPT Store 页面了: 首先我们可以看到,社

    2024年02月01日
    浏览(38)
  • STM32 Proteu直流电机正反转控制系统限位开关-0035

    STM32 Proteu直流电机正反转控制系统限位开关-0035 Proteus 仿真小实验: STM32 Proteu直流电机正反转控制系统限位开关-0035 功能: 硬件组成:STM32F103C6单片机 +L298N电机控制电路+直流电机+3个按键(正转、反转、停止)+LED指示灯(正转、反转、停止)+限位开关(正限位 反限位)

    2024年02月09日
    浏览(31)
  • h5页面调用小程序分享方法

    小程序端 H5端

    2024年02月03日
    浏览(33)
  • Java后端WebSocket的实现

    WebSocket 1.什么是WebSocket? webSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。 webSocket使得客户端和服务器之间的数据交换变得更加简单, (在线聊天基础)允许服务端主动向客户端推送数据(服务器可以主动发消息给客户端) 。在webSocket API中,浏览器和服务器

    2024年02月06日
    浏览(34)
  • c#客户端Kafka的使用方法

    Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,现在是Apache软件基金会的顶级项目之一。Kafka能够处理大规模的实时数据流,支持高可靠性、高可扩展性、低延迟和高吞吐量。它主要用于构建实时数据管道和流式处理应用程序。 Kafka的核心概念包括:Producer(生产者)

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包