研究生期间作项目所学到的一些经验

 

    本文主要分享研究生期间所学到的一些科研和项目经验,实践部分偏重于硬件电路。点滴琐碎,还请见谅。前端

 

一  项目所得

 1.1 心得体会

  • 任何事物都要从最简单、最基本的构架入手,理解复杂的。——接触学习新东西时的指导思路。
  • 作理论要作作想一想,边停边走;作工程则要不断推动,由于不作不出来。工程就是靠时间堆出来的,不在于谁比谁聪明多少,而在于谁比谁用功了多少。
  • 作工程思路:不要挑刺钻牛角尖,能用就行。要实用主义而不是理想主义,忌追求完美(好比正确解调须要信噪比至少10dB,则前端的同步就无须追求在5dB下性能最佳)!该细则细,该粗则粗。不要死抠理论,太专一细节每每看不到总体(又如同步性能设计再好,解调不出正确数据也是白搭,还不如多分配些时间精力给解调模块)。
  • 不是作大项目就能学到东西的。偏偏相反,由于难以吃透大项目,因此只能按照别人的现有思路走,致使思惟固化。而作小东西更具灵活性,能够充分发挥本身的想象力,寻求多种解决途径。外面作了几年大项目的人拿到新项目时,仍会感到无从下手;而老师接到新项目后,能马上在脑海里构建出各个功能模块(“庖丁解牛”),缘由即在此。
  • 不要着急,一步一步来,别期望一口吃成胖子。不少时候工程作到必定程度了才能发现问题。你要作的就是经过项目学到能力,不必尽善尽美,说实话项目自己对你从此的工做帮助不大。
  • 本身的核心设计每每只占工程的很小一部分,大部分工做在于工程的集成。
  • 把项目当成学习的好机会,而不是负担,才能有激情。
  • 保留本身的想法,接受并尝试老师的想法而不是固守本身的方案——记住你是在“学习”,不是在“打工”!多向老师学习系统观和作事方法。老师的工程经验很丰富,总体化的系统思惟值得认真学习借鉴。不要怕和老师讨论。伸手向老师要,老师才会给你。
  • 请教老师前先说说本身的尝试方案,由于老师有经验一看便知如何入手;请教师兄们时则保留本身的方案,由于容易限制师兄们的思路。
  • 不讨论、不提问、不向老师同窗请教学习,即便作出东西又有何用?你只是发挥了本身的水平而已,能力并未获得提升!按本身的思惟而不是借鉴别人的好想法作工程,只是交差,能力得不到提升!
  • 工做后技术能够是二流的,但作人应该是一流的。
  • 工程有忙有闲。忙的时候能忙得上,闲的时候能闲下来。一味地忙或闲都很差。
  • 不要屡教不改,总犯一样的问题!
  • 不要太专一所作东西自己,而更要体会作事的过程。 

