题解 | 4位数值比较器电路

方法一:硬刚

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

assign Y0= 	((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]) ;
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] pre_compare ;
wire [3:0] xnor_full;

assign xnor_full = A~^B; // A与B按位同或

assign pre_compare = {1'b1,&xnor_full[3],&xnor_full[3:2],&xnor_full[3:1]}; 
// 对第i位进行比较时,需要先判断第i位前面是否全部相同,否则i位的比较就没意义
// 最高位必比较,故pre_compare[1]为1

assign Y2 = |(pre_compare & (A & ~B)); 
// Y2_E = (pre_compare & (A & ~B))
// A[i] & ~B[i] 为1时: A[i] > B[i]; 配合pre_compare[i],
// Y2_E[i]=1表示 A[3:i-1] = B[3:i-1]且 A[i] > B[i];
// Y2_E[i]=0表示 A[i+1] <> B[i+1]或 A[i] < B[i];
// 故只要Y2_E各位中只要有一个为1,则Y2为1

assign Y1 = &xnor_full;
assign Y0 = |(pre_compare & (~A & B));

endmodule

方法三:门级(抄录)

`timescale 1ns/1ns

module comparator_4 (
    input [3:0] A,  // 4-bit 输入 A
    input [3:0] B,  // 4-bit 输入 B
    output Y2,      // A > B
    output Y1,      // A == B
    output Y0       // A < B
);

    // 中间信号
    wire [3:0] A_eq_B;  // A[i] == B[i]
    wire [3:0] A_gt_B;  // A[i] > B[i]
    wire [3:0] A_lt_B;  // A[i] < B[i]

    wire gt_temp;       // 临时信号:A > B
    wire lt_temp;       // 临时信号:A < B

    // 逐位比较
    genvar i;
    generate
        for (i = 0; i < 4; i = i + 1) begin : bit_comparison
            // A[i] == B[i]
            xnor xnor_gate(A_eq_B[i], A[i], B[i]);

            // A[i] > B[i]
            and and_gt(A_gt_B[i], A[i], ~B[i]);

            // A[i] < B[i]
            and and_lt(A_lt_B[i], ~A[i], B[i]);
        end
    endgenerate

    // A == B:所有位相等
    and and_eq(Y1, A_eq_B[0], A_eq_B[1], A_eq_B[2], A_eq_B[3]);

    // A > B:从高位到低位逐级比较
    or or_gt2(gt_temp, A_gt_B[3], 
              A_eq_B[3] & A_gt_B[2], 
              A_eq_B[3] & A_eq_B[2] & A_gt_B[1], 
              A_eq_B[3] & A_eq_B[2] & A_eq_B[1] & A_gt_B[0]);
    assign Y2 = gt_temp;

    // A < B:从高位到低位逐级比较
    or or_lt2(lt_temp, A_lt_B[3], 
              A_eq_B[3] & A_lt_B[2], 
              A_eq_B[3] & A_eq_B[2] & A_lt_B[1], 
              A_eq_B[3] & A_eq_B[2] & A_eq_B[1] & A_lt_B[0]);
    assign Y0 = lt_temp;

endmodule

补充学习:

Verilog 提供了以下基本逻辑门的原语(Primitives):

  • 与门:and
  • 或门:or
  • 非门:not
  • 异或门:xor
  • 与非门:nand
  • 或非门:nor
  • 同或门:xnor

语法:gate_type instance_name (output, input1, input2, ...);

全部评论

相关推荐

白火同学:先说结论,准大三不是特别好找实习,boss沟通300+没有实习是很正常的情况。一是暑期实习时间太短了,二是在这么多准大四都找不到实习,从实习时间和掌握技术层面,企业会优先看他们。 再说简历,其实985本+准大三到这水平的简历也很优秀了,要说的话,项目经历可以再优化一下,可以基本围绕采取STAR原则,分为项目概述、技术架构、技术亮点、实现结果,再发给AI润色一下。 最后说操作,准大三的话,如果想找实习那就多投,不过现在也7月中旬了,时间上已经略晚了。如果7月底实在找不到,也可以多刷点算法,多学点技术,这实习也不至于一定得有,当然有更好。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-24 13:35
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务