那位在MooC上提问的同学有提了一些问题,觉得不错,就继续来更新一下。
另外,MooC的网址是:http://www.icourse163.org/course/0807uestc021-234015
有兴趣的朋友欢迎前去观看。
好,下面继续出问题集锦:
问题1:数字电路设计做深入了是否需要往算法方面努力,毕竟只有做算法才会是有深度的?
回答1:做数字集成电路主要是两个方向:算法和接口。前者主要是用数字集成电路与系统来实现一段数学运算,从而实现对数据的处理;而后者是利用数字集成电路与系统作为“电子胶水”,来连接不同的子系统,从而实现数据传输。在数字世界里,数据的传输和数据处理一样重要,有时候甚至更加重要。关于这两个方向的描述,可以参考我的博客:http://blog.chinaaet.com/molf/p/5100050503
以及这篇成名已久但是被到处转发却没有留名的博客:http://blog.chinaaet.com/molf/p/11001
问题2:如果为了让数字电路设计和算法结合起来,我们最好选择哪一个方向上的算法,通信编码解码?通信数字信号处理?数字图像处理?或者其他?等等。这样选择的理由是什么?
回答2:需要注意的一点是,作为数字集成电路工程师,我们的本职工作始终是设计电路而不是研究算法。我们做的事情只是让算法用更合理的方式以数字集成电路的形式实现而已。所以,我们最需要掌握的是把基本的算法运算转换为逻辑电路的套路,而不是深究算法本身。这些套路我们这门课后面会有所讲到,你也可以阅读《数字信号处理的FPGA实现(第4版)》加以了解。如果觉得难度太大,可以阅读高亚军编写的《基于FPGA的数字信号处理(第2版)》。熟悉了这些常见套路以后,对于任何形式的算法实现都能够做到以不变应万变。当然,如果要想充分发掘出算法实现的性能或者把实现算法所需的硬件开销降低到最低,需要算法工程师和数字集成电路工程师的密切配合和深入交流,也需要数字集成电路工程师自己加深对于算法和业务的理解。但是这个是工作经验的积累,不是靠看书能够学习到的。
问题3:如果已经选择了一个算法的方向,为了往这个方向深入,我们需要做哪方面的努力?就拿您的本行通信算法来说?我们需要看哪些书,我们需要做哪些事情?(况且FPGA现在最主要的用途就是用在通信接口上)
回答3:第三点问题我在第二点已经一并回答了。我现在想谈谈接口的问题。接口和算法其实是数字集成电路的两大分支,两者之间所需要的知识背景并不相同。这一点可以参考我第一点回答里我的博客给出的两条技能树升级路线。相比于算法,接口设计是一个高度两级分化的领域。大量的人在做着比较简单、低端和重复的工作,而少部分精英在定义接口的实现规范。相比于算法,接口设计是一个既死板又灵活的领域。死板的是说我们设计接口的时候必须要按照总线协议、接口规范来做,很难像实现算法那样随心所欲。但灵活是指很多具体的接口设计,往往需要设计者灵光一现,没有像算法实现那么多套路。就是靠设计者灵光一现,往往就可以“扣”掉一两个时钟周期的处理时间。这这对于很多应用来说都是非常关键的。另外,需要声明的一点,我虽然是学通信出身的,但是没怎么认真做过算法相关的问题。我其实是靠做接口起家。你看到了我自我介绍的时候说自己是研究如何造计算机的。造计算机的核心就在于去构建各种各样的接口,以处理器为核心把这样一个计算机系统构造起来。
问题4:这个问题可能与主题无关,是我在学习的过程中遇到的一个问题。我不知道您在写代码上的水平如何,我个人在写代码的时候就遇到过这样的一个问题,对于一个比较复杂的现实问题,我们如何才能抽象出描述它的逻辑函数;我个人在做开发时,很难把实际问题的需求分析清楚,也不知道从哪个角度去切入。如何才能提高自己写代码的水平?(其实最主要的事编程思想,如何才能提高自己的编程思维?)
回答4:就像上面说的,我们做数字集成电路设计的,其实自己去“写”代码的时候很少。我们做的事情基本是“转换”代码,把一个由伪代码或者Matlab描述的代码转换为数字集成电路的逻辑形式。所以如果你要问如何去从零开始构建一个算法,这样来写代码。其实我没有什么经验。对于如何学习“转换”代码,我第二点已经回答了。