1.2 设计实践

  • 数电思路 + 参考相关芯片设计
  • 不要想着先作出来再说——应该先讨论肯定方案。随时向老师汇报,排除系统原理结构上的设计失误!策略性问题及时与老师讨论,公式推导、器件操做等可本身验证的则自行搞定。
  • 必须跳出本身的思惟约束,把握总体构架,肯定总体思路后再着手实现。最好先画出波形图,至少要有关键信号的时序关系。着手写程序时能够先写出大致框架,而后完成和完善子模块。
  • 设计时问一问本身:是否从工程的思惟入手?体会老师设计的控制模块的优势(先定总体时序,便于调试)。
  • 对照Matlab理论波形与示波器实际波形。不要知足于软件仿真“正确”,要放到实践中测试!相似地,电源等电器件不要直接拿来用,要实测一下电压值。
  • 设计要具备必定的通用性和灵活性,如便于扩充或调试。

         模块通用性:基本思想是作通用可扩展、特定功能的小“模块”,而不要在后续阶段为加入功能而添加代码。算法

         模块就是你给我输入,我给你想要的输出,仅此而已,尽量不要让我进行控制。网络

         模块化,减小耦合度,便于移植和调试。尽可能模块化,可避免大的改动。框架

  • 在阅读别人的程序时,遇到不肯定有无的地方,不要冒然删减,应深刻思考其存在的理由,深刻画图分析(也利于别人理解和答辩申明)。
  • 在不了解系统全局的状况下,先摸索后看手册(前提是避免危险的操做)。在摸索尝试中理解,切莫一开始就拿起手册从头看。先尝试各类可能来解决问题,不要轻易下结论!作完后再回过来理解,不要“轻信”资料。好比调时AD开发板时,与其研究透彻每一个寄存器怎么设置后再着手调,不如边调边试。一样地,对于别人的东西既要吸取,又要质疑。不要由于那是别人作好的就认为OK了,实际上可能有很严重的设计缺陷。
  • 利用别人的力量作出来才是水平。当你看到别人的东西并很快领悟为本身的东西才是水平。先模仿后发展。多向别人请教想法!尽可能不要问具体问题,问思路才最重要。
  • “反驳激将法”获取别人的想法,集思广益。多征求想法,记在纸上。即便如今想法不成熟,之后也可能有用。外行也能提出新想法新思路。由于咱们的设计都是面向实际生活的,外行可能更清楚实际须要怎么作——当局者迷,旁观者清。好比我在用4点采样作同步,而数据倒是8点采样,还煞有介事地试图找到精确的同步位置。假如说给搞图像处理的人听,人家的第一反应就是“这不可能”,由于同步“分辨率”不够。后来才在老师的启发下改用两个同步模块解决了问题。
  • 思路灵活。作时定式,想时无定式。不要一根筋走到底,要考虑变通的方法。好比同步相关模块以前用定制的元件altshift_tags,tap distance>=3,不得不进行时钟三分频。原先的想法是用时钟来换取LE的减小(假设定制元件比本身编写的节省资源——其实未必,考虑“通用性”),后来发现时钟远比LE重要。因此本身编写了移存器模块,能够实现清零复位,tap distance等效为1,免去了时钟三分频。

        【注】本身编写的三分频模块在Modelsim里会仿真出什么结果呢?好比clk_sn由75M时钟clk_sf三分频产生,那么仿真出来的clk_sn为42ns的时钟,而不是40ns(25M)——由于你所加的75M时钟仿真激励不可能很精确(13.333...ns)! 异步

1.3 论文

  • 每节开门见山,不要啰嗦。每章前面有摘要,后面有小结,承上启下,既有条理又凑够字数。
  • 仿真要多,尽可能多参数,反复仿多个,得出结论!仿真分析等尽可能用一、二、3....条理化。
  • 图表要多,摘要绪论及结束语必定要写好,评审老师哪有工夫看理论。
  • 论文侧重理论。理论上下功夫的论文容易经过(“新名词”多)。许多评委都是理论出身,容易接受理论文章,故起评分高。偏工程类的论文除工程实现还必需要作理论部分,不然答辩时评委要问你除了“实现”还有什么创新点呢?你的工做量(工程)人家不必定承认啊。
  • 将数据导出来在Matlab中观察(如画图)每每能发现新问题甚至新思路。

         - 把FPGA仿真结果数据导入Matlab中,画出Matlab理论曲线与FPGA仿真曲线比较(大数据量)编辑器

         - 提出一种想法后务必画出理论比较曲线(有比较才有说服力),过多的解释说明倒不如图表直观。模块化

         - 设计验证机制工具

  • 不要写得太细,给评委提问的余地(大的方面让评委以为你水平挺高,思路清晰,有创新性;从细处一想又有不清楚处)——不然评委可能会问预料以外的问题! 

1.4 其余

     勤写报告:1. 保持进度; 2. 用于提问讨论; 3.论文素材。布局

     三种报告:post

     1) 给老师的报告:综合、轮廓、总体思路——图表化

     2) 给本身的报告:设计算法、心得经验、调试细节

     3) 给接收人的报告:系统、思路、如何实现及该作哪些工做,便于迅速上手。

     之后发挥本身的能动性,天天向老师汇报进度——不是作了多少(太“虚”),而是具体完成了什么!

     计划、讨论、汇报,讲给老师听。

     有问题必定写文档问老师,不要想着口头说——这其实减小了仔细思考的过程。

 

