牛客刷题<11>4位数值比较器电路

题目:4位数值比较器电路_牛客题霸_牛客网

知识:

门级描述,无非就是将<,>,==三个符号用门级电路来表示,然后根据行为级描述进行替换。

a == b  --> ~(a^b)

a > b --> (a^b)&a

a < b --> (a^b)&b

行为级描述就是从最高位依次比较。

解法一

`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 Y1 = ~(A[0]^B[0]) & ~(A[1]^B[1]) & ~(A[2]^B[2]) & ~(A[3]^B[3]);
    
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 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

解法二:转换为门电路

a>b ---  a&(~b)

a<b --- (~a)&b

a=b ---~a^b

`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 = ((~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]);

endmodule

解法三:最容易想到的

`timescale 1ns/1ns

module comparator_4(
    input        [3:0]       A       ,
    input       [3:0]        B       ,
 
     output     reg        Y2    , //A>B
    output   reg        Y1    , //A=B
    output   reg       Y0      //A<B
);
    always @(*) begin
        if(A==B) begin
           Y0 = 0;
           Y1 = 1;
           Y2 = 0;
        end
        else if(A[3]>B[3]) begin
           Y0 = 0;
           Y1 = 0;
           Y2 = 1;
        end
        else begin
            if(A[3]<B[3]) begin
               Y0 = 1;
               Y1 = 0;
               Y2 = 0;     
            end
            else begin
                if(A[2]>B[2]) begin
                   Y0 = 0;
                   Y1 = 0;
                   Y2 = 1;
                end
                else begin
                    if(A[2]<B[2]) begin
                       Y0 = 1;
                       Y1 = 0;
                       Y2 = 0;     
                    end
                    else begin
                        if(A[1]>B[1]) begin
                           Y0 = 0;
                           Y1 = 0;
                           Y2 = 1;
                        end
                        else begin
                            if(A[1]<B[1]) begin
                               Y0 = 1;
                               Y1 = 0;
                               Y2 = 0;   
                            end
                            else begin
                                if(A[0]>B[0]) begin
                                   Y0 = 0;
                                   Y1 = 0;
                                   Y2 = 1;
                                end
                                else begin
                                   Y0 = 1;
                                   Y1 = 0;
                                   Y2 = 0;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
endmodule

解法四:自己写的

`timescale 1ns/1ns

module comparator_4(
	input		[3:0]       A   	,
	input	   [3:0]		B   	,
 
 	output	 reg		Y2    , //A>B
	output   reg        Y1    , //A=B
    output   reg        Y0      //A<B
);
    always@(A or B)
        begin
        if(A[3]>B[3])begin
        Y2=1;
        Y1=0;
        Y0=0;
        end
        else if(A[3]>B[3])begin
        Y2=0;
        Y1=0;
        Y0=1;
        end
        else if((A[3]==B[3])&&(A[2]>B[2]))begin
        Y2=1;
        Y1=0;
        Y0=0;    
        end
        else if((A[3]==B[3])&&(A[2]<B[2]))begin
        Y2=0;
        Y1=0;
        Y0=1;
        end
        else if((A[3]==B[3])&&(A[2]==B[2])&&(A[1]>B[1]))begin
        Y2=1;
        Y1=0;
        Y0=0;     
        end
        else if((A[3]==B[3])&&(A[2]==B[2])&&(A[1]<B[1]))begin
        Y2=0;
        Y1=0;
        Y0=1;
        end    
        else if((A[3]==B[3])&&(A[2]==B[2])&&(A[1]==B[1])&&(A[0]>B[0]))begin
        Y2=1;
        Y1=0;
        Y0=0;    
        end
        else if((A[3]==B[3])&&(A[2]==B[2])&&(A[1]==B[1])&&(A[0]<B[0]))begin
        Y2=0;
        Y1=0;  
        Y0=1;
        end
        else if((A[3]==B[3])&&(A[2]==B[2])&&(A[1]==B[1])&&(A[0]==B[0]))begin
        Y2=0;
        Y1=1;
        Y0=0;
        end
        end
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
);

    assign Y2 = (A>B)?1:0;
    assign Y1 = (A==B)?1:0;
    assign Y0 = (A<B)?1: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
);

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 = (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]);
    
endmodule

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值