2008年12月16日星期二

【转帖】我的FPGA学习历程

原文出处:http://blog.ednchina.com/chactor/181287/message.aspx
FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。
  废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段:

①、Verilog语言的学习,熟悉Verilog语言的各种语法。
②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c等)的设计,时序分析,硬件优化等,自己开始设计简单的FPGA板子。
③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII的基本结构,设计NiosII开发板,编写NiosII C语言程序,调试板子各模块功能。

先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,在本科时老师一般教VHDL,不过现在

Verilog用的人越来越多,其更容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。像systemC,systemVerilog之类的应该还在萌芽阶段,以后可能会有较大发展。鉴于以上原因我选择了Verilog作为我学习的硬件描述语言。
其实有C语言的基础,学起Verilog的语言很简单,关键要有并行的概念,所有的module,assign,always都是并行的,这一点与软件语言有明显不同。这里推荐几本评价比较好的学习Verilog的书籍:
①、《verilog 数字系统设计教程》,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面的编程没有多少涉及到。
②、《设计与验证Verilog HDL》,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。
学习Verilog其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。

Verilog语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。
刚开始我拿了实验室一块CPLD的开发板做练习,熟悉QuartusII的各种功能,比如IP的调用,各种约束设置,时序分析,Logiclock设计方法等,不过做到后面发现CPLD的资源不太够(没有内嵌的RAM、不能用SignalTapII,LE太少等),而实验室没有FPGA开发板,所以就萌生了自己做FPGA开发板的意图,刚好Cadence我也学的差不多了,就花了几天时间主要研究了FPGA配置电路的设计,在板子上做了Jtag和AS下载口,在做了几个用户按键和LED,其他的口全部引出作为IO口,电路比较简单,板子焊好后一调就通了(心里那个爽啊...)。我选的FPGA是cycloneII系列的EP2C5,资源比以前的FPGA多了好几倍,还有PLL,内嵌的RAM,可以试试SignalTapII,用内嵌的逻辑分析仪测试引脚波形,对于FPGA的调试,逻辑分析仪是至关重要的。利用这块板子我完成了项目中的几个主要功能:RS232通信,指令译码,配置DDS,AD数据高速缓存,电子开关状态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好:
①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),对于入门非常好。
②、《Altera FPGA/CPLD 设计(高级篇)》:讲解了一些高级工具的应用,LogicLock,时序约束很分析,设计优化,也讲述了一些硬件编程的思想,作为提高用。
③、《FPGA设计指南--器件,工具和流程》:这本书看了他的目录忍不住就买了,这本书讲述了FPGA设计的各个方面,虽然每个方面都是点到为止,但能让你有个整体的概念,了解FPGA的所有设计功能,了解FPGA开发的整个流程。
④、在这里也推荐几个学习FPGA比较好的论坛
http://www.edacn.net/bbs
http://www.eetop.cn/
⑤、其实最好的学习网站莫过于Altera的官方网站www.altera.com,不过很多人一看到英语就不想看,其实上面的英文很简单,很多时候不敢看是因为对自己没信心或心静不下来看。不过官方网站上资料很多,刚开始可能会觉得资料安排的有点乱,不方便查找,以后有时间我列个资料的链接目录,整理一下,方便大家查找。