二  测试调试

2.1 调试信念

     不合理的现象背后,必定有合理的缘由。只有抱定这一信念,才能解决调试中遇到的各类问题。与此相反的是:遇到不合理的现象,不是去寻求合理的解释,而是猜测有一些不可控、不可证实的缘由。好比猜测综合工具备bug,电路的信号完整性有问题,芯片过热等。这样一想,问题每每不了了之,调试也就半途而废了。

     遇到问题首先思考什么状况下会产生此类问题,寻求可能缘由,而不是怀疑软/硬件工具备问题。 

2.2 调试原则

  • “遇到拦路虎必定要把它解决掉,不然往后碰到它你会更发怵”。不要回避问题,躲得过初一躲不过十五,早晚是要面对的——与其推倒重来,不如在初期就多加讨论解决!
  • 从最简单的开始调试,先肯定哪些模块正确,哪些有问题,而不是整个工程拿来跑,指望某次会“碰巧”正确(寻找问题所在,而不是回避问题)。
  • 按规程走,不要寄托于修改“好”的工程以求毕其功于一役。
  • 看起来最简单最不会出错的地方才最容易出错,反而复杂程序却不多出致命问题!
  • 最基本的“常识”——不工做时各个寄存器(尤为是使能信号和计数器)都要复位! 

2.3 调试技巧

  • “隔离”(回路之间加入不一样的延迟单元,测试时序是否知足)、“直通”(模块直连,如调制数据直接送往解调模块——bypass同步)。
  • 设计时就应该写好测试比较模块。一是软件比较,如Quartus II仿真结果与Matlab理论结果比较,或Modelsim结果(testbench)输出至Matlab中与理论结果画图比较。二是硬件比较,如可把待调制数据写入FIFO,当解调数据输出时同时读该FIFO并进行比较,若是对应位不一样则输出ERROR高电平(此法也可用来判断两个模块是否实现彻底相同的功能)。后者在上板子后可用逻辑分析仪捕捉ERROR信号(触发),注意“Trigger”|“Trigger position”项选择“Post trigger position”,这样能够捕捉到出错前的信号。
  • 高效率:多建工程备份(面积换速度),这样能够马上调试正确版本。
  • 将已经基本调试成功的工程备份至另外的目录,而且每一个工程属性改成“只读”,防止无心中误操做修改了正确版本。——保留备份!
  • 当前正确工程备份后,在此基础上逐步添加新模块。
  • 及时给程序加注释,便于理解;及时写调试文档,重点记录错误点,避免重犯(还有一种状况就是后面想到某个曾被部分否认的方法,殊不知道哪里须要注意)。
  • 将中间结果尤为是关键信号的波形截图保存在word中,能够方便对照!
  • 逐个模块调试,Modelsim大数据量仿真(尤为注意两段数据之间的使能信号及计数器的状态),示波器观察波形(周期,相位...尤为注意不要出现长时间的直流或跳变)。找到出错的地方,看其与哪些变量直接相关,而后由出错位置出发,观察这些变量甚至它们的相关变量,逆向一步步寻找出错缘由。
  • 用已知在别人机器上正确的工程去检验本身的软件环境,而不是从头新建工程trial and error!
  • 先从最简单的功能,最简单的数据(如方波)作起。先测试最基本的信号(如时钟)。输入特殊值观察规律。
  • 若某个reg信号在仿真时波形不正常,可试着将其设为输出output(改变布线)从新仿真。
  • 合理地使用拼接符能够提升程序的可读性和可维护性。使用拼接能够把多个信号的某些位拼接起来进行运算操做。它使用简单,方便阅读,感受不错。特别对应物理实现时就是将相关的位线对应链接起来便可,物理实现比较简单。 

