题解 | 4位数值比较器电路
4位数值比较器电路
https://www.nowcoder.com/practice/e02fde10f1914527b6b6871b97aef86d
`timescale 1ns/1ns module comparator_4( input [3:0] A , input [3:0] B , output wire Y2 , //A>B output wire Y1 , //A=B output wire Y0 //A<B ); assign Y2 = (A[3] & ~B[3]) | (~(A[3] ^ B[3]) & (A[2] & ~B[2])) | (~(A[3] ^ B[3]) & ~(A[2] ^ B[2]) & (A[1] & ~B[1])) | (~(A[3] ^ B[3]) & ~(A[2] ^ B[2]) & ~(A[1] ^ B[1]) & (A[0] & ~B[0])); assign Y1 = ~(A[3] ^ B[3]) & ~(A[2] ^ B[2]) & ~(A[1] ^ B[1]) & ~(A[0] ^ B[0]); assign Y0 = ~(Y2 | Y1); endmodule
如何使用门电路实现?提供一种最直接的方式。如果卡诺图(真值表)已经给出,就可以直接把其中真值为1的项“或”起来。
判断单bit大小
单bit只有0或者1,因此如果单比特数a>b,只可能是a=1,b=0.则Verilog描述为:a & ~b
若a=b,则Verilog描述为~(a^b)。
计算Y2(A>B)
例如Y2:要表示A>B,就需要从高位开始逐个比对,如果高位相同,再比较次高位。
在Verilog描述中,
例如A[3]>B[3],则Y2=1。(verilog描述:A[3]=1并且B[3]=0,也就是(A[3] & ~B[3]))
如果A[3]=B[3]的时候,再比较A[2]>B[2]?,如果是则Y2=1。((~(A[3] ^ B[3]) & (A[2] & ~B[2])))
依次类推。
计算Y1(A==B)
只有各个bit都相等,A和B才相等,所以很简单一行式子:
assign Y1 = ~(A[3] ^ B[3]) & ~(A[2] ^ B[2]) & ~(A[1] ^ B[1]) & ~(A[0] ^ B[0]);
计算Y0
可以取巧,既不是A>B也不是A=B,则只能是A<B。根据德摩根定律,有两种写法:
assign Y0 = ~(Y2 | Y1); // NOR gate
assign Y0 = ~Y2 & ~Y1; // AND gate + OR gate