`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 是偶校验