今年EDA大赛前座了一次讲座,讲的是从算法到逻辑设计的方法。在今年的题目里面,就出了这么一道题目。想看看到底有多少人真的搞明白了……
结果真是大失所望。很多人都在生搬硬套,更多的是不知所云。方法是死的,人是活的。掌握了一堆死的知识有什么用?
软件天生是顺序执行的,是基于时间的计算。而在逻辑设计中逻辑电路天生就有空间性,是基于空间的计算。是不是软件设计成什么样,逻辑设计只能依葫芦画瓢?当然不是,软件由于其顺序性和基于时间的计算特性,决定了软件的写法和优化方向和逻辑设计必然不同。首先要解决的,是输入输出关系……在确定了输入输出关系以后,逻辑设计自然就确定了。
话不多说,先看题目:用最简单的电路方案实现以下C/C++函数的功能,并用Verilog或VHDL描述该电路。要求给出详细的设计方案框图和设计流程。
PowTwoDivider(char n)
{
if (n == 0) return 0;
char divider = 1;
while ((n & divider) == 0) divider <<= 1;
return divider;
}
软件开发者这样写是很有道理的。因为软件是一条一条顺序执行的。软件中制所以有循环这种结构,就是为了节省代码量,节约程序存储器的空间。但适用于基于时间的计算的方法,很多时候并不适用于基于空间的计算。
对于生搬硬套的人来说,看到这段代码他首先想到的就是按照软件的写法,照着用Verilog或VHDL写出来就完了。如果逻辑设计这么简单,那还要逻辑设计工程师干嘛,还有HDL语言干嘛。C to Silicon不早就实现了嘛。对于这段代码,首要的不是对着代码就写,而是要看输入了什么,输出什么,输入和输出的关系,也就是代码实现的功能是什么。
只需要仔细分析就可以理解,输入为n,输出为divider。输入和输出的关系是:
n divider
00000000 00000000
xxxxxxx1 00000001
xxxxxx10 00000010
……
如果拿着这张输入输出关系的真值表去问一个学过数字电路的本科学生,如果他学得还不错的话,他会马上回答:这是优先编码器。
没错,这就是优先编码器,只不过输出不是二进制码而是独热码而已。
这应该怎么用HDL描述,还需要解释吗?
但非常不幸的就是一堆人都在那用什么移位寄存器,还弄了控制逻辑,搞得个乱七八糟的……
其实就这么简单。
所以可以说,在逻辑设计领域:求道者多如牛毛,得道者凤毛麟角……就是这个道理。