从概念到FPGA逻辑实现的设计流程

作者: Terry-351571
上传时间为: 2019-01-28 03:43 PM
2019-01-28
阅读:

今天再啰嗦点玄学 - fpga的设计流程,因为“流程”我们学习任何一门技术都必须事先清楚的重要信息。

还是先划一下重点 - 我们应该学什么?想一下如果你要去驾校学开车,什么是你的重点?开车的一系列要领和技术还是你用来学习驾驶的车的按钮的操作?显然是前者,虽然市场上的车有几十上百个不同的型号,多数的驾校都用桑塔纳来当教练车,基于的前提就是所有的车支持你在路上行驶的功能(换挡、加速、刹车、后视镜、方向盘)都是齐备的,主要的不同点在于这些功能按钮摆放的位置不同。

因此当你要驾驶一辆从未摸过的车,你心里并不紧张,因为你已经学会了驾驶,而且知道所有的车操作起来都大同小异,只要花5分钟看一下说明书,熟悉一下各个功能的按钮在哪里就可以上路了。

设计FPGA和画PCB道理也是如此 - 我们要清楚地知道你需要掌握的技术是什么?运用这些技术需要的步骤、流程是什么?包括哪些环节?把这些搞清楚了,无论你用哪家的平台、哪家的工具,就像换一辆不同品牌的车一样都可以在简单地对应之后从容操作。

因此,要学习设计FPGA,第一件要做的事情就是FPGA设计和使用要经历哪些环节、流程?每个环节的注意事项是什么?

下面是一个简单的FPGA设计Flow(流程)示意图。

我们来看看每一步都要做什么事情:

  1. 设计定义:虽然貌似跟器件还没打交道,这一步却是整个过程中最重要的,它是将你的需求转化为具体的逻辑功能实现的过程。比如你要设计一个交通灯的控制逻辑,我建议你去马路边蹲十分钟,仔细观察十字路口的交通灯的变化方式,用你自己的语言把每个状态以及各个状态之间的转换方式、导致这些转换的条件等描述清楚,将这些用笔在纸上画出来,不漏掉任何一个细节,做到这点,你的逻辑其实已经出来了。后面的步骤都是工具要做的事情 - 将你脑子里的逻辑转变成用FPGA芯片执行的逻辑,并通过板子上的按键、LED指示灯等表现出来而已。复杂的任务就需要进行分解,就像你有一个团队,团队中的每一个角色承担不同的职能,既要定义好每个角色的功能,又要定义好他们之间的关联方式,也就是你需要将要实现的逻辑功能自上而下(Top Down)地分解为多个功能模块(module),把每个模块之间的接口信号及相应的时序关系定义清楚;
  2. 告诉机器该怎么做:将你纸上画好的逻辑关系用计算机工具软件能够理解的语言方式撰写清楚,这个过程叫逻辑输入,使用的方式可以是原理图(最古老、直观的方式)或者一些硬件描述语言 - Verilog、System Verilog、VHDL、System C等。在我们的教程中用的是Verilog这种硬件描述语言(HDL),做过PCB设计的同学肯定会觉得这个过程很类似绘制原理图;
  3. 通过验证确保机器的理解跟你想的一致:在用这些机器语言表述你的逻辑的时候你要确保机器理解的跟你自己理解的是一致的,如何才能做到这一点?我们聪明的工程师发明了“Simulation(仿真)”这么个过程,给出一些输入条件,看机器理解的结果是不是如你预期的一样,如果有出入,那就是你们之间的沟通有问题,也就是你用它的语言表述的不够清晰、准确,你需要进行调整;类比PCB设计,这个过程类似你设计了一个模拟电路之后需要运行Spice工具对你设计的电路以及相应的参数进行验证一样。很多人省去了这个过程,把风险留给了后面;
  4. 让机器生成一个“它”理解的逻辑,这一步叫逻辑综合,当然得到的结果是机器能够理解的抽象的关系图,基于这个关系图机器就可以在下一步自动根据FPGA的内部资源进行具体的功能分配了。到现在为止还没有跟具体的FPGA器件发生任何关系,这就类似PCB设计中基于绘制的原理图生成了Netlist一样。
  5. 针对具体的FPGA器件进行资源分配 - 我们叫Implementation,也可以叫Place & Route(中文意思是布局布线,跟PCB中的过程类似)。这个过程就与你选用的哪家的器件、哪个类别的器件、哪个型号的器件,乃至哪个速度等级的器件都有关系了,在资源分配的过程中你一定要给出让计算机分配资源的约束条件,除了你选用的具体的器件本身的资源限制以外,你要指定在逻辑中的哪个信号对应在哪个管脚上,从一个管脚到另一个管脚之间的最大延时是多少等等,这就类似PCB布局布线的时候你一定要根据加工厂提供的需求设定每根走线的宽度、线间距、过孔的大小等design rule一样。道理都是一致的,面对具体的器件,你不能随心所欲。
  6. 每次完成布局布线,因为不同厂商的不同型号的器件其内部的构成架构是不同的,因此需要再次验证将你的逻辑映射到具体的器件的具体资源里面以后,它干的活是不是满足你的要求,不仅要求其实现你需要的功能,更要要求其满足你要求的性能,也就是说内部的这些功能块乃至每个门之间的时序配合要满足你的要求,否则在实际的系统中就会出乱子的。这就像国庆阅兵,每个部队在拉到长安街之前要经过严格的演练,要做各种演习,验证你的每一个环节都配合得天衣无缝。
  7. 一切都完美 - perfect,生成一个最高指示 - bit stream,发送到你选中的fpga芯片配置的PROM中,每次FPGA加上电以后就调用这些PROM中的最高指示,将其内部的资源配置成最高指示想要的模样,任劳任怨地干活呗。

这个流程清楚了吧?每家的FPGA都得遵循这个过程,无论是其中的贵族还是贫民,因为设计的规则都是一样的。

还是那话,无论是Lattice的Diamond,Intel的Quartus,亦或是Xilinx的Vivado,都是“大同”的 - 都要具备这些功能,都要遵循这些流程,不同的就是有的搞得简约一些,有得搞得华丽一些,每个按钮点一点,每个输出的结果看一看,就清楚他们之间的“小异”了。

不要再宣称我只会用Xilinx的Vivado、我只会用Altium的AD,这只能说明你没有真正掌握设计的核心。

讲了这么多玄学,下一节我们就安装Lattice的Diamond来开始真正的逻辑设计。

转自苏老师原创文章

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示