1、奇偶校验

奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。

举例,要输出一组8-bit数据,为“11101000”,该组数据共有4个“1”。若使用奇校验,则校验位应为1,传输数据实际为8-bit数据+1-bit奇校验位,即“111010001”;若使用偶校验,则校验位应为0,传输数据实际为8-bit数据+1-bit偶校验位,即“111010000”。

2、输入数据的校验方法

根据输入串行数据码流,“实时”生成所输入数据的校验位。

2.1、举例

欲串行接收数据“11101000”(传输低位在前,高位在后),则数据线上的数据应为“0-0-0-1-0-1-1-1”

奇校验应为“x-1-1-1-0-0-1-0-1”(采用时序逻辑输出,会落后一个时钟周期)

偶校验应为“x-0-0-0-1-1-0-1-0”(采用时序逻辑输出,会落后一个时钟周期)

校验位刚好落后数据一个时钟周期,方便拼接。

时序图如下:

输出信号odd根据输入信号变化,假如输入数据只输入4-bit,0001,则奇校验位0,偶校验位1,可以看到在输入信号的下一个周期,odd、even的输出符合预期,其他数据相同,这里不赘述。

奇校验实现方式:校验位默认为高电平,每检测到1,则状态翻转

偶校验实现方式:校验位默认为低电平,每检测到1,则状态翻转

2.2、verilog实现

根据上述,编写如下代码:

module odd_even1(input       clk     ,input      in      ,   //串行输入input     reset   ,   //同步复位,高电平有效output   reg odd     ,   //奇校验位output    reg even        //偶校验位
);always@(posedge clk)beginif(reset)beginodd <= 1'b1;even <= 1'b0;endelse if(in)beginodd <= ~odd;even <= ~even;  endelse beginodd <= odd;even <= even;end
endendmodule

2.3、testbench仿真

编写仿真对上述模块进行测试,激励输入随机生成0或1.

`timescale 1ns/1ns  //时间单位/精度//------------<模块及端口声明>----------------------------------------
module tb_odd_even1();reg       clk     ;
reg     in      ;
reg     reset   ;wire   odd     ;
wire    even    ;
//------------<例化被测试模块>----------------------------------------
odd_even1   odd_even1_inst(.clk (clk),.reset    (reset),.in     (in),.odd   (odd),.even (even)
);//------------<设置初始测试条件>----------------------------------------
initial beginclk = 1'b1;                  //初始时钟为1reset <= 1'b1;             //初始复位#20reset <= 1'b0;        end
//------------<设置时钟>----------------------------------------------
always #10 clk = ~clk;     //系统时钟周期20nsalways #20 in <= {$random}%2;   //每20ns随机生成0或1endmodule

2.4、仿真结果

仿真结果如下:

假设两黄线中间刚好传输了一次8-bit数据,则传输的数据应为1011_1111 (低位在前),那么这组数据的奇校验位应是:0 ;偶校验位应是:1 ;上图中蓝色字体标注与理论一直,而输入数据的第九位为1,则可视为一次偶校验。

通过比对数据码流上的第九位(校验位)与输出的奇偶校验结果,就可以判断这次数据接收是否成功。

3、输出数据的校验方法

除了对接收数据的正确性做奇偶校验外,同时也需要对输出给的外部数据提供一个奇偶校验结果,方便外部模块比对数据是否传输正常。

3.1、举例

仅对输出数据为8-bit的情况做示例,其他位宽原理一致。

欲串行发送数据“11101000”:

奇校验结果应为“1”,实际应传输“111010001”:

偶校验结果应为“0”,实际应传输“111010000”:

实现方法:

根据异或的定义:相异为1,相同为0。可推出:偶数个1异或的结果为0,奇数个1异或的结果为1。所以:

偶校验:将输入数据按位异或

奇校验:将输入数据按位异或再取反(与偶校验相反)

3.2、verilog实现

根据上述,编写如下代码:

module odd_even2(input           clk     ,input  [7:0]   in      ,   //并行输入input         reset   ,   //同步复位,高电平有效output   reg     odd     ,   //奇校验位output    reg     even        //偶校验位
);always@(posedge clk)beginif(reset)beginodd <= 1'b0;even <= 1'b0;endelse beginodd <= ~(^in);even <= ^in;end
endendmodule

3.3、testbench仿真

编写仿真对上述模块进行测试,激励输入随机生成8-bit数据:

`timescale 1ns/1ns  //时间单位/精度//------------<模块及端口声明>----------------------------------------
module tb_odd_even2();reg           clk     ;
reg [7:0]   in      ;
reg         reset   ;wire       odd     ;
wire        even    ;
//------------<例化被测试模块>----------------------------------------
odd_even2   odd_even2_inst(.clk (clk),.reset    (reset),.in     (in),.odd   (odd),.even (even)
);//------------<设置初始测试条件>----------------------------------------
initial beginclk = 1'b1;                  //初始时钟为0reset <= 1'b1;             //初始复位#20reset <= 1'b0;        end
//------------<设置时钟>----------------------------------------------
always #10 clk = ~clk;     //系统时钟周期20nsalways #20 in <= {$random}%256; //每20ns随机生成8-bit数据endmodule

3.4、仿真结果

仿真结果如下:

  • 由于使用的时序逻辑,所以校验位的输出会落后输入数据一个时钟周期
  • 输入数据“00100100”,奇校验位应为:1   偶校验位应为:0  ,仿真结果与分析一致。其他数据不分析了,都时满足要求的

