返回列表 发帖
楼主是做技术的人,加油。
希望看到咱工程的强人成功。
工程家园需要各位朋友的关心和支持
你们的支持就是我们前进的动力


http://www.heubbs.cn

TOP

LZ好好努力~早日成功。
永远的321!

TOP

....基本上都看不懂的说....
Aloha~

TOP

厉害啊

TOP

算法的逻辑是80%,而剩下的20%是什么呢?那不和硬件紧密相关了。也就是说,这20%的逻辑转换过来,硬件上是不能直接实现的,这就需要一个折中的办法了。用现有硬实通过一定的手段间接对这部分逻辑进行实现。
C中,我们在进行数学计算时,会经常遇到浮点小点,也会经常遇到一些数学上的定义,如SinCos等等,这个时候我们通常不会去自己实现这些函数,而是直接调用数学库。对于库内的具体实现我们是不关心的。但在HDL中是不能对浮点直接进行计算的,同时也不支持相应的库函数,这就是一个最大的难题。这如同一座火焰山,让我无法逾越,到最后实现我足足花费了三天的时间。
首先要攻克的第一个难题就是对算法中的一些涉及三角计算的函数的实现。刚开始我的想法是采用麦克劳伦展开,然后取前四项之各,对三角函数进行逼近。但我转眼又想,这样作的计算量是很大的,因为展开式中会有一些阶乘项和指数运算,也许我可以找到C的数学为的源代码,那里面或许会有更好的算法。Windows里是不太可能了,还是到开源的linux里去找吧,经过千辛万苦我终于找到了一些三角函数的源代码,但打开一看,我就快吐血了----原来数学库里的函数都是用汇编写的,晕死!我还是回到原来的方法,我先用C对麦克劳伦展开进行实现,调试成功后再转为HDL,然后在仿真中看函数的输出波形,以保证函数的正确。
C里调试,转为HDL,仿真,看波形,再修改,仿真……这个过程重复了几十遍,一个个的函数在仿真中通过,离最终整体的算法实现又进了一步。
此时,最大的困难就是浮点运算了。如果要我设计出一整套浮点运算库,这显然不现实,因为我只有一天半的时间。于是,我需要去询问Intel是否可以提供现成的浮点运算库。上午我的E-Mail发了出去,同时在E-Mail里面也附带了我现阶段的研究结果。下午的时候,收到了来自Intel的邮件,里面首先对我的研究结果进行了肯定,另外对于浮点运算库提供了支持。
他们提供了一个现成的德国人写的浮点库,专门为FPGA设计。我喜出望外,最大的难题迎刃而解了。呵……
这个库很大,我要把它加到我的程序里来,我先要把它编译成Library。也许是我的计算机太慢,足足花了一下午的时候,才把整个库编译出来。
接下来一晚上的时间,先对这个库进行一个简单的功能上的测试,看看它是否计算正确。一项项地进行测试:浮点的加、减、乘、除、方根等很多部件均通过测试,在完成了对库的测试后,我又写一个测试报告,上交给了Intel,并告知他们,那个算法现在已经可以在FPGA上运行了。
到此,我才得到Intel的承诺,同意我进入其中实习了。
其实那些Intel的工程师真的是已经工作了五六年的老手了,我承认在经验上确实不可同日而语。其实后来听到了些消息,这道题在Intel内部作起来也是一个较大的工程,那些工程师也在吃惊我能如此快的完成。呵,这也为我增加了不少的信心,争取进去之后能有更好的表现。





(待续)





于振南



哈尔滨工程大学计算机科学与技术学院

TOP



奋斗

