Q: 统计出b0b1b2b3 b4b5b6b7里面 “1”的个数
如果能分割成 4 位,再分割成2位。
b01共有三种情况,0、1、2个"1". 可以表示成 b01={b0&b1,b0^b1}.
同理,b23 = {b2&b3,b2^b3};
画一个卡诺图: (x^y)操作
\ 00 01 10 \ 00 01 10
00|00 01 10 00| 0 1 2
01|01 00 11 01| 1 2 3
10|10 11 00 10| 2 3 4
可以看出 除了主对角线外,x^y 的值就是 b0123所包含的 "1"的个数。
主对角线上,即x=y, 对应的b0123所含"1"的个数就是两倍。即 {b01,1'b0}
wire [1:0] xor1_data = { (b0&b1)^(b2&b3), (b0^b1)^(b2^b3)};
wire xor1_eq0 = | xor1_data;
wire [2:0] H_b0123 = xor1_eq0 ? {1'b0,xor1_data} : {b0&b1,b0^b1,1'b0};
//////////////////////////////////////
wire [1:0] xor2_data = { (b4&b5)^(b6&b7), (b4^b5)^(b6^b7)};
wire xor2_eq0 = | xor2_data;
wire [2:0] H_b4567 =xor2_eq0 ? {1'b0,xor2_data} : {b4&b5,b4^b5,1'b0};
wire [3:0] H_b01234567 = H_b0123 + H_b4567 ;
我仿真了下代码,是可行的,至于具体综合的结果,希望各位拍砖.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(假如这个地方继续再画卡诺图),会发现 011亦或那部分会出现异常,
\ 000 001 010 011 100 \ 000 001 010 011 100
000 | 000 001 010 011 100 000 | 0 1 2 3 4
001 | 001 000 010 010 101 001 | 1 2 3 4 5
010 | 010 011 000 001 110 010 | 2 3 4 5 6
011 | 011 010 001 000 111 011 | 3 4 5 6 7
100 | 100 101 110 111 000 100 | 4 5 6 7 8
能否找到一种,a+b = a^b的编码?