首页 > 编程知识 正文

奇偶校验电路设计,verilog仿真

时间:2023-05-05 21:22:10 阅读:154512 作者:2772

1、奇偶校验(Parity Check )是一种用于校验码传输正确性的方法。 根据传送的二进制数位的“1”的个数是奇数还是偶数来进行检查。 采用奇数的叫奇检查,反之叫偶检查。 采用什么样的检查是事先决定好的。 通常,只设置一个奇偶校验位,该组中的“1”的数目是奇数或偶数。 如果使用奇数校验,当接收方收到该组代码时,它会检查“1”的数量是否为奇数,以确认传输代码的正确性。

例如,总共有四个“1”可以输出名为“11101000”的8位数据组。 当使用奇偶校验时,奇偶校验位必须为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 " (如果用时序逻辑进行输出,则延迟1个时钟周期) )。

偶校验设为" x-0-0-0-1-1-0-1-0 " (在时间序列逻辑输出中延迟1个时钟周期) ) )。

奇偶校验位正好延迟了数据的一个时钟周期,所以很容易连接。

时序图如下所示。

虽然输出信号odd根据输入信号而变化,但是,如果只输入了4 -比特,0001输入数据,则可知奇偶校验位0、奇偶校验位1在输入信号的下一个周期期待odd、even的输出。 其他数据相同,但这里省略说明。

奇偶校验的实现方式:奇偶校验比特默认为高电平,每当检测出1时状态就会反转

偶验证实现方式:奇偶校验位默认为低电平,每当检测到1时状态就会反转

2.2、verilog的实现基于上述内容,编写以下代码:

moduleodd_even1(inputclk,inputin,//串行输入inputreset,//同步复位,高电平有效outputregodd,//奇偶校验位outputregeven//always@(Posedgeclk ) beginif ) reset ) beginodd=1'b1; even=1'b0; endelseif(in ) beginodd=~odd; Even=~Even; endelse beginodd=odd; 伊本-伊本; endendendmodule 2.3、testbench仿真创建仿真对上述模块进行测试,激励输入随机生成0或1。

` timescale 1ns/1ns//时间单位/精度//------- -模块及端口声明------reg clk; regin; 注册向导; wireeven; //---------实例化被测试模块--------odd _ even1/---- -初始测试条件-----------------------------将被测试模块实例化//初始复位#20reset=1'b0; end//------------设置时钟//系统时钟周期20nsalways #20 in={$random}%2; 每20ns随机生成0或1endmodule 2.4,模拟结果如下。

假设在两条黄线的中间正好传输了一次8 -位数据,则所传输的数据应为1011_1111 (低位为高位),该组中的数据的奇偶校验位为) 0。 奇偶校验位为1; 上图中蓝色字体表示与理论相同,只要输入数据的第9位为1,即可视为偶校验。

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

3、检查输出数据的方法除了奇偶校验接收数据的正确性外,还必须对同时输出的外部数据提供奇偶校验结果,便于外部模块核对数据是否正常传输。

3.1、仅给出了输出数据为8-bit时的例子,其他位宽原理一致。

要串行发送数据“11101000”:

检查结果为“1”,实际上应传输“111010001”。

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

 实现方法:

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

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

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

3.2、verilog实现

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

module odd_even2( inputclk, input[7:0]in,//并行输入 inputreset, //同步复位,高电平有效outputregodd,//奇校验位 outputregeven//偶校验位);always@(posedge clk)beginif(reset)beginodd <= 1'b0;even <= 1'b0;endelse beginodd <= ~(^in);even <= ^in;endendendmodule 3.3、testbench仿真

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

`timescale 1ns/1ns//时间单位/精度//------------<模块及端口声明>----------------------------------------module tb_odd_even2();regclk;reg[7:0]in;regreset;wireodd;wireeven ;//------------<例化被测试模块>----------------------------------------odd_even2odd_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、总结 奇偶校验属于是一种比较简单的校验方式,效率比较低(如果传输过程中偶数个位同时错误,则无法校验出来),但是对于一般要求不严格的场合还是应用的较多,需要熟练掌握需要工程的同学可以评论留下邮箱

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。