自然界存在量的关系,数学就是研究的这些规律。这些规律从日常生活中得到,并抽象为数学的基本关系。最基本的关系比如:“1+1=2”。这里1和2就是符号,可以换成其他的任何东西,比如“啊+啊=哦”,仅仅是符号而已。各种数的表示法则仅仅是把数表示成了不同的符号而已。“01+01=10”或者如果你愿意,可以写为“11+11=01”都可以,仅仅是符号罢了。
几个符号结合可以生成新的符号,这个过程称之为运算。一套表示世界的体系必须要:体系自身无矛盾。比如一套体系规定了“哦!=呃”和“啊+啊=哦”,那么就不能规定“啊+啊=呃”。这就是形式逻辑的基本规律。
如果好好的设计这些符号(正如我们平时见到的最常见的各种形式),可以使得运算在形式上比较简单。比如:“01+01=10”就比“11+11=01”直观。这样做是为了使得人们在写的时候就比较容易,也就是说,现行的这套体系的优化目的是为了人的方便。
现在使用数字电路来实现运算。将数字电路进行抽象,得到的基本状态是:1,0;得到的基本关系就是 and or not。当然,数字电路还有其他更多逻辑上的状态,可以用其他符号表示,比如X和Z等等。并且加入放眼整个电路,模拟电路的状态更是无穷的。
但是,从目前来看,2状态电路(我指的是目前的2进制电路)技术最成熟。该电路实现加法就是Xor。(但是现在是LUT时代了(我是指针对FPGA),门的使用不在是直接的优化目标,一切逻辑都包含在了LUT里面。LUT的输入、输出及大小,以及D触发器这些基本资源的使用更为令人关注。所以,这些算法的优化目标就是使得FPGA资源更加合理利用,性能更好。)
所以就出现了各种数的表示法,这些方法不那么直观,但是会使电路在一定程度上简化。可以看到,这些表示法有一个前提:在不改变加法器结构的前提下能够进行工作的。也就是说,这些数的表示法都承认“01+01=10”(也即承认2进制下基本的加减乘除四则运算)。这些数的表示法由于承认了“01+01=10”又不是最基本的表示法,所以在某些情况下需要修正,这也就是研究的意义所在。其实可以抛开“01+01=10”这些规律独自研究,不知道是否可以看到良好的结果。
人们现在发现了D1,2C,1C,RNS,LNS等数的体系,并研究在该体系下,加法的修正形式,以及乘法等其他运算的特殊性质,力求找到在特定限制条件下具有良好特性的数系。并且已经发现了很多良好的特性。
要想设计很好的算法,就必须知道FPGA里面的资源都有啥。学习这些基本算法的目的就是学习这种方法。并且,现在FPGA设计相当巨大,不可能在全局从LUT的角度进行优化(非常费时间和精力),只能在局部采用这种优化或者在全局采用经典的方法,以期在一定程度上实现全局的优化。