到这里,自己最FPGA的学习有一段时间了,练习了很多实例,自己也编写了不少程序,也有了一些项目经验,算是对FPGA有些了解了。在不断的学习中发现FPGA不仅可以做逻辑设计,算法设计等,还能做嵌入式开发,altera先后开发了Nios,NiosII两款FPGA的嵌入式软核,并有配套的软件,刚开始看到这些我真是心中突然豁然开朗,学习真的是无止境,又一个全新的领域摆在我面前,我决定学习NiosII,要学就要学最好。
刚开始入门是很痛苦的,嵌入式设计需要从硬件到驱动到软件全部熟悉,硬件系统问题还不是很大(以前做过单片机,DSP等MCU),处理器的架构心里还有点数,对于驱动和软件工程,刚开始学习真的很头痛。NiosII应该还算比较新的内容(应该是2004年出的),国内的书籍不算很多,网上这方面的资料也比较零碎,所以我就开始将Altera网站上这方面的资料系统的看一边,这里推荐几本网站上的handbook:
①、Embedded Design Handbook
②、Nios II Processor Reference Handbook
③、Nios II Software Developer's Handbook
④、Quartus II Handbook, Volume 4: SOPC Builder
⑤、Quartus II Handbook, Volume 5: Embedded Peripherals
看完这些handbook,总算基本明白整个架构,软硬件设计方法,驱动的编写等,感觉自己可以编一些嵌入式的程序了,不过虽然前面做的那块ep2c5的板子支持NiosII系统,不过对于嵌入式设计来说还是显得单薄了一点,没有SDRAM,Flash这两个比较基本的模块,Ep2C5内嵌的RAM太小,程序写不大,而且每次总要绞尽脑汁优化程序代码大小,很多时候优化了后函数功能会受到限制,不利于初学者,也不利于调试。所以到这里我有产生了自己做一块Nios开发板的想法(直接买比较贵,自己做便宜,而且还能锻炼自己,一举两得),通过借鉴其他开发板,选择自己开发板上需要包含什么模块,确定各个模块使用什么芯片,阅读各个芯片的datasheet,画出原理图并做出PCB图,这块板子我选的是Ep2c8Q208,比上一块资源又将近多了一倍,板子上还有以下模块:SDRAM,Flash,EPCS4,RS232,USB,VGA,PS2,AD,DA,LCD等,满足了一般开发板的配置要求。板子回来以后调试了四五天,(flash工作了,LCD显示了,RS232通了,USB通了,AD,DA工作了,SDRAM正常了...),真是每天都有惊喜,每个模块都编写了NiosII软件测试程序,调试硬件的时候对软件的运行也更熟悉了。在这次调试的过程中真的学到了很多,为此专门写了好几页调试笔记,下次拿出来和大家一起分享。现在硬件平台有了,NiosII也了解的差不多了,终于可以自己编写一些规模大一点的程序了。
以后的路还很长,不过也有很多惊喜在等着我们......

2008年12月15日星期一

TI DSP/BIOS线程比较













硬件中断


软件中断


任务


触发


外部异步事件


SWI函数


TSK模块,动态调度抢占


优先级


最高


高


次高


主要特征


200Khz左右,应对硬件信号进行响应,时间要求苛刻,步骤简单,处理快速,非阻塞程序


100ms以上事件,除非被更高级别中断抢占,会一直执行至完毕


拥有多任务间通信和同步手段,一个任务可以挂起等待某一资源的有效


堆栈使用


使用系统栈


使用系统栈


每个任务具有自己大运行时栈,用于保存局部变量和调用嵌套函数


优点


响应快,应对关键任务


时间要求不苛刻,减少了中断禁止时间,中断函数相对独立


时间要求不苛刻,减少了中断禁止时间,中断函数要求复杂,更有效利用共享数据


其他注解


CLK函数,每个定时器中断末尾执行


PRD函数,定时器中断或其他事件多次计数后执行


拥有队列,信号灯,邮箱等机制用于任务间同步和通信

TI的DSP的动态加载

动态加载是TI CCS提高运行速度的比较有用的工具, 特别是在具有多个互斥功能实现(不同时运行)的时候, 以及从rom/flash中加载应用,以及启动的时候.
动态加载说到底就是预先进行了重新位, 里面所有的跳转和调用语句都是按照运行位置进行编译的, 而不是按照load位置. 这样, 我们可以将程序放在任何地方,甚至硬盘里面, 到时候需要的时候, 只要加载到固定的位置即可.因此, 可以建立一种类似于传统的OS. 只是有很多限制.
这一点和传统的操作系统有不同的地方就是: 传统的操作系统加载的文件一般都有重定位表, 在加载的时候,需要将这个重定位表中每一项所对应的位置地方的偏移量(一般都是绝对偏移)等按照当前实际位置进行修改;对于具有export 函数功能的文件, 可能需要建立一个表格, 甚至修改系统的函数入口地址映射表, 这样别的文件才能找到当前加载的函数.


动态加载有三种方法: 在CCS2.2之后,一般采用cmd文件中定义union和group的方法来建立各个动态加载项的run位置和load位置,以及各自大小. 这种方式需要我们采用DMA的方式进行手动将需要的程序段加载到运行区域. 而在ccs3.0里面,提出了一种更简洁的建立这个run和load位置的方法, 并且提供相应的传输函数. 这些都很类似.
有一点值得指出: 在函数中使用的时候, 必须定义成指针的形式, 否则将找不到定义的符号.

DM642的中断处理

