题目有两个输入:
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