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

解题基本思路:

  1. 分析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

alt

  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

alt

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

参考代码

`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