牛客上的一道题,记录一下
这道题有两种思路:
第一种是按位比较,列举出所有情况:
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]) |
(~(A[3]^B[3]) & ((A[2]^B[2])&A[2])) |
(~(A[3]^B[3]) & ~(A[2]^B[2]) & ((A[1]^B[1])&A[1])) |
(~(A[3]^B[3]) & ~(A[2]^B[2]) & ~(A[1]^B[1]) & ((A[0]^B[0])&A[0]));
assign Y1 = ~(A[0]^B[0]) & ~(A[1]^B[1]) & ~(A[2]^B[2]) & ~(A[3]^B[3]);
assign Y0 = ~(Y2 ^ Y1);
//assign Y0 = ((A[3]^B[3])&B[3]) |
// (~(A[3]^B[3]) & ((A[2]^B[2])&B[2])) |
// (~(A[3]^B[3]) & ~(A[2]^B[2]) & ((A[1]^B[1])&B[1])) |
// (~(A[3]^B[3]) & ~(A[2]^B[2]) & ~(A[1]^B[1]) & ((A[0]^B[0])&B[0]));
endmodule
第二种方法是,使用同或的方式获取一个标志位,进而获得判断依据:
`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 [3:0 ]temp,temp1;
assign temp = ~A ^ B;
assign temp1 = {1'b1,&temp[3],temp[3]&temp[2],&temp[3:1]};
assign Y2 = |(temp1 & A & ~B);
assign Y1 = &temp;
assign Y0 = ~Y2^Y1;
endmodule
关于比较器还有另外一道题
问题描述
给定8个数,以及若干二输入的比较器(可以将两个输入排序)。要求在单周期内实现8个数的排序,并使用最少的比较器个数。(乐鑫)
问题解析
问题简化为4输入排序,很自然就想到,先分两组,每组之间排一下:(*表示较大的输出)
所以4个数进行排序需要的最少的二输入比较器个数是5个。
那么现在问题回到8个数,实际上我们相当于已经有了4输入进行排序的模块,用若干个4输入排序模块来完成8输入排序。相对于二输入模块,四输入的模块的输出可以分为两组,一组最大次大,另一组最小次小。实际上还是按照刚才的拓扑结构,将二输入换成四输入即可:
只需要5*2+3*3 = 19 个比较器。