题目描述:
现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果
(1输出偶校验,0输出奇校验)
信号示意图:
![](https://i-blog.csdnimg.cn/blog_migrate/519c288c7377860b92b6aac84e1d639e.png)
波形示意图:
![](https://i-blog.csdnimg.cn/blog_migrate/e081a5010a09bcf0b3e711f9a086c327.png)
解题思路
关于奇偶校验的定义:
奇校验:原始码流+校验位 总共有奇数个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 @ (*) 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]};