这篇**写的还不错,大家可以看看,希望对大家有帮助

[复制链接]
9550|28
 楼主| Fourier00 发表于 2009-3-21 10:11 | 显示全部楼层 |阅读模式
王钿《淡逻辑设计的学习》<br />王钿《淡逻辑设计的学习》<br />逻辑设计IC<br />学习逻辑设计首先要有项目挂靠,如果你觉得未来一段时间你都不可能有的话,接下来的内容你<br />就没有必要再看了,花的时间再多也只能学到皮毛--很多细节的问题光写代码是发现不到的。而<br />且要真正入门,最好要多做几个项目(这三年大大小小的项目我做有七八个),总线型的和数字<br />信号处理型的最好都要接触一些,因为这两个方向的逻辑设计差异比较大:前者主要是控制型的,<br />会涉及到状态机等控制逻辑;后者主要是计算型的,难点主要在对符号、浮点数转定点数、位宽<br />等方面的处理上。<br />第二要有好的师父。这里说的好的师父并不是指画原理图画了几十年的老师傅,而是指曾在<br />专业IC&nbsp;公司做过一段时间的人,好的专业IC&nbsp;公司可以接触国内外最新的设计思想,在他们的帮<br />助下,起点就可以比其他人高不少,更重要的是你可以学习逻辑设计思想性的东西!如果你的师<br />傅经常跟你说画原理图的好处,你还是重新找过师父算了--用原理图设计是一种很落后的方式,<br />即使他们可能会说可以系统级设计(专业的IC&nbsp;设计公司系统级设计绝对是由方案保证的,而不<br />会靠原理图这鬼东西)更为清淅。<br />第三要看一些好的资料。RTL&nbsp;级的书中《Verilog&nbsp;硬件描述语言》、EDA&nbsp;先锋写的那几本书<br />都还可以,还有不得不提的是cliff&nbsp;的一些paper(www.sunburst-design.com&nbsp;上有);验证方面入门<br />可以看下《Writting&nbsp;Testbenches》,&nbsp;提高可以看下snug(Synopsys&nbsp;的用户论坛,里面的**基<br />本上反映了业界的领先水平)的paper;系统级的可以看看《片上系统-可重用性设计方法学》。<br />第四要自己多总结,多动脑筋。逻辑设计的东西其实本质上的东西并不多:把RTL&nbsp;级的常用<br />的D&nbsp;触发器、计数器、移位寄存器、状态机、多路选择器等基本的电路标准化、固定化;先做<br />方案再写代码;设计时序;知道约束原理及怎么加约束;划分模块时知道怎么做到时序收敛;做<br />验证的时候熟悉相应语言的行为级描述(这个肯定比RTL&nbsp;级好学多了)然后就是理解testbench<br />的结构化设计。把这些东西的本质都搞清楚了做个合格的逻辑工程师应该是绰绰有余了,呵呵。<br />在接下来的部分我主要就第四点随便说点自己的经验,说的不好还请大家批评指正。<br />入门前<br />刚才开始接触逻辑设计很多人会觉得很简单:因为verilog&nbsp;的语法不多,半天就可以把书看完了。但是<br />很快许多人就发现这个想法是错误的,他们经常埋怨综合器怎么和自己的想法差别这么大:它竟然连用for<br />循环写的一个计数器都不认识!
 楼主| Fourier00 发表于 2009-3-21 10:19 | 显示全部楼层

第二部分

