奇偶校验器设计(奇偶校验与奇偶检测,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模板网!

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

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

相关文章

  • 深入理解Java泛型、协变逆变、泛型通配符、自限定

    重写了之前博客写的泛型相关内容,全部整合到这一篇文章里了,把坑都填了,后续不再纠结这些问题了。本文深度总结了函数式思想、泛型对在Java中的应用,解答了许多比较难的问题。 纯函数 协变 逆变 泛型通配符 PECS法则 自限定 Java8 引入了函数式接口,从此方法传参可

    2023年04月20日
    浏览(54)
  • c# 通过现在文件夹,获取下面所有的照片,并对其进行统一尺寸裁剪

    c# 通过现在文件夹,获取下面所有的照片,并对其进行统一尺寸裁剪 using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst

    2023年04月26日
    浏览(51)
  • 下载盗版网站视频并将.ts视频文件合并

    我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定的url就可以获取到.ts文件

    2024年02月07日
    浏览(83)
  • 视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

    这里需要引用的库是: from Crypto.Cipher import AES 有坑哈, python3.0 之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因,原来是20年之后crypto已经被pycryptohome替换掉啦, 如果之前安装过crypyo 活pycrypto需要先卸载 然后再安装 pycryptohome 就可以啦 首先我们需

    2024年02月14日
    浏览(65)
  • 【视频】使用OBS将MP4推流至腾讯云直播

    OBS官网:https://obsproject.com/ OBS支持Win、Mac、Linux,如果下载速度很慢,建议使用迅雷下载 默认会有一个“场景”,如果想继续添加可以点击“+”按钮 1)点击“来源”窗口中“+”按钮 2)支持的媒体源如下 其中:“图像”是指图片;如果要将推流mp4等视频文件,选择“媒体源

    2024年02月13日
    浏览(47)
  • 如何使用 ffmpeg 对视频进行切分、合并

    1. 按照视频时间点进行截取, 起止点:00:00:06 ~ 00:20:36 ffmpeg -ss 00:00:06 -to 00:20:36 -accurate_seek -i \\\"input.mp4\\\" -avoid_negative_ts 1 -c copy \\\"ouput.mp4\\\" -y 2.  分离视频和音频 ffmpeg -i \\\"input.mp4\\\" -vcodec copy -an \\\"out-vod.mp4\\\" ffmpeg -i \\\"input.mp4\\\" -acodec copy -vn \\\"out-sound.m4a\\\"  3. 去除水印(指定区域模糊化,以

    2024年02月09日
    浏览(38)
  • 对比多张图片相似度(PYTHON)

    可以使用图像处理软件或者编程语言进行相似度对比。常用的指标有:      1. 均方误差(MSE): 计算每个像素的差异,再求平均值。公式:MSE = 1/nΣ(i=1,n)(I1(i)-I2(i))^2,其中I1和I2是两张图片对应像素的灰度值,n是像素数量。MSE越小,表示图片越相似。      2. 结构相似度指

    2024年02月12日
    浏览(42)
  • Python合并一个 Excel 里面的多张表

    刚需要将入职五个月的日报汇总, 但是每日都是在通一个excel里面新建副表写日报,现在已经积累了84张附表(每周4张,总共21周),手动复制粘贴每张表格是相当耗时的工作。在这个时候,我开始思考:有没有一种更快捷的方法来合并这些表格呢?于是,我想到了使用Python。

    2024年02月05日
    浏览(41)
  • 用python批量合并word文件并统一调整图片大小

    注:setpicsize宏文件先要放如word中的视图-宏中,宏文件代码如下 Sub setpicsize() Dim n On Error Resume Next For n = 1 To ActiveDocument.InlineShapes.Count ActiveDocument.InlineShapes(n).Height = 27.31 * 20 ActiveDocument.InlineShapes(n).Width = 19.33 * 20 Next n End Sub  

    2024年02月02日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包