我有一个带三个输入的模块,每个输入都是三位宽。
output = f(inputA, inputB, inputC)
输出取决于三个输入的值,但不依赖于它们的顺序。
即。 f(inputA, inputB, inputC) = f(inputB, inputC, inputA)
该解决方案应该适用于FPGA和ASIC。目前我正在实现它而没有利用对称性,但我认为明确强制合成器考虑对称性将导致更好的实现。
我计划使用不依赖于它们的顺序的三个输入的散列h来实现它。然后我可以这样做:
hash <= h(inputA, inputB, inputC);
output <= VALUE0 when hash = 0 else
VALUE1 when hash = 1 else
.....
我的问题是我应该如何使用哈希函数?
到目前为止我的想法:
如果每个输入是3位宽,则有512种可能性,但在考虑对称性时只有120种,所以理论上我应该能够使用7位宽的散列。实际上它可能需要更长时间。
散列的每个位都是输入位的函数,必须遵守三个输入的对称性。散列的位应该彼此独立。但我不确定如何生成这些功能。
答案 0 :(得分:1)
正如您的问题所述,您可以排序并连接您的输入。
在伪代码中:
if (A < B)
swap(A, B);
if (B < C)
swap(B, C);
if (A < B)
swap(A, B);
作为框图:
“条件交换”块所需的6输入/ 6输出功能:
A3x = A3 B3 ;
A2x = A3 B3' B2 + A3' A2 B3 + A2 B2 ;
A1x = A2 B3' B2' B1 + A3' A2' A1 B2 + A3 A2 B2' B1
+ A2' A1 B3 B2 + A3 B3' B1 + A3' A1 B3 + A1 B1;
B3x = B3 + A3 ;
B2x = A3' B2 + A2 B3' + B3 B2 + A3 A2 ;
B1x = A3' A2' B1 + A1 B3' B2' + A2' B3 B1 + A3 A1 B2'
+ A3' B2 B1 + A2 A1 B3' + A3' B3 B1 + A3 A1 B3'
+ B3 B2 B1 + A3 A2 A1 ;
我不得不承认这个解决方案并不完全“便宜”,导致9位哈希而不是7位哈希。因此,查找表实际上可能是最佳解决方案。