本文主要是介绍奇偶校验 与 缩减运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果
(1输出偶校验,0输出奇校验)
信号示意图:
波形示意图:
解题思路
关于奇偶校验的定义:
奇校验:原始码流+校验位 总共有奇数个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
`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]};
这篇关于奇偶校验 与 缩减运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!