2.4 易错处

  • 仿真输入数据有误或不合理。
  • 仿真时序有问题,包括时钟周期、时钟相位对齐、时钟与使能信号及其指示的输入/输出之间的位置关系等等。
  • 变量位宽不够,致使溢出。相似的还有FIFO存储空间设置太小。
  • v文件中参数值修改后,对应的bdf文件中符号参数值却未改变。
  • 例化模块时常常位置、端口关联混用,致使出错。
  • …… 

2.5 特别注意

  • 仿真时特别注意时钟,有没有加时钟或给时钟脉冲,或者时钟周期是不是预期的(这点上的粗心每每致使仿真“不正确”)。
  • Modelsim仿真时,全部的寄存器必须有清零/复位处理(如Clr),不然默认值为不定态(Quartus中默认值为0)。
  • 将上级模块的输出波形复制做为下级模块的输入时,要特别注意数据是否正确复制,以及与时钟的相对位置是否可靠,大数据量的复制每每可能产生波形“失真”。
  • 编译时把Message框拉开,观察warning,每每会发现程序中的一些小疏漏,及时中止编译,可节省大量时间。
  • if判断语句必须注意判断表达式变量的起始值(复位)!全部使能/指示信号必须保证起始端符合要求!
  • 先保证时序,后保证数据!时序错了,数据对告终果也是错的;数据错了但时序正确,调整时序便可。时序仿真结果不正确,除了怀疑不知足tsu时序要求外,还应注意输入数据是否正确无误!若是仿真结果不合乎要求,应对波形数据进行分析,每每会找到问题所在,不要盲目地修改程序,要知道编译比仿真更费时。分析数据时要首尾兼顾,还应注意数据对齐关系----每每这个影响内部计数器的工做,从而致使结果出错。除了比较数据外,还要确保数据长度正确无误。
  • 接口规范:if...else配套,begin...end对齐,不要追求“新颖”的风格,要便于和别人程序对接。模块编译成功后生成直观的原理图符号.bdf文件,便于修改管理和交流。

 

三  其余

3.1 FPGA基本设计流程

     1) 设计目标分析

     主要肯定芯片应当完成哪些基本功能,以及分析将来可能要增长的功能。注意选择器件时要留有足够的设计余量,以保证从此升级时单板不会所以而修改。

     2) 功能模块划分

     让设计井井有条条理清晰。另外在肯定功能模块划分过程当中,能使设计者在整体上考虑芯片的各个问题,发现一些比较深层次的问题。

     3) 肯定关键电路时序和模块间接口时序(整体方案)

     事实上,在功能模块划分过程当中就必须考虑时序方面的问题。有时,在肯定设计目标时就得考虑关键电路时序。

     在此前的设计过程当中,咱们是将项目设计进行功能分解以后,马上着手子模块具体电路设计,最后再进行系统联调,出现问题了再去更改设计。这是在凑电路,而不是在设计电路。

     设计电路,尤为是数字电路,最关键的一环就是:设计各模块间的接口时序,肯定关键电路的时序。在作整体方案时,应深刻到模块间的时序划分,关键电路的时序肯定,并以此做为指导来进行设计。

     “时序是事先设计出来的,而不是过后测出来的,更不是凑出来的。”

     4) 具体电路设计(并写出详细设计文档)

     在进行模块设计时,应先画出每一个模块的原理结构,然后画出其工做原理时序图,在工做原理时序图的指导下进行具体电路设计。即“先时序后电路”的设计方法。在条件容许范围内,尽可能用集成度高的电路语言直接表述。

     设计流程:明确模块的原理功能-->画出时序图-->(映射为逻辑电路)-->用硬件语言描述时序图(或电路映射图)——先时序后电路!

     5) 调试验证(仿真测试方案)

     设计时就应该作好测试验证机制。咱们目前所采用的验证机制为“隔离”(回路之间加入不一样的延迟单元,测试时序是否知足)、“直通”(模块直连,如调制数据直接送往解调模块——bypass同步)。示意图以下:

     其中延迟单元Delay Unit结构以下:

 