次日,接到Intel的电话:
我们这里有一题目,就是将原来用C写的算法,转成硬件描述语言,不知你有没有兴趣?
也就是算法的硬实现吧,我很感兴趣。以前想过硬实现方面的问题,没想到竟与Intel的题目不谋而合。
那好,现在我们会发一道题目到你邮箱里,如果你能在一个星期内完成,我们将进一步规划你实习的事宜。
好的,谢谢您。
很快,我的信箱里就收到了一封新的邮件。
在题目中,包含了上千行的C++代码,描述了一个用于统计计算的算法。其实刚拿到代码,我头就有点晕,不知道它具体实现的是什么功能。不过不管它的功能如何,按照题目的要求,都要保证在转为硬件描述语言后要使输出相同的结果。所以我第一步要作的是先把代码编译一遍,看一下输出。
在它的源代码文件夹下有一个makefile,这就需要在linux下进行编译。我找了一台装有linux的计算机,对代码进行了成功编译。但当我把它运行起来的时候,我不尽吃了一惊,也感觉莫名奇妙----它竟然没有任何输出。我离开了座位,开始踱来踱去思考这个问题。可以是当我再次看屏幕的时候,发现了一行run ok!,随后是几个数据。我的天!这个程序运行了足足有三分钟啊。区区一千多行代码竟然运行了这么长时间。我的第一感觉是,这个算法一定很复杂,运算量一定很大,看来Intel是在故意为难我。
这样足足一个星期的奋斗开始了……
第一步是把现在的用C++写成的算法钻研透,能够作到真正掌握它,知道它每一个细节。所以我花了整整一天的时候来研读算法。程序中除了与算法相关的内容,还有一些是调用linux系统的一些API,来实现对程序运行时的监控,用来模拟硬件仿真。这些代码是与算法无关的,因此可以把它们剔除。
剩下代码有很大一部分在描述一个数学模型,刚开始看那可是一头雾水。其实我最发怵看别人的代码,有一种自己的思想受制于人的感觉,多半时候都看不下去。但现在代码就摆在面前,还是要硬着头皮看。我想,我要想把这个算法看懂,我首先要把这个模型搞清楚。于是决定上网google一下。
Google…. Google…. Google….
呵,还不错,搜到了两个资料,虽然是E文的,但还算是自然语言。仔细研读了一个上午,终于算是有了个眉目。
这回再回到那一堆代码里,感觉才不那么抽象了。一看又是大半天,总算对它八九不离十了。
我才明白它为什么要run那么长时间了,也才领悟到为什么要进行算法的硬实现了。程序的功能是进行一种统计性的运算,设定一个动作重复400000000次,最终统计它各种情况出现的概率,这漫长的三分钟就花在这个400000000次上了。而如果把这些耗时很多的算法作成ASIC的芯片,那就将会从数量级上缩短运行的时间,最终实现所谓的HPC(高性能计算)。
要对现有代码有很深刻的了解,我想我有必要把它亲手改写成纯C的,并且保证输出结果相同。这样不仅能够证明我已经掌握了该算法,也从一定程度上说明最终转为HDL的可行性,同时其实也降低了转换的难度,从面向对象的C++到面向过程的C,再从面向过程的C到用于描述的HDL,此时我已经站在C的层次上了,我有信心完成从CHDL的转换。
我装上了久违的ISE,还是ModelSim,这些软件在Sunwise的时候都接触到过,现在又拿来安装,还算比较亲切,不过还需要温习一下。于是,又从网上baidu了一些相关资料,熟悉了半天的开发软件,感觉ISE的环境确实比AlteraMAXPLUSQUARTUS要好,还有就是重新见识到了Modelsim的强大。OK,欲善其事,先利其器!
其实从C++C,再到熟悉IDE都算简单,最难的部分在于HDL。对于VHDL,其实我也是个二把刀,原来学过的那点皮毛到现在已经剩不下什么了。但对于基本语法和描述结构还在脑子里。所以我打算来一个星火燎原,凭着这点仅剩的零星知识,编干编学,估计这样的学习效果更好呢。
毕竟这里不比在哈尔滨,纸质的资料有限,所以我又从网上下了些HDL的教程,就这样看一段C的函数,查一查资料,编一些代码。如此重复,几百行代码不到一天的时间已经转换了80%了。其实,大部分和底层电路的关系不是很紧密,转换的过程考虑得只是逻辑实现方式的转变。

TOP

返回列表