这里要注意题目的“门级描述方式”,所以我们只能使用基本门电路:&,|,!,^,^~。
我以前分析过Vivado对比较器的编译结果:数据比较器在FPGA中的实现,在底层肯定是逐级比较的原则。
解题基本思路:
- 分析1bit比较器
A |
B |
F(A>B) |
F(A<B) |
F(A=B) |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |

- 分析2bit比较器
A1B1 |
A0B0 |
F(A>B) |
F(A<B) |
F(A=B) |
A1>B1 |
x |
1 |
0 |
0 |
A1<B1 |
x |
0 |
1 |
0 |
A1=B1 |
A0>B0 |
1 |
0 |
0 |
A1=B1 |
A0<B0 |
0 |
1 |
0 |
A1=B1 |
A0=B0 |
0 |
0 |
1 |

- 到这里4bit比较器思路也很清晰了
无非就是每位先比较出来,然后按真值表逻辑组合就行。

参考代码
`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
);
wire W_y2[0:3];
wire W_y1[0:3];
wire W_y0[0:3];
genvar gen_i;
for (gen_i = 0; gen_i < 4; gen_i = gen_i + 1) begin
compare_1 compare_1_u(
.A (A[gen_i] ),
.B (B[gen_i] ),
.Y2(W_y2[gen_i]),//A>B
.Y1(W_y1[gen_i]),//A=B
.Y0(W_y0[gen_i]) //A<B
);
end
assign Y2 = W_y2[3] | ((W_y1[3]) & (W_y2[2])) | ((W_y1[3]) & (W_y1[2]) & (W_y2[1])) | ((W_y1[3]) & (W_y1[2]) & (W_y1[1]) & (W_y2[0]));
assign Y0 = W_y0[3] | ((W_y1[3]) & (W_y0[2])) | ((W_y1[3]) & (W_y1[2]) & (W_y0[1])) | ((W_y1[3]) & (W_y1[2]) & (W_y1[1]) & (W_y0[0]));
assign Y1 = W_y1[3] & W_y1[2] & W_y1[1] & W_y1[0];
endmodule
module compare_1(
input A,
input B,
output Y2,//A>B
output Y1,//A=B
output Y0 //A<B
);
assign Y2 = A & (!B);
assign Y0 = (!A) & B;
assign Y1 = !(Y2 | Y0);
endmodule