1.非NMI中断的发生的前提:GIE=1,NMIE=1,IER中对应的标记位,还有就是DEVICE中的使能位
2.当非NMI中断的发生的时候,自动清楚GIE,保存到PGIE中,退出采用B IRP,会自动恢复GIE
3.中断的能够发生位置:Single Assignment vs. Multiple Assignment:只有在single assignment才能发生中断

另外:TI DSP的printf问题
1. printf可能会打破互斥的功能,导致互斥失败。

DSP中的EDMA

EDMA可以在没有DSP参与得情况下对数据进行搬移操作,这样可以让cpu专心做数据计算

1、EDMA得请求源
三个,EDMA Channel 64个通道,对应64个同步事件;
HPI,PCI,EMAC master port;
L2 Cache controller/QDMA;

2、EDMA 得请求过程
TR---->TC---->地址产生器;

3、优先级
在DM642中,EDMA可以设置4种优先级,在EDMA传输控制器里面有四个优先级队列对应着这4个优先级,Q0~Q3,优先级依次递减,队列最长放16个申请,每个申请源对应得长度可以配置.但是任何一个队列的满,将会导致整个EDMA的提交处于STALL状态。从EDMA的队列来看,任何时候,总是优先服务高优先级的队列中请求,但是另外一方面,每一个队列中的传输请求(TR)总是串行服务的,因此,如果想两个EDMA交错进行,必须保证它们位于不同的队列之中,或者采用ATCC来进行触发。
有HPI的EDMA传输请求(burst最长为8个WORD),有L2和QDMA的请求(QDMA是通过L1D的write buffer 提交的,因此,不小心控制,可能会导致整个CPU 处于STALL状态),还有就是EDMA控制器提交的:在复杂系统中,例如有AUDIO,VIDEO,HPI,video decoder,以及QDMA,因此,从理论上看,最好的设置是L2的提交为urgent,而audio 设置为high,HPI设置为medium(缺省),video decoder/QDMA设置为low,那么视频必须设置为high或者urgent ,否则视频显示将出现莫明的小块,甚至横条。这种原因有多方面:例如将代码放在片外,HPI的请求导致的EDMA传输请求。如果将VIDEO设置低于HIGH,将导致video得不到service,而出现underflow的问题。
4、挂起
当任何一个EDMA申请源得搬移请求对应得队列满得时候该申请源的所有请求都被挂起,直到那个导致挂起的请求进入队列;

5、系统的EDMA优先级分配
四个队列是并行工作的,所以要合理分配优先级提高吞吐率----优先级的合理分配;
尽量将大数据量的搬移分配为低优先级,数据量少而实时要求高的放高优先级;
将大数据量的搬移拆分成几个小数据量的搬移;

6、EDMA的使用
打开--配置--事件触发

2008年12月14日星期日

为前途抵押

洛克菲勒给儿子的三十八封信之第六封:为前途抵押

格言:借钱是为了创造好运。

  不论是要赢得财富,还是要赢得人生,优秀的人在竞技中想的不是输了我会怎样,而是要成为胜利者我应该做什么。

(We are continually faced by greater opportunities brilliantly disguised as insoluble problems)

April 18,1899