3.2 同步电路的设计规则(仅供参考)

  • 尽量在整个设计中只使用一个主时钟,同时只使用同一个时钟沿。主时钟走全局时钟网络。
  • 在FPGA设计中,推荐全部输入输出信号均应经过寄存器寄存,寄存器接口看成异步接口考虑。
  • 当所有电路不能用同步电路思想设计时(即须要多个时钟来实现),则能够将所有电路分红若干局部同步电路。尽可能以同一个时钟为一个模块,局部同步电路之间接口看成异步接口考虑。
  • 当必须采用多个时钟设计时,每一个时钟信号的时钟误差要严格控制。
  • 电路的实际最高工做频率不该大于理论最高工做频率,留有设计余量保证芯片可靠工做。
  • 电路中全部寄存器、状态机在单板上电复位时,应处在一个已知的状态。

     因为时钟创建-保持时间的限制,FPGA设计中应尽可能避免采用多时钟网络,或尽可能减小时钟的个数。尽可能避免采用多个时钟,多使用触发器的使能端来解决。

     为了不异步的时钟域产生错误的采样电平,通常使用RAM、FIFO存储的方法完成异步时钟域的数据转换,在输入端口使用上一级时钟写数据,在输出端口使用本级时钟来读数据,可以很是方便地完成异步时钟域之间的数据交换。

     处理速度与面积问题的原则:向关键路径部分要时间,向非关键路径部分要面积。为了得到更高的速度,应当尽可能减小关键路径上的逻辑级数;为了得到更小的面积,应当尽可能共享已有的逻辑电路。

     以寄存器为边界划分工做模块。在设计较大规模的电路时,分模块设计是必不可少的,在各模块经过以后再进行系统的联调。但因为在单模块调试和联调时布线资源的占用紧张程度不一样,使得每一个模块的输出没法保持与单独布线时相同,在联调时形成困难。若是每个模块的输出端口都采用寄存器输出,那么即便在总体布局布线后,各模块的输出依然能够保证原来的时序,这使得联调的工做效率大大提升。加入这些寄存器也使得电路的可测性有所提升。 

3.3 Quartus功能仿真流程

     1) 将HDL文件或bdf文件设为顶层

     2) Processing | Start | Start Analysis & Synthesis及Start Fitter生成post-fitting节点

     3) 创建vwf波形文件加入节点和激励

     4) Simulation Tool | Functional | Generate Functional Simulation Netlist | Start

     修改v文件后再次仿真时,只须要Generate Functional Simulation Netlist便可。而生成网表后,除从新编译源文件外,每次修改.vwf波形后都没必要从新生成网表。

     功能仿真时不计入器件延时,但通过寄存器后必产生一个周期的“延时”,这不一样于器件延时,由于它本质上与时钟节拍相关,并不是器件或布线固有延时。

     Quartus仿真时最好让CLK有效沿采到输入数据的中间(稳定),这样不管Functional仍是Timing仿真,都不会出现采样问题。若是输入数据在CLK有效沿变化,则Functional仿真会向后采,而Timing仿真会向前采。中间变量均向前采。彷佛Quartus功能仿真时默认降低沿锁存数据,上升沿驱动输出,而modelsim均取上升沿。

     End Time尽可能设大一些,省得输出延时太大致使波形显示不全,而从新设置初始化文件既不方便又容易出错。固然End Time大了,仿真时间会长一点,但总好过因End Time不够而被迫从新编辑波形。End Time比较大时,时间轴Time bar的移动很不方便,能够在波形须要读取坐标处右键“Insert Time bar”。若是此前已有其余Time bar,则在新Time bar(虚线)上右键“Make Master Time bar”设为主坐标(实现),即可经过键盘“←”、“→”键调整坐标位置。记录下目标点的大体坐标,观察时直接拖动水平滚动条更快。直接在信号波形上双击,便可选中整个波形。选择一段波形,再鼠标滚轮放大,则以选中波段为中心显示放大。Tools|Options|Processing里能够设置仿真输出格式为vwf、cvwf或vcd。

     v文件设为顶层后File-->Create/Update...便可生成symbol,但建议先作...Elaboration过滤语法错误。bdf文件更新及转HDL文件时无需设为顶层。改变源文件端口次序可以使生成的符号易于连线。bdf生成的HDL文件智能化不够,底层模块修改参数后注意要在HDL中必定要改过来!

     在图表文件里双击symbol能够打开其对应的v文件或bdf文件或Select对话框。若是同时还有对应的vwf文件加入工程,也会将其列入对话框中。

     在Quartus里打开已锁定管脚的图表文件,有时会发现未显示管脚,这时需将该图表文件设为顶层文件(注意从Project Navigator中剔除与其对应或重名的.v文件),再Start Analysis and Elaboration便可在图表文件中显示已分配过的管脚。

     用MegaWizard定制元件,其实只需生成.v和.bsf两种格式的文件。除非定制ROM(需指定内存初始化文件),不然相似的宏单元不必重复定制,其实只需例化名不一样便可。好比常常要定制I、Q两路的FIFO,其实只需定制一个,在例化名里标识出I、Q便可。在Project Navigator-->Hierarchy里宏单元名上右键“MegaWizard Plug-in Manager”或直接双击,可打开宏单元编辑器修改定制元件。若是Hierarchy 不能展开,设置顶层并Start Analysis and Elaboration便可。

     Quartus II中止响应时,直接关掉重启。若是上次编译后未作修改,则从新打开工程后没必要再编译一遍。但不要由于编译后从新打开工程没必要再次编译,而没必要要地重启工程或重启Quartus。由于重启后再也没法Undo此前所作的修改了,而这可能带来很是大的麻烦。 

