所谓4:2 compressor,就是把4个数压缩成两个数,下图所示为一个4:2 compressor单元:
由图可以看出把X1,X2,X3,X4这四个数压缩成Sum与Carry这两个数,其中,Cin,Cout是进位,且这些数满足以下关系:
4:2 compressor的门级电路图如下图所示:
对应的逻辑表达式为:
对应的verliog代码实现:
module compressor #(parameter DATA_WIDTH = 8) ( input [DATA_WIDTH - 1 : 0] a, input [DATA_WIDTH - 1 : 0] b, input [DATA_WIDTH - 1 : 0] c, input [DATA_WIDTH - 1 : 0] d, input cin, output [DATA_WIDTH - 1 : 0] sum, output [DATA_WIDTH - 1 : 0] carry, output cout ); wire [DATA_WIDTH - 1 : 0] s_temp, cin_arry, cout_arry; assign s_temp = a ^ b ^ c; assign cout_arry = (a ^ b) & c | a & b; assign cin_arry = {cout_arry[DATA_WIDTH - 2 : 0], cin}; assign sum = s_temp ^ d ^ cin_arry; assign carry = (s_temp ^ d) & cin_arry | s_temp & d; assign cout = cout_arry[DATA_WIDTH - 1]; endmodule
下面再贴一段对应的C语言代码,可以验证一下
#include <stdio.h> int main() { unsigned char x1 = 0, x2 = 0, x3 = 0, x4 = 0, cin = 0; unsigned char co_t, cin_t, temp; unsigned char sum, carry, cout; while (scanf("%d %d %d %d %d", &x1, &x2, &x3, &x4, &cin) != EOF) {//x1, x2, x3, x4为0-255的无符号数, cin为0或1 temp = x1 ^ x2 ^ x3; cout = (x1^x2) & x3 | x1 & x2; co_t = cout & 0x0080; co_t = co_t << 1; cin_t = ( cout << 1 ) | cin; sum = temp ^ x4 ^ cin_t; carry = (temp ^ x4) & cin_t | temp & x4; printf("cout = %d, carry = %d, sum = %d\n", cout >> 7, carry, sum); } return 0; }