Verilgo实现的FPGA奇偶校验
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奇偶校验相关推荐
- FPGA(九)RTL代码之五(基本电路设计2)
系列文章目录 FPGA(四)数字IC面试的四个基本问题 FPGA(五)RTL代码之一(跨时钟域设计) FPGA(六)RTL代码之二(复杂电路设计1) FPGA(七)RTL代码之三(复杂电路设计2) F ...
- FPGA刷题P1:4选1多路选择器、异步复位的串联T触发器、奇偶校验、移位拼接乘法
牛客网上面有FPGA的刷题平台,打算暑假把上面的题刷了,代码思路给大家分享 目录 4选1多路选择器 异步复位的串联T触发器 奇偶校验 移位拼接乘法 位拆分与运算 4选1多路选择器 这道题用组合逻辑,s ...
- FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异
文章目录 前言 DDR的前世SDRAM DDR的今生以及演变版本:DDR/DDR2/DDR3 DDR/DDR2/DDR3/DDR4之间简单对比 速度对比 电压对比 延迟对比 预取差异 电阻端接对比 物 ...
- FPGA基础知识极简教程(6)UART通信与移位寄存器的应用
博文目录 写在前面 正文 关于UART的介绍 UART通信过程 UART.RS232以及TTL之间的关系 UART的使用场合 有关UART的总结 调试UART的技巧 UART的Verilog实现 波特 ...
- FPGA从Xilinx的7系列学起(4)
2. 最基本的BlockRAM 2.1 BlockRAM的初探 BlockRAM资源对FPGA来说也是非常重要的,我们的很多设计用到了BlockRAM以后,可以变得设计非常灵活,这样我们就可以设计出很 ...
- 32 串口波特率_「正点原子FPGA连载」第五章串口中断实验
1)实验平台:正点原子达芬奇FPGA开发板 2) 摘自[正点原子]达芬奇之Microblaze 开发指南 3)购买链接:https://detail.tmall.com/item.htm?id=624 ...
- 基于FPGA的UART接口协议设计
一.PC终端概述 PC终端,Personal Computer 智能终端,通俗的讲,就是利用电脑GUI界面控制我们的外部硬件电路. 因此设计到了PC与外部硬件电路的通信接口.对于台式电脑.个人笔记本, ...
- 用FPGA搭建一个STM32内核?
1.必要的基础知识 为了更快的完成在FPGA上实现ARM Cortex-M3软核,一些必要的基础知识还是要有的! FPGA开发基础知识,如FPGA开发流程,设计.综合.布局.布线.约束.下载 Xili ...
- FPGA学习之路—接口(1)—URAT Verilog程序设计
FPGA学习之路--URAT Verilog程序设计 UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)是广泛使用的异步串行数据通信协议 ...
最新文章
- python使用什么作为转义字符-详解用Python处理HTML转义字符的5种方式
- bugfree-工具
- Vux+Cordova打包的安卓App实现微信分享朋友和朋友圈
- [云炬创业基础笔记]第十一章创业计划书测试11
- 2019春第五周作业
- pdo oracle返回参数游标,PDOStatement::closeCursor
- 使用glbindbuffers产生访问冲突_预防IP地址冲突的应对方案,你知道吗?
- Mac OS X Yosemite安装Hadoop 2.6记录
- Trisk:在 Flink 实现以 task 为中心的流处理动态 Reconfiguration 的 Control Plane
- java collection自定义comparator进行排序
- 4月第三周网络安全报告:发现放马站点域名437个
- c语言分数乘法,ATmega32中文资料.pdf
- 设置notepad++背景护眼色
- Maven的作用通俗介绍
- python-GUI图形界面之Tkinter(常用控件、事件对象、布局管理)
- 某摄像头的游戏的总结
- preLaunchTask“C/C++:g++.exe生成活动文件“已终止,退出代码为-1
- chi2inv函数 matlab_matlab函数列表(A~Z)【转】
- 计算机实训前言研究内容,计算机专业实践论文提纲模板 计算机专业实践论文提纲怎样写...
- 安装oh my zsh
热门文章
- CDA1级习题复习(2)
- 猫眼爬虫三-终极篇:破解滑动验证,动态字体加密
- 护眼灯真的可以保护眼睛吗?市面上的护眼台灯到底是不是智商税
- Led护眼灯真的有效果吗?2022双十一最值得入手护眼台灯推荐
- 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw
- eBPF 是用来干什么的?
- 《 Python程序设计项目案例》— 用Python开发的基于TCP通讯协议的私人聊天室 (期末大作业、结课作业、课程设计、毕业设计)
- Elasticsearch——Settings设置
- 【机器人学习】abb工业机器人运动学分析与圆弧轨迹规划(三维模型+matlab代码)
- 详述 MIMIC 数据库26张数据表(一)