题目有两个输入:
1、32位数据bus
2、奇偶检验选择sel
题干其实说的很不好理解,意思是这样的:首先判断bus的奇偶性。sel为1(奇校验)时,若bus为偶,check输出1,目的是让bus变成奇数;若bus为奇,则check输出0。
同理,sel为0(偶校验)时,若bus为奇,check输出0;bus为偶,则为1。
奇偶校验是一个经典的位操作程序,如果想使用笨办法去算1的数量,然后取余数判断奇偶性。理论上行得通,但题里会报错。所以必须学会最简单最快捷的位操作。
Verilog 操作符^。意思是按位异或。这个操作有两种用法,举例:
a = 4'b1010;
b = 4'b1100;
c = a^b;//此时,c的值为:4'b0110
a = b1010;
b = ^a;//此时 b= 1^0^1^0 = 1'b0;
两个数的异或在哪用以后再说。
一个数的异或是用来做奇偶校验的。
如果a为偶,那么无论如何,^a的结果都是0;同理,若a为奇,^a一定是1。这里不说为什么,为什么是数学领域的事,我也不知道。
同时也发现,当sel为1时,bus的奇偶性(1为奇,0为偶)与check不同(奇为0,偶为1),同理sel为0时。所以可以用?运算控制check的输出。
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
    wire tmp;
    assign tmp = ^bus[31:0];
    assign check = sel ? tmp : ~tmp;

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