奇偶校验 与 缩减运算

题目描述:

      现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果

            (1输出偶校验,0输出奇校验)

信号示意图:

波形示意图:

解题思路

关于奇偶校验的定义:

奇校验:原始码流+校验位 总共有奇数个1

偶校验:原始码流+校验位 总共有偶数个1

所以奇偶校验的关键是确定原始码流中有多少个1,实现思路有两种:

  1. 笨办法,原始码流的所有bit相加,根据和数据的最低bit是0还是1来判断原始码流中1的个数;

`timescale 1ns/1ns
module odd_sel(
input [31:0] data,
input        sel,
output       check
);
//*************code***********//
// sel  == 0  偶校验
// sel  == 1  奇校验
wire [7:0]  check_1_num ;
assign check_1_num = data[0] + data[1] + data[2] + data[3] + data[4] + 
                     data[5] + data[6] + data[7] + data[8] + data[9] +
                     data[10] + data[11] + data[12] + data[13] + data[14] + 
                     data[15] + data[16] + data[17] + data[18] + data[19] + 
                     data[20] + data[21] + data[22] + data[23] + data[24] +
                     data[25] + data[26] + data[27] + data[28] + data[29] +  
                     data[30] + data[31] ;
assign check = (sel) ? ~check_1_num[0] : check_1_num[0];

//*************code***********//
endmodule
  1. 缩减运算符,使用缩减异或,如果原始码流有奇数个1,则缩减的结果为1

`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire check_tmp;
    
    // 单目运算符
    assign check_tmp = ^bus;
  //  assign check = (sel == 1'b1) ? check_tmp : ~check_tmp;
    
    reg check_reg;
    always @ (*) begin
        if(sel) begin
            check_reg = check_tmp;
        end
        else begin
            check_reg = ~check_tmp;
        end 
    end 
    
    assign check = check_reg;

//*************code***********//
endmodule

举一反三

类似的缩减运算符(也叫单目运算符,因为操作数只有一个,运算的结果也只有1bit)

除了缩减异或,还包括

  1、 缩减与    a[0] = &b[7:0];

       等效于   a[0] = b[0] & b[1] & b[2] & b[3] & b[4] & b[5] & b[6] & b[7];

       可用于判断码流中是否有 0 存在;

2、 缩减或   a[0] = | b[7:0];

等效于 a[0] = b[0] | b[1] | b[2] | b[3] | b[4] | b[5] | b[6] | b[7];

可用于判断码流中是否有 1 存在;

进一步的关于 && 和 & 的区别?

官方定义是  :&& 是逻辑操作符 ;& 是位操作符

什么意思呢?&& 操作符得到的运算结果只能是逻辑值(即0/1/x);

                  如 (a==b && c == d ) 此处就应该使用“&&”

       & 位操作符,顾名思义按位求与;

      a[3:0] & b[3:0] = {a[3]&b[3],a[2]&b[2],a[1]&b[1],a[0]&b[0]};

    

猜你喜欢

转载自blog.csdn.net/ypcan/article/details/128990790