题解 | 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, ...);
百度公司氛围 554人发布

查看25道真题和解析