`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output  check
);
//*************code***********//

wire odd_check ; //奇数校验
wire even_check ; //偶数校验

assign odd_check = ((^bus[31:0])== 1'b1)?1'b0:1'b1;
assign even_check = ((^bus[31:0])== 1'b0)?1'b0:1'b1;
assign check = (sel==1'b0)? odd_check:even_check;

//此题的关键在于明白什么是奇偶校验 以及这个check的作用   
//首先 奇校验指的是 数据位和校验位中的1的个数总数需要为奇数,也就是说bus中1的个数和check中的个数总数为奇数
//其次 偶校验指的是,数据位和校验位中的1的个数总数需要为偶数,也就是说bus中1的个数和check中的个数总数为偶数
//^bus[31:0] 等价于 bus[31]^bus[30]^bus[29].....  相当于向量内部的每个元素异或, 异或为1代表有奇数个1 
//所以当^bus[31:0])== 1'b1 时 代表数据位有奇数个1 了 那么校验位check 此时只能为0 所以assign odd_check = ((^bus[31:0])== 1'b1)?1'b0:1'b1;
//所以当^bus[31:0])== 1'b0 时 代表数据位有偶数个1 了 那么校验位check 此时只能为0 所以assign even_check = ((^bus[31:0])== 1'b0)?1'b0:1'b1;

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

题设中给出的条件是0是偶校验 1是奇校验 但是实际上应该是 0 是奇校验 1 是偶校验