相信上一段的经历大部分人都曾有,原因是做逻辑设计的思维和做软件的很不相同,我们需要从电路<br />的角度去考虑问题。<br />在这个过程中首先要明白的是软件设计和逻辑设计的不同,并理解什么是硬件意识。<br />软件代码的执行是一个顺序的过程,编绎以后的机器码放在存储器里,等着CPU&nbsp;一条一条的取指并执<br />行;因此软件设计中经常会带有顺序处理的思维。而逻辑设计则不同,我们设计的是数字电路,它是由很<br />多很多的与非门及D&nbsp;触发器构成的,上电之后所有与非门和D&nbsp;触发器都同时工作,不会因为A&nbsp;触发器的代<br />码描述在B&nbsp;触发器之前A&nbsp;触发器就是先工作,事实上,RTL&nbsp;级代码的代码先后顺序在综合成网表文件后这<br />种顺序就消失了,取代的是基本逻辑电路之间的互联关系描述;因此逻辑设计需要的是一种并发的思维,<br />我们也需要用并发的思维去考虑电路的设计。<br />当然,我们设计的电路功能一般都有先后顺序的关系,如果这种顺序不能通过代码的先后顺序来实现,<br />那么要怎么完成这一功能呢?在逻辑设计中,我们所说的先后顺序都是基于时间轴来实现:它的承载体就<br />是时序逻辑,也就是那些触发器。<br />硬件意识的东西网上谈论的已经很多,这里就不再多说了。<br />其次就是要熟悉基本电路的设计。<br />基本的电路不是很多,也就是D&nbsp;触发器、计数器、移位寄存器、状态机、多路选择器、译码器等几种,<br />所有复杂的电路都可由这些基本的电路构成。高手水平高的体现并不是他能写出一些很奇特的电路,相反,<br />水平高是体现在他们总能将复杂的电路用这些很朴素的基本电路去描述。甚至,你会发现他们的代码基本<br />上是由if...else、case&nbsp;这些语句构成的,朴素的让你觉得奇怪。<br />我认为,初学者在入门的时候,对于基本电路的设计应该固定化、标准化,每种电路该用什么样的代<br />码描述,应该要固定、统一,尽量少一些花哨的东西。说来这里我举个例子。<br />以前有几个朋友因为仿真有问题请我帮忙找问题。他们的代码写的很乱,出现了很多种稀奇古怪的电<br />路,一看头都大了,只好建议他们按照标准的电路重新写下代码。结果过了半天,他们就和我说问题不见<br />了。<br />所以,高手们喜欢用简单的代码是有道理的,电路的标准化和规范化可以减少许多稀奇古怪的问题,<br />问题少了他们也就能在别人加班的时候回家多睡回觉,呵呵。总之,简单的、朴素的就是最好的。<br />最后是代码的规范化。
 楼主| Fourier00 发表于 2009-3-21 10:24 | 显示全部楼层

第三部分

代码规范主要是代码书写、命名等规范。比如不能用TAB&nbsp;键空格、低电平有效信号命名时加_n(如rst_<br />n&nbsp;等)、每行只能写一行代码等。这些东西网上也很多,这里只是强烈建议大家要严格遵守,像华为等公司<br />如果代码不规范的话肯定是要打回去重写的。<br />入门<br />结合一两个小项目把上面所说的事情都做好后,差不多就可以进入入门的阶段了(要求稍微严格了一<br />点点,呵呵)。<br />入门阶段要学的有:设计时序;理解约束的原理及如何加约束。<br />先谈谈设计时序。<br />设计时序是进行逻辑设计的基本要求:时序是设计出来的,不是仿出来的,更不是凑出来的。<br />很多人在做逻辑设计时喜欢一上来就狂写代码,写到一半后发现信号间的时序出问题了,只好推倒重<br />来;好不容易反复了几次之后,通过仿真软件看了下,差不多要对了,于是再凑一下时序,竟然对了!但<br />这个做法除了设计周期长外,代码的质量也难以保证,往往存在很多冗余的逻辑,甚至有一些隐藏着较深<br />的bug。<br />为什么会出现上面的问题呢?因为我们设计的是数字逻辑,而信号之间的逻辑关系往往是比较复杂的,<br />在内部信号很多的情况下,仅凭拍下脑袋就写代码肯定是不能理清楚它们之前的复杂的关系,所以出错在<br />所难免。<br />正确的做法是我们要先对整个设计有一些规划--时时刻刻都要有设计时序的思想。设计时序最重要的是<br />做好方案,这里说的方案绝不是只是摆几个框图在那里。我们在做设计的时候需要做总体设计方案、逻辑<br />详细设计方案。这两种方案包括了很多东西,逻辑总体方案主要是一级模块的划分及接口时序的定义,而<br />逻辑详细方案就是代码的文字及图形描述!<br />对于入门者来说,接触的比较多的是逻辑详细设计方案。在这一级别的方案中,我们是要求的是至少<br />要做到模块内部所有关键信号的时序都要先设计好,这里讲的设计时序主要就是画波形图,在一个操作周<br />期内每个信号在每一个时钟周期该是什么样子就画成什么样子。附图(时序图)是我曾设计的一个模块的<br />主要信号时序:aes_cnt&nbsp;信号控制着w_fifo_rden、aes_ready&nbsp;等信号,是该模块的关键信号,通过将它们<br />之间的时序关系通过时序图反应出来,写代码时就可以做到胸有成竹,减少出现逻辑混乱的情况。<br />听起来似乎很简单,但是执行起来却不容易,因为画波形图是一件很烦锁的事(有一次一个模块因为操<br />作比较多我画了8&nbsp;张时序图)。但是请相信我,如果不这样做,因为时序关系没有处理好引起设计多次迭代
 楼主| Fourier00 发表于 2009-3-21 10:26 | 显示全部楼层

第四部分

