0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

奇偶校验器的设计方法和特点

Hack电子 来源:Hack电子 2023-09-05 10:40 次阅读

bc659b9a-4b94-11ee-a25d-92fbcf53809c.png

奇偶校验是一种简单、实现代价小的检错方式,常用在数据传输过程中。对于一组并行传输的数据(通常为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。

bc8e3b4a-4b94-11ee-a25d-92fbcf53809c.png

简单理解奇偶校验:

奇校验:原始码流+校验位 总共有奇数个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();

//信号申明

regclk;

regrst_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 仿真结果

bcad67ea-4b94-11ee-a25d-92fbcf53809c.png

三、计数器法

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();

//信号申明

regclk;

regrst_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

仿真结果

bcc71fbe-4b94-11ee-a25d-92fbcf53809c.png

四、总结

奇偶校验器设计主要思路是通过弄清一组数据中“1”和“0”的数目。若是奇校验则原始码流+校验位总共有奇数个“1”;若是偶校验则原始码流+校验位总共有偶数个“1”。设计方法主要有XOR法和计数器法。XOR法最简单,只需要对数据使用按位异或,输出为“0”代表数据中“1”位偶数个;计数器法最直观,计数器中数值的奇偶性表示对应数据中“1”个数的奇偶。

Tips:判断计数器是奇数还是偶数主要有判断data_out[0]和取余数两种方法,前者综合后耗损的资源太多不推荐前者。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109970
  • 计数器
    +关注

    关注

    32

    文章

    2253

    浏览量

    94338
  • 奇偶校验器
    +关注

    关注

    0

    文章

    7

    浏览量

    7123
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68319

原文标题:FPGA基础-奇偶校验器设计

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    串口调试助手的奇偶校验测试方法

    很多串口调试助手感觉奇偶校验功能都是形同虚设的(我设置奇校验和偶校验都能收到数据)。是不是我测试方法有误呢?串口助手校验失败会有什么现象啊?
    发表于 04-28 15:11

    UART中有奇偶校验位和无奇偶校验位的数据传输是怎样的?

    例如,我使用 8 位数据传输类型。奇偶校验位共有 3 种类型无奇偶校验校验校验----------------------偶校验我假设
    发表于 12-08 07:24

    奇偶校验

    奇偶校验码   奇偶校验码是一种开销最小,能发现数据代码中一位出错情况的编码,常用于存储读写检查,或ASCII字符、其它类
    发表于 10-13 16:42 5292次阅读

    奇偶校验,奇偶校验是什么意思

    奇偶校验,奇偶校验是什么意思 奇偶校验定义 为了系统的可靠性,对于位数
    发表于 03-08 17:32 2191次阅读

    奇偶校验码,奇偶校验码原理是什么?

    奇偶校验码,奇偶校验码原理是什么? 奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它是由n-1位信息元和1位
    发表于 03-17 17:39 6.3w次阅读

    奇偶校验_奇偶校验设计程序

    本内容提供了奇偶校验_奇偶校验设计的程序代码,希望对大家有帮助
    发表于 11-11 10:04 5697次阅读

    stm32串口奇偶校验

    STM32串口通信使用奇偶校验的时候应该设置数据位长度9bit,奇偶校验是硬件完成的,并且stm32用校验位时,数据位要选9位,8位会出现故障可能。
    的头像 发表于 07-23 09:26 1.1w次阅读

    stm32 usart奇偶校验如何配置

    stm32 usart奇偶校验如何配置?或许你在stm32 usart奇偶校验过程中会遇到如下一些坑,stm32 usart偶校验错误标志位以及出现偶校验错误,
    的头像 发表于 07-23 09:55 7457次阅读
    stm32 usart<b class='flag-5'>奇偶校验</b>如何配置

    STM32的UART奇偶校验注意

    STM32的UART奇偶校验注意STM32的UART在初始化时,我们通常用到最多的就是无校验位,1停止位。但是我在项目中也遇到某些芯片通信用的需要奇校验或者偶校验,这里需要特别注意的是
    发表于 12-28 19:10 20次下载
    STM32的UART<b class='flag-5'>奇偶校验</b>注意

    增强FIFO模式下的奇偶校验

    自昊芯推出专题讲解SCI串口通讯奇偶校验,分为两期讲解,上期主要讲解标准SCI模式下的奇偶校验,本期主要讲解增强FIFO模式下的奇偶校验
    的头像 发表于 11-02 09:30 992次阅读

    FPGA奇偶校验的基本原理及实现方法

    在数字电路中,数据的正确性非常重要。为了保证数据的正确性,在传输数据时需要添加一些冗余信息,以便在接收端进行校验。其中一种常用的校验方式是奇偶校验(Parity Check)。本文将介绍奇偶校
    的头像 发表于 05-14 14:59 2924次阅读
    FPGA<b class='flag-5'>奇偶校验</b>的基本原理及实现<b class='flag-5'>方法</b>

    什么是奇偶校验 奇偶校验的基本原理 奇偶校验电路什么意思

    什么是奇偶校验 奇偶校验的基本原理 奇偶校验电路什么意思  奇偶校验是一种用于检测二进制数据中错误的方法。它的基本原理是在二进制数据的末尾添
    的头像 发表于 10-17 16:16 3594次阅读

    什么是奇偶校验电路?奇偶校验是时序逻辑电路吗?

    什么是奇偶校验电路?奇偶校验是时序逻辑电路吗? 奇偶校验电路是一种数字电路,在数据传输过程中用于检测数据是否发生错误。在每个数据字节(通常是8位)的最高位添加一位(偶
    的头像 发表于 10-17 16:16 3511次阅读

    什么是奇校验和偶校验?常见的奇偶校验方式有哪些?

    校验,以保证正确性。常用的校验方法奇偶校验、循环冗余校验(CRC)、海明码等。 2. 奇偶校验是一种最简单的
    的头像 发表于 10-17 16:28 1w次阅读

    奇偶校验和crc校验的区别 CRC校验奇偶校验之间有什么关系?

    奇偶校验和crc校验的区别 CRC校验奇偶校验之间有什么关系? 奇偶校验和 CRC(Cyclic Redundancy Check)
    的头像 发表于 10-17 16:28 3255次阅读