如何获得绝对可以在实际硬件上运行的FPGA设计


9

我刚刚开始学习使用FPGA的数字逻辑设计,并且已经建立了许多项目。大多数情况下(由于我是菜鸟而已),我的设计可以完美模拟(行为模拟),但不能正确合成。

因此,我的问题是“我可以在工作流程中纳入哪些设计步骤,以确保我可以在FPGA上正常工作?”

我希望在两个主要领域提供建议,但这绝对是基于我作为初学者的狭narrow观点,因此欢迎您提出更多建议:

  • 我应该进行所有哪些步骤(查看RTL原理图,合成后仿真等),以学习最佳实践。
  • 在设计逻辑(例如FSM或时序电路)时,应牢记所有注意事项,以避免任何意外的结果。

我正在使用Xilinx Spartan 6 FPGA和Xilinx ISE设计套件进行工作。


1
您在合成中遇到什么问题?您在模拟中实现了较高的覆盖率吗?
pjc50 '16

@ pjc50我不明白这个问题。您是什么意思“模拟中的高覆盖率”?
ironstein'3

1
您需要一个测试平台或刺激来驱动仿真。覆盖率工具以百分比的形式告诉您测试实际执行了多少设计。如果这个数字太低,则说明您的测试平台不足,您没有测试某些实际使用的情况。
pjc50 '16

@ pjc50实际上是一个很好的建议。Xilinx ISE设计套件中的等效功能是什么?
ironstein'3

1
值得注意的是:综合和“绝对可以在实际硬件上工作”是不同的严格程度。可以遵循一些模式来确保其合成。但是,当要确定地使其在实际硬件上运行时,必须记住模拟的准则:“所有模型都是错误的;有些模型是有用的。”
Cort Ammon'3

Answers:


13

在我工作的地方,有两个FPGA设计人员阵营。我称其为“模拟”,“模拟”,“模拟”或“立方体”。另一个阵营全都与设计有关。

s立方人员使用了像modelim这样的模拟器,他们将通过编码方法和/或设计套件中的模块来进行初始设计。然后他们将对其进行仿真,并找出不起作用的内容,然后更改代码。这个过程反复进行了多次,直到他们提出了可行的设计。

设计阵营(我更喜欢)将在纸上(或像visio这样的数字纸)上设计波形,正是所需的波形。然后拿出一个逻辑图。这是一个自我记录过程。然后将图转换为代码(如果图中有某些内容,则代码和图中的比例为1:1,代码中有一个处理过程)。然后对其进行仿真,并将仿真波形与纸上设计的波形进行比较,并期望相同。

我最终都做完了,有时候我会进入立方模式,这不是很有趣。我发现有时我看不到自己的目标。例如,我将更改状态机中的状态,并且更改将降级到下一个状态,然后必须修复该状态。我最终花了更多的时间而不是思考它。

您宁愿在哪个营地?我认为需要进行严格的设计,为您解决问题,但是我认为设计越详细,越严格,从长远来看,您遇到的问题就越少。我举了一些可能的例子,它们可能不适合您工作场所的组织结构。设计细节和仔细计划之所以如此有用的原因是,它迫使您考虑自己的工作。它使调试变得容易。开发一个设计流程,以实现这一目标。此外,请真正熟悉仿真工具并编写良好的测试平台,以测试仿真设备可能遇到的所有条件。当然,这需要与时间保持平衡。例如,编写ADC HDL代码以在模拟中模拟器件。

在我看来,FPGA设计中最有价值的工具是良好的测试程序,可让您全面测试您的设计并逐步进行设计。不能指望FPGA设计能够“正常工作”,而是要花大力气确保所有部分都能正常工作。如果发现错误,请返回仿真和设计,了解仿真的FPGA和RTL之间的区别。这主要是由经验带来的,但是,如果设计可以在仿真中工作,而不能在硬件中工作,那么您需要找出为什么会有所不同。