4、总结

  • 奇偶校验属于是一种比较简单的校验方式,效率比较低(如果传输过程中偶数个位同时错误,则无法校验出来),但是对于一般要求不严格的场合还是应用的较多,需要熟练掌握
  • 需要工程的同学可以评论留下邮箱

Verilgo实现的FPGA奇偶校验相关推荐

  1. FPGA(九)RTL代码之五(基本电路设计2)

    系列文章目录 FPGA(四)数字IC面试的四个基本问题 FPGA(五)RTL代码之一(跨时钟域设计) FPGA(六)RTL代码之二(复杂电路设计1) FPGA(七)RTL代码之三(复杂电路设计2) F ...

  2. FPGA刷题P1:4选1多路选择器、异步复位的串联T触发器、奇偶校验、移位拼接乘法

    牛客网上面有FPGA的刷题平台,打算暑假把上面的题刷了,代码思路给大家分享 目录 4选1多路选择器 异步复位的串联T触发器 奇偶校验 移位拼接乘法 位拆分与运算 4选1多路选择器 这道题用组合逻辑,s ...

  3. FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异

    文章目录 前言 DDR的前世SDRAM DDR的今生以及演变版本:DDR/DDR2/DDR3 DDR/DDR2/DDR3/DDR4之间简单对比 速度对比 电压对比 延迟对比 预取差异 电阻端接对比 物 ...

  4. FPGA基础知识极简教程(6)UART通信与移位寄存器的应用

    博文目录 写在前面 正文 关于UART的介绍 UART通信过程 UART.RS232以及TTL之间的关系 UART的使用场合 有关UART的总结 调试UART的技巧 UART的Verilog实现 波特 ...

  5. FPGA从Xilinx的7系列学起(4)

    2. 最基本的BlockRAM 2.1 BlockRAM的初探 BlockRAM资源对FPGA来说也是非常重要的,我们的很多设计用到了BlockRAM以后,可以变得设计非常灵活,这样我们就可以设计出很 ...

  6. 32 串口波特率_「正点原子FPGA连载」第五章串口中断实验

    1)实验平台:正点原子达芬奇FPGA开发板 2) 摘自[正点原子]达芬奇之Microblaze 开发指南 3)购买链接:https://detail.tmall.com/item.htm?id=624 ...

  7. 基于FPGA的UART接口协议设计

    一.PC终端概述 PC终端,Personal Computer 智能终端,通俗的讲,就是利用电脑GUI界面控制我们的外部硬件电路. 因此设计到了PC与外部硬件电路的通信接口.对于台式电脑.个人笔记本, ...

  8. 用FPGA搭建一个STM32内核?

    1.必要的基础知识 为了更快的完成在FPGA上实现ARM Cortex-M3软核,一些必要的基础知识还是要有的! FPGA开发基础知识,如FPGA开发流程,设计.综合.布局.布线.约束.下载 Xili ...

  9. FPGA学习之路—接口(1)—URAT Verilog程序设计

    FPGA学习之路--URAT Verilog程序设计 UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)是广泛使用的异步串行数据通信协议 ...

最新文章

  1. python使用什么作为转义字符-详解用Python处理HTML转义字符的5种方式
  2. bugfree-工具
  3. Vux+Cordova打包的安卓App实现微信分享朋友和朋友圈
  4. [云炬创业基础笔记]第十一章创业计划书测试11
  5. 2019春第五周作业
  6. pdo oracle返回参数游标,PDOStatement::closeCursor
  7. 使用glbindbuffers产生访问冲突_预防IP地址冲突的应对方案,你知道吗?
  8. Mac OS X Yosemite安装Hadoop 2.6记录
  9. Trisk:在 Flink 实现以 task 为中心的流处理动态 Reconfiguration 的 Control Plane
  10. java collection自定义comparator进行排序
  11. 4月第三周网络安全报告:发现放马站点域名437个
  12. c语言分数乘法,ATmega32中文资料.pdf
  13. 设置notepad++背景护眼色
  14. Maven的作用通俗介绍
  15. python-GUI图形界面之Tkinter(常用控件、事件对象、布局管理)
  16. 某摄像头的游戏的总结
  17. preLaunchTask“C/C++:g++.exe生成活动文件“已终止,退出代码为-1
  18. chi2inv函数 matlab_matlab函数列表(A~Z)【转】
  19. 计算机实训前言研究内容,计算机专业实践论文提纲模板 计算机专业实践论文提纲怎样写...
  20. 安装oh my zsh

热门文章

  1. CDA1级习题复习(2)
  2. 猫眼爬虫三-终极篇:破解滑动验证,动态字体加密
  3. 护眼灯真的可以保护眼睛吗?市面上的护眼台灯到底是不是智商税
  4. Led护眼灯真的有效果吗?2022双十一最值得入手护眼台灯推荐
  5. 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw
  6. eBPF 是用来干什么的?
  7. 《 Python程序设计项目案例》— 用Python开发的基于TCP通讯协议的私人聊天室 (期末大作业、结课作业、课程设计、毕业设计)
  8. Elasticsearch——Settings设置
  9. 【机器人学习】abb工业机器人运动学分析与圆弧轨迹规划(三维模型+matlab代码)
  10. 详述 MIMIC 数据库26张数据表(一)