一、题目描述
现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果(1输出奇校验,0输出偶校验)
信号示意图:
输入描述:
输入信号 bus sel
类型 wire
输出描述:
输出信号 check
类型 wire
二、实现思路
单目运算符:一个操作数
c=^a
双目运算符:两个操作数
c=a^b
三目运算符:三个操作数
d=(c) ? a:b;
单目运算符举例:
^
按位异或
check_temp = ^bus= bus[31]`^` bus[30]`^`..`^`bus[0]
如果bus有奇数个1,check_temp =1;反之,check_temp =0。
check_temp = ^bus
功能为检测bus中1的个数
&
按位与
check_temp = &bus= bus[31]`&` bus[30]`&`..`&`bus[0]
如果bus全为1,check_temp =1;反之,check_temp =0。
check_temp = &bus
功能为检测bus是否全为1,(是否含0)
|
按位或
check_temp = |bus= bus[31]`|` bus[30]`|`..`|`bus[0]
如果bus全为0,check_temp =0;反之,check_temp =1。
check_temp = |bus
功能为检测bus是否全为0,(是否含1)
所以题目要求进行奇偶校验(Parity Check:在数据位后添加一个校验位,使得所有数位中1的个数为奇数或者偶数)
sel为1输出奇校验(添加校验位后1的总数是奇数,包括你要加上的一位)
sel为0输出偶校验(添加校验位后1的总数是偶数)
按题目的意思bus是已经包含了校验位,不然理解有歧义
三、代码展示
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire check_temp;
assign check_temp=^bus;
//assign check = (sel == 1'b1) ? check_tmp : ~check_tmp;
reg check_reg;
always @ (*) begin
if(sel) begin
check_reg=check_temp;
end
else begin
check_reg=~check_temp;
end
end
assign check=check_reg;
//*************code***********//
endmodule