所花的时间远多于画波形图的时间。<br />时序设计好之后,模块内部各个信号之间的关系就理得差不多了,之后就是将它翻译成代码了,这个<br />过程以体力劳动为主,我就不多说了。<br />补充一下,画波形图推荐用TimingDesigner&nbsp;这个软件,如果有更好的,请告诉我,我也不喜欢Timing<br />Designer&nbsp;。<br />另一个就是约束。<br />这里的约束是针对综合软件和布局布线软件而言的。<br />为什么会有约束这个东西出现呢?主要原因是EDA&nbsp;软件比较笨,难以明白我们的心思,如果我们不把<br />更详细的信息告诉它的话它就干不好活,比如需要将输出寄存器放的与输出管脚近一点,如果不加约束,E<br />DA&nbsp;软件可能布通之后就不管了,导致Tco&nbsp;狂大,一点也不善解人意。所以我们需要约束这个东西,告诉E<br />DA&nbsp;软件要怎么干活,工程验收的标准又是什么。<br />在加约束之前,我们首先要定义一些术语好告诉EDA&nbsp;软件我们想干什么,这些术语便是Fmax、Tsu、T<br />co&nbsp;等等这些东西。这些东西的含义这里就不多说了,网上的讨论已经很多了。<br />有了术语,还要有一种通信方式与EDA&nbsp;软件通信,脚本语言充当了这一角色。不过现在像quartus&nbsp;这<br />类软件做的比较智能化了,提供了图形化界面,但是这背后支撑的还是些脚本语言,大家可以用UltraEdit<br />打加*.qsf&nbsp;文件去看看我们加的约束用脚本语言是怎么写的。<br />在加了约束之后,EDA&nbsp;工具就可以更好地按照我们的意愿去干活了,比较我们加了Fmax&nbsp;的约束,它<br />就会尽可能地将关键路径放的靠近一些,以提高电路工作频率。当然,这是有代价的,寻找路径是需要时<br />间的,要求越苛刻,时间花的越多,因此加约束的原则的适用就行。如果约束加的过高,就相当于让EDA<br />工具去做一件不可能完成的事,找更短的路径的时候说不定找着找着就掉下悬崖了,效果反而更差。<br />虽然有约束这个好东西,不过提醒一下,在项目之前千万对它抱有太多的幻想,把希望寄托在别人的<br />身上并不是每一次都很可靠的,出了问题还是要麻烦自己,加约束只能做一些锦上添花的事情。所以,我<br />们在做方案的时候就需要对关键路径进行预估,要通过设计而不是约束解决这些问题。
 楼主| Fourier00 发表于 2009-3-21 10:34 | 显示全部楼层

这篇**写的还不错,大家可以看看,希望对大家有帮助

这篇文章写的还不错,大家可以看看,希望对大家有帮助
 楼主| Fourier00 发表于 2009-3-21 21:41 | 显示全部楼层

ms 没有人感兴趣啊

ms&nbsp;没有人感兴趣啊
llh_kf1100 发表于 2009-3-22 21:32 | 显示全部楼层

学习了

路过。。。学习了<br />谢谢楼主
ilymy 发表于 2009-3-22 21:32 | 显示全部楼层

我来顶

虽然他第一句就让我不要往下看了
钻研的鱼 发表于 2009-3-23 08:38 | 显示全部楼层

他写了一本书&nbsp;《基于verilog&nbsp;hdl的数字系统应用设计》,水平还不错,如果能针对某种器件详细介绍时序约束,那就更上一层楼
wujing198 发表于 2009-3-23 21:29 | 显示全部楼层

写得很好!

很多人在学逻辑设计的时候思维方式就不正确,所以越努力越学不好。<br />这篇**把这些观念讲的很清楚。
jszhouchao 发表于 2009-3-24 08:44 | 显示全部楼层

写的很好

最近有一CPLD板子,正学习
chflove 发表于 2009-3-26 22:12 | 显示全部楼层

】、

  
liutk 发表于 2009-3-30 12:00 | 显示全部楼层

好东西

谢谢了
lingkzc 发表于 2009-4-2 02:03 | 显示全部楼层

经典总结

确实是这样,深有同感!
cruiserwu 发表于 2009-4-14 16:30 | 显示全部楼层

谢谢

研究一哈
li_mu 发表于 2009-4-23 14:51 | 显示全部楼层

说的一点也不错啊

看来还是有设计经验的啊,比他原来的书写的好多了
0205feiyu 发表于 2009-8-25 20:46 | 显示全部楼层
楼主,我看了这篇**深有体会,我是一个FPGA的初学者,写代码是完全把它当软件来玩的,现在想想应该去结合综合后的具体电路的思路来思考,可是怎么来让两者联系起来呢,具体的学习过程怎么去操作啊??谢谢你
zf365882541 发表于 2009-11-12 21:15 | 显示全部楼层
觉得写得还好,很有体会!
zhaolqjn 发表于 2009-11-15 16:52 | 显示全部楼层
很好很受用,原来看不懂,现在有了切身体会了
zhuhukun 发表于 2009-11-22 16:46 | 显示全部楼层
写得真不错,看了之后很有感触呀!
在此谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

516

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部