二 硬件安全系列 逻辑电路基础知识介绍( 三 )


那么对于程序来说,如何获取呢 。 结合逻辑约束传递,首先,我们取一行存在1,且1越多越好(1越多该行优先级越高),对于该行输入逻辑,若为1则a,非1则a’ 。 对于同块行列积运算,不同行列和运算 。
接下来就是进行组合实现最优解 。
也就是相当于a’bc’d+ab’cd’+abc’d’=bc’(a’d+ad’)+ab’cd’
当然也可以组合成ad’(b’c+bc’)+a’bc’d
这些组合就是期望1组合成完整田字格,除此之外还可以趋向组合成完整行列 。
接下来是针对Multi-level logic
multi-level logic有更多的环节,如:f = ac+b ,g = f +a’c
我们可以将环节去掉,即直接用ac+b代替f写入g中,再次我们可以得到更简洁的表示ac+b+a’c = b+c
当然,这里还存在一种情况就是其中一个环节 f = ab+ac+ad
我们可以添加一个环节a,f = a(b+c+d)
那么我们如何使用程序实现这一目标呢 。
首先我们要将逻辑和数理的关系明确:
基于前面分配律的存在,我们可以将and当作乘,or当作加 。 这样我们就可以使用数理计算实现逻辑and和or的计算,但是,数理并不能表示非运算,这也就使得我们必须使用新的符号表示非运算的结果,并且忽视新符号与原要素的非关系 。
接下来就是寻找满足简化条件的环节以及元素 。
首先是添加环节的方法:添加一个环节需要满足的条件是一个元素多次出现在和形式的逻辑单元中,如上面的例子所示 。
要想知道如何用算法找到该元素必须找到该元素具有的特征:首先该元素一定在整个逻辑中出现了,也就是逻辑中的每一个元素都有可能多次出现,同时也只有逻辑中的元素才有可能 。 我们可以遍历尝试 。 (在这里我们将这个多次出现的元素集合记作divisor)
当将这一元素提出后,逻辑关系的表达式就可以变成F = D * Q + R(D就是divisor,Q是提出D元素后的逻辑的表达式,R是不包含D元素的其他逻辑的表达式集合)
for (each cube d in divisor D){ let C = {cubes in F that comtain this product term d} if (C is empty){ return (quotient = 0 ,reminder = F) } let C = cross out literals of cube d in each cube of C if(d is first cube we have looked at in divisor D){ let Q =C } else{ Q = Q ^ C } R = F - (Q*D) return (quotient = Q ,reminder = R)}但是,有些时候不仅仅是一个元素可以提取,可能是多个元素组合可以提取,如F = axc + axd + axe + bc + bd + de,我们可以提取ax和b然后在提取(c+d+e)最后形成(ax+b)(c+d+e)
所以在找到一个元素之后,我们依旧要对剩余逻辑表达式进行分析
FindKernels(cube-free SOP expression F){ K = empty for(each variable x in F){ if(there are at least 2 cubes in F that have variable x){ let S = {cubes in F that have variable x in them} let co = cube that results from intersection of all cubes in S that will be the product of just those literals that appear in each of these cubes in S K = k ∨ FindKernels(F / co) } } K = K ∨ F return K}不知道大家有没有发现这一个方法有不足之处 。
我们举一个例子:F = axc + axd + axe + bc + bd + de
我们首先提取a:a(xc+xd+xe)+bc+bd+be
然后提取x:ax(c+d+e)+bc+bd+be
之后省略 。
假设我们先提取x,再提取a,结果是不是依旧一样呢 。 答案是是的 。 所以我们使用的方法存在冗余 。
除此之外,对于同一个表达式有不同的提取方式,这不同的提取方式可能会造成最后结果的表达式不同
如:a’bc’d+ab’cd’+abc’d’=bc’(a’d+ad’)+ab’cd’=ad’(b’c+bc’)+a’bc’d
所以我们要找到一个最优的提取方式 。
如何处理呢 。 我们要找到那个出现次数最多的元素进行提取,并且一次提取最多个数元素 。 我们先对逻辑单元进行分析记录元素出现次数 。

推荐阅读