Verilog | 4位数值比较器

牛客上的一道题,记录一下

https://i-blog.csdnimg.cn/blog_migrate/e42d0106b6903dad15be2503400ca39a.png

这道题有两种思路:
第一种是按位比较,列举出所有情况:

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 个比较器。

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值