我学到了一些关键的知识:
1)清理您的输入,时钟和复位电路需要保持清洁,否则您可能会通过系统传播亚稳态。知道什么是双等级同步器。复位电路有许多不同的拓扑结构,知道如何使用它们(网络上有一篇很棒的文章,不过我手头上没有。)
2)预先获取设计要求,然后围绕这些要求进行设计。如果您周围的人不会给您明确的要求,请自己提出一些要求。
3)Matlab定点工具箱非常适合模拟控制系统和DSP应用程序,但是您可能无法访问它。这是在编写代码之前验证设计的好方法。
4)首先是设计,然后是编码,然后是仿真。
5)强类型,在PCB原理图和HDL上还要保持信号名称一致。(这也是为什么我更喜欢VHDL而不是verilog的原因。


2
为“ s立方” +1,或者 simulation3
Paebbels

很好:对于“严格的设计”,我要添加“使用类型系统”。示例:适当类型的数组索引,例如数组的范围,无需测试越界条件。我只不同意“与纸上设计的波形相比的波形”……到那个阶段,设计的波形应该在VHDL中,(或者也许从文本文件中读取),模拟器应该执行比较。
布赖恩·德拉蒙德

也可以通过这种方式完成,我发现在纸上设计波形很有用,因为它提供了一些可比较的东西。像ADC波形一样,设计时序,然后将其与modlesim输出进行比较,然后进行物理验证。如果modelsim输出正确,则将其与之比较。代码是强类型的(我忘了提了),但这确实很重要。这就是为什么我更喜欢VHDL而不是verilog的原因,您可以采取的捷径更少。而且它使代码更具可读性。
电压峰值

是。实际上,就像其他领域(例如软件或常规硬件)一样,起点是将问题分解为多个模块,然后问自己“我将如何知道该模块何时起作用”。然后去做 逐个构建您的设计,然后将各个块放在一起,然后再次测试您得到的是预期的结果。有时您可能会意识到,采用更好的块​​级设计会更清洁或更轻松,因此您回头了。
danmcb

6

主要内容是:

  • 仔细编码,避免不可合成的结构
  • 最小化逻辑电平以获得更好的时序性能(使寄存器之间的逻辑尽可能简单)
  • 测试,测试,测试以确保功能正确性,并检查未初始化的调节器和电线断开
  • 合成并检查合成日志中是否存在警告,请确保警告未指示问题(即,删除寄存器警告可能是有意的(未使用模块输出),也可能是无意的(忘记连接模块输出/输入/等))
  • 映射并检查映射报告以了解利用率数据,确保FPGA不太满
  • 布局布线和时序分析,确保您的设计将以所需的时钟速度运行

按照上述步骤,我在实际的FPGA上进行的第一个测试中已经有几个相当复杂的设计可以正常工作(或至少大部分情况下可以正常工作)。无需检查RTL原理图,这对于大型设计而言非常繁琐且完全浪费时间。合成后仿真将更加有用。


1
感谢您的快速答复。您能否详细说明第二点(最小化逻辑级别)。
ironstein'3

5

您所有可综合的代码都必须表示为:

  • LUT
  • 人字拖
  • 供应商特定的原语

特定于供应商的原语或者是显式实例化的,或者是由供应商的向导生成的,或者是由非常特定的编码模式推断出来的,所以在那里应该没有任何歧义。

例如,在VHDL中,不能wait for在可合成代码中使用。要了解原因,请尝试wait for 100 ns使用LUT或触发器确定性地表达。你不能

这并不意味着您无法通过设置一个具有已知时钟频率(周期可以除以100 ns的计数器)并使用其计数来知道时间何时结束来实现它。但是综合引擎不会自动提出这种方案,您需要在组合逻辑(门/ LUT)和寄存器方面明确架构。

因此,要生成可合成的代码,要记住的主要事情是对代码如何成为逻辑门和触发器有一个比较清晰的了解。就是这样


wait until rising_edge(clk);尽管某些工具对其使用施加了限制,但它肯定是可综合的。
布赖恩·德拉蒙德

2

最明显的第一步是检查警告。

Xilinx工具生成日志文件,该日志文件警告任何可能不是编码人员想要的内容。有时,当您收到大量关于未使用信号的警告时,这会很烦人,您完全知道它们是未使用的。但是有时它会捕获真正的错误。如果您是新手,则犯错的几率会大大提高。

然后,您需要设置时序约束。在时钟A的上升沿之后需要多长时间设置数据线B?还是在时钟A的下降沿之前数据线B需要保持多长时间?时间约束将让您指定所有这一切。如果您没有时序限制,则编译器可能会认为您并不特别在意,并且可以将信号路由到任何地方。如果您有时序限制,则编译器将通过移动布局来确保您的信号满足这些限制。如果不能满足时间限制,它将发出警告。

如果您的问题是输出未达到预期的效果,请详细查看I / O块。每个I / O引脚都有一些相关的逻辑和一个触发器。在代码中指定逻辑和状态变量的顺序可能无法使代码适合这种体系结构,因此,无论代码放置在何处,都会产生额外的延迟。关于时序约束的警告会告诉您是否会发生这种情况(假设您已设置时序约束),但是要解决此问题,则需要您了解硬件以及您的设计将如何映射到硬件中。通常,只有当您开始达到高时钟速率时,这才是一个问题,但是值得一提。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.