3.4 Quartus中调用Modelsim作仿真

     1) 功能仿真

     将图表文件转换为HDL文件,而后将.v文件加入工程并设为顶层(同时剔除.bdf文件),在Settings里设置testbench路径,Start Analysis and Elaboration无误后Run EDA RTL Simulation,不然会出现Module “xxx” is not defined的错误。

     2) 时序仿真

     步骤基本同上,只不过最后要选Run EDA Gate Level Simulation。

     仿真ROM时,要将.hex文件放置在simulation/modelsim目录下。

     Modelsim中显示模拟波形:信号名上右键“Properties”-->“Format”-->“Analog”选项卡,Height设为50(默认17),Offset设为0,Scale设为0.1。

     若是你的程序复杂,时钟频率高,测试向量多都会致使较长的Modelsim仿真时间,这是难以免的。固然有一些小技巧能够在必定程度上缩短仿真时间(不考虑是否改善计算机硬件配置)好比设计的工做时钟频率为80MHz,即周期为12.5ns,原则上同步时序电路进行功能仿真的时间步进单位就是6.25ns,timescale为0.01ns由于同步时序逻辑通常都只使用时钟的上升沿 因此不须要严格要求时钟其余指标的具体实现 这样就能够把时钟信号设置为非1:1的占空比 即高电平6.5ns 低电平6ns 此时的timescale变为0.1ns 仿真速度能够加快一些 另外若是经过让testbench输出仿真结果文件而不是直接察看波形窗口的话 仿真速度可有较明显提升。

     timescale在仿真的时候须要注意:

     1) 若是不设置,modelsim默认1ps/1ps,vcs默认1s/1s

     2) 可经过printtimescale打印出来指定模块的timescale,以下

1 Initial begin
2    $printtimescale(modulenume);
3 end

     3) timescale 与`resetall成对使用

     不要Load“projectname_run_msim_rtl_verilog.do”,不然会从新编译库。 

3.5 SignalTap II

     SignalTap II在加入Pre_synthesis Node以前,只需知道有哪些Node便可,并不须要作Fitter和Assembler。只需Start | Start Analysis and Elaboration便可,等加完Node后再作Start Compilation,这样可减小一次编译的时间。

     post-fitting用于选择增量编译时,而pre-synthesis用于非增量编译时。

     逮数据时只把Start触发沿设为rising edge。先Run逻辑分析仪,而后瞬间按下清零键,就能够逮到Start变高时的数据。

     使用Signaltap II嵌入式逻辑分析仪时,注意采样深度不要设置过大,由于stp文件是要加入工程的,采样RAM占用了器件很大一部分memory bits。

相关文章
相关标签/搜索