奇偶校验 与 缩减运算

题目描述:

      现在需要对输入的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 @ (*) beginif(sel) begincheck_reg = check_tmp;endelse begincheck_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]};

    


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部