亲爱的约翰:

  我能够理解,为什么你用借我的钱去股市闯荡总让你感觉有些不安。因为你想赢,却又怕在那个冒险的世界里输,而输掉的钱不是你的,是借来的,还得支付利息。

  这种输不起的感受,在我创业之初,乃至较有成就之后,似乎一直都在统治着我,以致每次借款前,我都会在谨慎与冒险之间徘徊,苦苦挣扎,甚至夜不能眠,躺在床上就开始算计如何偿还欠款。

  常有人说,冒险的人经常失败。但白痴又何尝不是如此?在我恐惧失败过后,我总能打起精神,决定去再次借钱。事实上,为了进步我没有其他道路可寻,我不得不去银行贷款。

  儿子,呈现在我们眼前的,经常是巧妙化解棘手问题的大好良机。借钱不是件坏事,它不会让你破产,只要你不把它看成像救生圈一样,只在危机的时候使用,而把它看成是一种有力的工具,你就可以用它来开创机会。否则,你就会掉入恐惧失败的泥潭,让恐惧束缚住你本可大展鸿图的双臂,而终无大成。

  我所熟知或认识的富翁中间,只靠自己一点一滴、日积月累挣钱发达的人少之又少,更多的人是因借钱而发财,这其中的道理并不深奥,一块钱的买卖远远比不上一百块钱的买卖赚得多。

  不论是要赢得财富,还是要赢得人生,优秀的人在竞技中想的不是输了我会怎样,而是要成为胜利者我应该做什么。

  借钱是为了创造好运。如果抵押一块土地就能借得足够的现金,让我独占一块更大的地方,那么我会毫不迟疑地抓住这个机会。在科利佛兰时,我为扩张实力、夺得科利佛兰炼油界头把交椅地位,我曾多次欠下巨债,甚至不惜把我的企业抵押给银行,结果是我成功了,我创造了令人震惊的成就。

  儿子,人生就是不断抵押的过程,为前途我们抵押青春,为幸福我们抵押生命。因为如果你不敢逼近底线,你就输了。为成功我们抵押冒险不值得吗?

  谈到抵押,我想告诉你,在我从银行家手里接过巨款时,我抵押出去的不光是我的企业,还有我的诚实。我视合同、契约为神圣的东西,我严格遵守合同,从不拖欠债务。我对投资人、银行家、客户,包括竞争对手,从不忘以诚相待,在同他们讨论问题时我都坚持讲真话,从不捏造或含糊其辞,我坚信谎言在阳光下就会显形。

  付出诚实的回报是巨大的,在我没有走出科利佛兰前,那些了解我品行的银行家们,曾一次次把我从难以摆脱的危机中拯救出来。

  我清楚地记得,有一天,我的一个炼油厂突然失火,损失惨重。由于保险公司迟迟不能赔付保险金,而我又急需一笔钱重建瓦砾中的企业,我只得向银行追加贷款。现在一想起那天银行贷款的情景就让我激动不已。本来在那些缺乏远见的银行家眼里,炼油业早已是高风险行业,向这个行业提供资金不亚于是在赌博,再加上我的炼油厂刚刚被毁于一炬,所以有些银行董事对我追加贷款犹豫不决,不肯立即放贷。

  就在这时,你们中的一个善良的人,斯蒂尔曼先生,让一名职员提来他自己的保险箱,向着其他几位董事大手一挥说:"听我说,先生们,洛克菲勒先生和他的合伙人都是非常优秀的年轻人。如果他们想借更多的钱,我恳请诸位要毫不犹豫地借给他们。如果你希望更保险一些,这是就有,想拿多少就拿多少。"我用诚实征服了银行家。

  儿子,诚实是一种方法,一种策略。因为我支付诚实,所以我赢得了银行家乃至更多人的信任,也因为它度过一道道难关,踏上了快速的成功之路。

  今天,我无须再求助于任何一家银行,我就是我自己的银行,但我永远都在感激那些曾鼎力帮助过我的银行家们。

  你的未来可能是管理企业,你需要知道,经营企业的目的是要赚钱。扩大企业能够赚钱,但是把企业拿出去抵押也是管理和运用金钱的重要事项。如果你只注重一种功能,而忽视另一种功能,就会招致失败;在最糟糕的情形下,可能会造成财务崩溃,在较好的情形下,也许会错失很多机会。

  管理和运用金钱跟决心赚钱不同,需要有不同的信念。要管理和运用金钱,你必须乐于亲自动手、亲自管理数字,不能只是空谈管理和策略。上帝表现在细节之中。如果你忽视发这些细节,或是超脱细节,把这种"杂事"授权给别人去做,就等于至少忽视了你事业经营的一半重要责任。细节永远不应该妨碍热情,成功的做法是你要记住两点:一个是战术,另一个是战略。

  儿子,你正朝着赢得一场伟大人生的位置前进,这是你一直以来的目标,你需要勇敢,再勇敢。


爱你的父亲

只要不变成习惯,失败是件好事

洛克菲勒给儿子的三十八封信之第七封:最可怕的是精神破产

格言:只要不变成习惯,失败是件好事。

  你利用了机会,就是在剥夺别人的机会,保证自己。

  一旦避免失败变成你做事的动机,你就走上了怠惰无力的路。

(An optimist sees an opportunity in every calamity, a pessimist sees a calamity in every opportunity.)

November 19, 1899

