本文主要分享研究生期间所学到的一些科研和项目经验,实践部分偏重于硬件电路。点滴琐碎,还请见谅。前端
模块通用性:基本思想是作通用可扩展、特定功能的小“模块”,而不要在后续阶段为加入功能而添加代码。算法
模块就是你给我输入,我给你想要的输出,仅此而已,尽量不要让我进行控制。网络
模块化,减小耦合度,便于移植和调试。尽可能模块化,可避免大的改动。框架
【注】本身编写的三分频模块在Modelsim里会仿真出什么结果呢?好比clk_sn由75M时钟clk_sf三分频产生,那么仿真出来的clk_sn为42ns的时钟,而不是40ns(25M)——由于你所加的75M时钟仿真激励不可能很精确(13.333...ns)! 异步
- 把FPGA仿真结果数据导入Matlab中,画出Matlab理论曲线与FPGA仿真曲线比较(大数据量)编辑器
- 提出一种想法后务必画出理论比较曲线(有比较才有说服力),过多的解释说明倒不如图表直观。模块化
- 设计验证机制工具
勤写报告:1. 保持进度; 2. 用于提问讨论; 3.论文素材。布局
三种报告:post
1) 给老师的报告:综合、轮廓、总体思路——图表化
2) 给本身的报告:设计算法、心得经验、调试细节
3) 给接收人的报告:系统、思路、如何实现及该作哪些工做,便于迅速上手。
之后发挥本身的能动性,天天向老师汇报进度——不是作了多少(太“虚”),而是具体完成了什么!
计划、讨论、汇报,讲给老师听。
有问题必定写文档问老师,不要想着口头说——这其实减小了仔细思考的过程。
不合理的现象背后,必定有合理的缘由。只有抱定这一信念,才能解决调试中遇到的各类问题。与此相反的是:遇到不合理的现象,不是去寻求合理的解释,而是猜测有一些不可控、不可证实的缘由。好比猜测综合工具备bug,电路的信号完整性有问题,芯片过热等。这样一想,问题每每不了了之,调试也就半途而废了。
遇到问题首先思考什么状况下会产生此类问题,寻求可能缘由,而不是怀疑软/硬件工具备问题。
1) 设计目标分析
主要肯定芯片应当完成哪些基本功能,以及分析将来可能要增长的功能。注意选择器件时要留有足够的设计余量,以保证从此升级时单板不会所以而修改。
2) 功能模块划分
让设计井井有条条理清晰。另外在肯定功能模块划分过程当中,能使设计者在整体上考虑芯片的各个问题,发现一些比较深层次的问题。
3) 肯定关键电路时序和模块间接口时序(整体方案)
事实上,在功能模块划分过程当中就必须考虑时序方面的问题。有时,在肯定设计目标时就得考虑关键电路时序。
在此前的设计过程当中,咱们是将项目设计进行功能分解以后,马上着手子模块具体电路设计,最后再进行系统联调,出现问题了再去更改设计。这是在凑电路,而不是在设计电路。
设计电路,尤为是数字电路,最关键的一环就是:设计各模块间的接口时序,肯定关键电路的时序。在作整体方案时,应深刻到模块间的时序划分,关键电路的时序肯定,并以此做为指导来进行设计。
“时序是事先设计出来的,而不是过后测出来的,更不是凑出来的。”
4) 具体电路设计(并写出详细设计文档)
在进行模块设计时,应先画出每一个模块的原理结构,然后画出其工做原理时序图,在工做原理时序图的指导下进行具体电路设计。即“先时序后电路”的设计方法。在条件容许范围内,尽可能用集成度高的电路语言直接表述。
设计流程:明确模块的原理功能-->画出时序图-->(映射为逻辑电路)-->用硬件语言描述时序图(或电路映射图)——先时序后电路!
5) 调试验证(仿真测试方案)
设计时就应该作好测试验证机制。咱们目前所采用的验证机制为“隔离”(回路之间加入不一样的延迟单元,测试时序是否知足)、“直通”(模块直连,如调制数据直接送往解调模块——bypass同步)。示意图以下:
其中延迟单元Delay Unit结构以下:
因为时钟创建-保持时间的限制,FPGA设计中应尽可能避免采用多时钟网络,或尽可能减小时钟的个数。尽可能避免采用多个时钟,多使用触发器的使能端来解决。
为了不异步的时钟域产生错误的采样电平,通常使用RAM、FIFO存储的方法完成异步时钟域的数据转换,在输入端口使用上一级时钟写数据,在输出端口使用本级时钟来读数据,可以很是方便地完成异步时钟域之间的数据交换。
处理速度与面积问题的原则:向关键路径部分要时间,向非关键路径部分要面积。为了得到更高的速度,应当尽可能减小关键路径上的逻辑级数;为了得到更小的面积,应当尽可能共享已有的逻辑电路。
以寄存器为边界划分工做模块。在设计较大规模的电路时,分模块设计是必不可少的,在各模块经过以后再进行系统的联调。但因为在单模块调试和联调时布线资源的占用紧张程度不一样,使得每一个模块的输出没法保持与单独布线时相同,在联调时形成困难。若是每个模块的输出端口都采用寄存器输出,那么即便在总体布局布线后,各模块的输出依然能够保证原来的时序,这使得联调的工做效率大大提升。加入这些寄存器也使得电路的可测性有所提升。
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。