FPGA基础-奇偶校验器设计

关注、星标公众号,精彩内容每日送达
来源:网络素材

01e564d37a02d1b04badba126dcc05ae.jpeg

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

0c909da68f29a866ebb79c45888c2ab2.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 仿真结果

8d0d10f6ab8e9c036913884be12ff5f2.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

仿真结果

954e0fd3b233378a8a154bb90f755504.png

四、总结

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

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

33db3827107ac571e3be0ff0f92aba5c.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FPGA(现场可编程门阵列)是可编程逻辑件,可以被重新配置以执行特定的功能。串口通信是一种通过单根线传输数据的通信方式,而UART(通用异步收发传输)是一种实现串口通信的硬件接口。 FPGA可以实现带奇偶校验的串口UART。奇偶校验是一种用于检测和纠正串行传输中数据错误的技术。在奇偶校验的串口UART中,发送方会在数据中插入一个校验位,以表示数据中1的个数是奇数还是偶数。接收方在接收数据时会计算接收到的数据中1的个数,并与校验位进行比较,以判断数据是否正确。如果校验错误,接收方会发出错误标志。 在FPGA中,可以使用VHDL或Verilog等硬件描述语言来实现带奇偶校验的串口UART。首先,需要定义数据的格式,包括起始位、数据位、校验位和停止位。然后,根据数据格式编写发送和接收数据的逻辑代码。发送数据时,FPGA会将发送的数据添加起始位、数据位、校验位和停止位,并通过串口线发送出去。接收数据时,FPGA会接收串口线上的数据,并进行校验和解析,得到有效的数据。 通过使用FPGA实现带奇偶校验的串口UART可以实现可编程的串口通信接口,使得我们可以根据需要对串口通信进行定制和优化。这对于很多应用场景,如通讯设备、工业控制、嵌入式系统等都是非常有用的。 ### 回答2: FPGA(现场可编程门阵列)是一种可编程的芯片,可以通过在内部重新连接其门和触发,以实现不同的逻辑和功能。串口(Serial Port)是一种用于数据传输的通信接口,UART(Universal Asynchronous Receiver Transmitter)是一种串行通信协议。 FPGA可以实现带奇偶校验的串口UART功能。奇偶校验是一种错误检测方法,用于判断数据传输过程中是否存在误码。在传输数据的过程中,发送端将数据按照一定规则进行校验,在接收端对校验结果进行检查以确认数据的正确性。 要在FPGA中实现带奇偶校验的串口UART,首先需要在FPGA内部设计一个串口UART模块。该模块可以包括发送端和接收端的功能单元。 在发送端,数据需要进行奇偶校验。发送的数据经过计算生成奇偶校验位,并与发送数据一起发送出去。 在接收端,接收到的数据会自动检查奇偶校验位。如果接收到的数据与校验位不匹配,将会产生一个错误标志。反之,如果匹配成功,可以确认数据的正确性。 在FPGA设计中,需要编写相应的逻辑代码实现串口UART模块的功能。通过使用硬件描述语言(如VHDL或Verilog),可以描述功能单元和模块之间的连接关系。 此外,还需根据具体的硬件平台和串口通信的标准进行配置和接口实现。例如,串口通信的波特率、数据位长度、停止位和校验位等参数需要在FPGA中进行设置。 通过以上步骤,可以在FPGA上实现带奇偶校验的串口UART功能。这种实现可以在很多应用中使用,如通信设备、工业自动化等领域,以实现可靠的数据传输和通信。 ### 回答3: FPGA是一种可编程逻辑件,可以用于实现各种数字逻辑电路。而UART(通用异步收发)是一种常见的串口通信协议,用于在电子设备之间进行数据的传输和通信。 在实现带奇偶校验的串口UART通信时,FPGA可以用于设计和实现相关的电路逻辑。一般来说,串口UART的核心是一个收发(Transceiver)模块,它负责将数据从串口接收到的电平信号转换为数字信号,并将数字信号转换为串口发送的电平信号。 对于奇偶校验,其作用是检测和纠正数据传输过程中的错误。在UART通信中,奇偶校验位通过对数据位进行计算,确定数据位中的1的个数是奇数还是偶数,并将这个结果添加到数据位后面作为校验位。接收端会通过比较接收到数据位的奇偶性和接收到的校验位来判断数据是否传输正确。 在FPGA中,可以通过使用逻辑门来计算奇偶校验位并与数据位进行拼接。当数据位和校验位传输到UART的收发时,FPGA还可以通过电平转换电路将这些信号转换为适配串口标准的电平信号。 总之,通过FPGA实现带奇偶校验的串口UART主要涉及设计和实现收发模块,计算奇偶校验位以及进行电平信号的转换。这样就可以实现带有奇偶校验功能的串口通信,提高数据传输的可靠性和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值