亲爱的约翰:

  你近来的情绪过于低落了,这很是让我难过。我能真切地感受到,你还在为那笔让你赔进一百万的投资感到耻辱和羞愧。以至终日闷闷不乐、忧心忡忡。其实,这大可不必,一次失败并不能说明什么,更不会在你的脑门上贴上无能者的标签。

  快乐起来,我的儿子。你需要知道,这个世界上的每个人都没有顺遂的人生;相反,却要时刻与失败比邻而居。也许正因为这个世界上有太多太多无奈的失败,追求卓越才变得魅力十足,让人竞相追逐,甚至不惜以生命为代价。即便如此,失败还是要来。

  我们的命运也依然如是。只是与有些人不同,我把失败当作一杯烈酒,咽下去的上苦涩,吐出来的却是精神。

  在我信誓旦旦跨入商界,跪下来恳祈上帝保佑我们新开办的公司之时,一场灾难性的风暴便袭击了我们。当时我们签订了一笔合同,要购进一大批豆子,准备大赚一把,但没有想到一场突然"来访"的霜冻击碎了我们的美梦,到手的豆子毁了一半,而且有失德行的供货商还在里面掺加了沙土和细小的豆叶、豆秸。这注定是一笔要做砸了的生意。但我知道,我不能沮丧,更不能沉浸在失败之中,否则,我就会离我的目标、梦想越来越远。

  天下没有白吃的午餐,更不可能维持现状,如果静止不动,就是退步,但要前进,必须乐于做决定和冒险。那笔生意失败之后,我再次向我的父亲借债,尽管不很不情愿这么做。而且,为使自己在经营上胜人一筹,我告诉我的合伙人克拉克先生,我们必须宣传自己,通过报纸广告让我们的潜在客户知道,我们能够提供大笔的预付款,并能提前供应大量的农产品。

  结果,胆识加勤奋拯救了我们,那一年我们非但没有受"豆子事件"的影响,反而让我们赚到了一笔可观的纯利。

  人人都厌恶失败,然而,一旦避免失败变成你做事的动机,你就走上了怠惰无力之路。这非常可怕,甚至是种灾难。因为这预示着人可能要丧失原本可能有的机会。

  儿子,机会是稀少的东西,人们因机会而发迹、富有,看看那些穷人你就知道,他们不是无能的蠢材,他们也不是不努力,他们是苦于没有机会。你需要知道,我们生活在弱肉强食的丛林之中,在这里你不是吃人就是补被别人吃掉,逃避风险几乎就是保证破产;而你利用了机会,就是在剥夺别人的机会,保证着自己。

  害怕失败就不敢冒险,不敢冒险就会错失眼前的机会。所以,我的儿子,为了避免丧失机会、保住竞争的资格,我们支付失败与挫折是值得的!

  失败是走上更高地位的开始。我可以说,我能有今天的成就,是踩着失败的螺旋阶梯升上来的,是在失败中崛起的。我是一个聪明的"失败者",我知道向失败学习,从失败的经验中汲取成功的因子,用自己不曾想到的手段,去开创新事业。所以我想说,只要不变成习惯,失败是件好事。

  我的座右铭是:人始终要保持活力、永远坚强、坚毅,不论遭遇怎样的失败与挫折,这是我惟一能做的事情。我自己能够理解,我做什么才会让自己感到快乐,什么东西值得自己为之效命。根本的期望,就像清洁工手中的扫把,将扫尽你成功之路上的所有垃圾。儿子,你自己根本的期望在哪里?只要你不丢掉它,成功必将到来。

  乐观的人在苦难中会看到机会,悲观的人在机会中会看到苦难。儿子,记住我深信不已的成功公式:梦想+失败+挑战=成功之道。

  当然,失败有它的杀伤力,它可以让人萎靡、颓废,丧失斗志和意志力。重要的是你将失败看作什么。天才发明家托马斯・爱迪生先生,在用电灯照亮摩根先生的办公室前,共做了一万多次实验,在他那里,失败是成功的试验田。

  十年前,《纽约太阳报》一位年轻记者采访了他,那位少经世事的年轻人问他:"爱迪生先生,您目前的发明曾经失败过一万次,您对些有什么看法?"爱迪生对失败一词很不受用,他以长者口吻跟那位记者说:"年轻人,你的人生旅程才刚刚开始,所以我告诉你一个对你未来很有帮助的启示,我没有失败过一万次,我只是发明了一万种行不通的方法。"精神的力量永远如此巨大。

  儿子,你要宣布精神破产,你就会输掉一切。你需要知道,人的事业就如同浪潮,如果你踩到浪头,功名随之而来;而一旦错失,则终其一生都将受困于浅滩与悲哀。失败是一种学习经历,你可让它变成墓碑,也可以让它变成踏脚石。

  没有挑战就没有成功,不要因为一次失败就停下脚步,战胜自己,你就是最大的胜者!

  我对你很有信心。

  爱你的父亲