题解 | 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, ...);