首页›行业资讯›从MCU转向FPGA还需了解的另外三件事
← 返回行业资讯
技术教程

从MCU转向FPGA还需了解的另外三件事

FPGARelated ·
介绍从单片机转向FPGA开发时需注意的另外三个要点,属技术教程。
本文为原文全文的中文翻译(约 3519 字),原文配图已同步至站内;机器翻译仅供快速阅读,细节请以原文为准。

从MCU转向FPGA时还需了解的另外三件事

我口袋里装着微控制器(MCU)已经有几十年了。它们一直比现场可编程门阵列(FPGA)更容易上手,但过去几年里,这种情况开始发生变化。不少公司已经开发出低于100美元的FPGA实验板(有些甚至远低于100美元)。主要厂商都提供了低成本或免费版本的工具栏,市面上也有一些开源选项。

然而,这种可及性的提升并不意味着你可以轻松地从MCU跳到FPGA。经验丰富的MCU用户常常会掉进一些陷阱。如果你还没读过,去看看我在Embedded Related上发表的第一篇相关文章:“从MCU跳到FPGA——你需要知道的5件事”。现在你已经回忆起来了,继续往下读,了解另外五件你需要知道的事。

第一项——创建多个硬件实例,而非复用代码

以函数和对象形式进行的代码复用,对MCU领域的任何人来说都应该非常熟悉。甚至现代版本的BASIC语言也允许代码复用。这个概念如此基础,以至于如今我们大多数人都在不假思索地使用它。

你的FPGA代码可以调用外部代码块,通常称为模块或库,方式与MCU代码调用外部函数相同。在MCU世界中,你实际上是在调用同一物理内存位置上的同一物理代码。代码只需放入内存一次,便可反复使用。即使在具有交换和页面文件的更高级系统中,无论使用多少次,代码仍然只占用一次内存。这是软件世界中最基本、最早设计的资源节约方式之一。

然而,在FPGA中情况并非如此。你节省的是源代码文件中的空间,并使其更具可读性(我希望如此),但你并没有节省FPGA内部的空间。每次在FPGA中使用一个代码模块时,你都会使用FPGA架构的一个新区域来创建另一块功能硬件。我们称之为实例化模块,因为你正在将FPGA的一个新功能部件带入存在。

从概念上讲,在FPGA中实例化模块类似于在MCU编程语言中调用函数或定义对象。然而,正如我上面所写的,在FPGA世界中,你实际上是在创建一个独立的硬件部件。这意味着你需要将其连接到硬件的其余部分,并且需要考虑FPGA逻辑块的使用。

模块的使用和代码复用是开发中的重要部分。但不要以为这样做就能在运行时节省FPGA的空间。事实并非如此。

第二点——亚稳态

使用FPGA电路可以实现许多很酷的功能。其中最酷的一点是,你可以在电路的不同部分使用不同的时钟。大多数规模较大的FPGA都提供多个时钟源,你还可以通过计数器等进一步操控它们,从而在时钟使用上尽情发挥。

然而,就像许多乍看之下很酷的事情一样,混用多个时钟可能会给你带来很多麻烦。由一个时钟控制的所有逻辑被认为处于该时钟的时钟域中。如果你使用了不止一个时钟,你就在使用不止一个时钟域。这本身没问题,直到你需要将来自两个或多个不同时钟域的逻辑组合在一起。

设想你有部分逻辑运行在66 MHz时钟上,部分运行在100 MHz时钟上,而你需要对来自这两个时钟域的信号执行某些逻辑操作。很容易看出,时钟边沿有时会无法对齐。那就会出问题。

即使时钟以相同速度运行,但来自不同的原始时钟,你也可能遇到同样的问题。假设时钟A与你的跨域逻辑之间有五个逻辑门或操作,而时钟B与你的跨域逻辑之间有20个操作。两个信号之间传播延迟的差异可能使你处于这样一种情况:一个信号在另一个信号稳定之前就被采样。任何时候,只要存在一个时钟的建立时间可能无法与采样窗口正确匹配的情况,你就有亚稳态的风险。

这在概念上与MCU世界中的按键抖动有些相似。这不是一个精确的类比,但最终会得到类似的结果,即一个不确定的值。

然而,亚稳态的解决方案并不复杂。任何时候,当你有信号异步到来或来自不同的时钟域时,让它通过一个双触发器,如上所示。

Clk_in来自我在电路这一部分所使用的时钟域。d_in是来自不同时钟域的信号。第一个触发器的输出有可能是亚稳态的。第二个触发器的输出将是稳定的。

以下是用于创建上述同步器的代码示例:

module flipflops( input d_in, // 第一个触发器的输入 input clk_in, // 时钟 output reg q_out // 第二个触发器的输出 ); reg ff1q_to_ff2d; // 第一个触发器的Q输出连接到第二个触发器的D输入 always @ (posedge clk_in) begin ff1q_to_ff2d <= d_in; q_out <= ff1q_to_ff2d; endendmodule 第3项——阻塞/非阻塞

在FPGA领域,我们有时会讨论阻塞逻辑与非阻塞逻辑。术语是我在这里遇到的最大问题。对我来说,这两个词会让我联想到橄榄球的画面,而我不太关注体育。幸运的是,在这个语境下,阻塞与阻止四分卫被擒杀毫无关系。更准确的说法是“即时逻辑”。

非阻塞是基于时钟的,就像回合制电脑游戏。在游戏中,你先准备好一堆东西,然后所有人都在回合结束时看到结果,但你不能比别人提前准备好东西。你可以提前规划,但一切都在其适当的回合中发生。在非阻塞(即基于时钟的)逻辑中,所有逻辑的结果只有在下一个时钟周期之后才是准确的。

阻塞逻辑:

assign GATE_OUT_Y = GATE_IN_A & GATE_IN_B 阻塞:“GATE_OUT_Y”将始终立即反映“GATE_OUT_A”与“GATE_OUT_B”的结果。

非阻塞逻辑:

led_count <= led_count + 1; 非阻塞:“led_count”只有在时钟周期之后才是准确的

always @ (posedge clk) led_count <= led_count + 1; led_countB <= led_count; led_countC <= led_count; end 在上述情况下,每个时钟周期执行一行。首先 led_count 递增,然后我们将该中间值存入 led_countB。最后,我们将值存入 led_countC。每个时钟周期发生一个操作。完成所有这些需要三个时钟周期。他们称之为“非阻塞”,是因为尽管每个时钟周期只有一个语句执行,但下一个时钟周期的语句不会停止或“阻塞”always 块的运行。

如果我们使用阻塞逻辑,情况会完全不同。

always @ (posedge clk) led_count = led_count + 1; led_countB = led_count; led_countC = led_count; end 所有赋值同时发生。这可能导致不可预测的结果,取决于传播延迟和其他因素。理论上,结果应与上述非阻塞示例相同,但 B 和 C 有可能在递增语句的建立时间之前被采样,从而导致不期望的结果。

最好避免在同一个 always 块中混用阻塞和非阻塞赋值。并且在决定使用阻塞还是非阻塞之前,务必仔细想清楚你要实现的功能:

进入更复杂的项目

这三个概念,加上我上一篇文章中的五个概念,应该能帮助你跨越从MCU转向FPGA时的一些主要障碍。我鼓励你找一块开发板开始动手实践。

你可能还会喜欢

要回复评论,请点击每条评论附带的“回复”按钮。要发表新评论(而非回复某条评论),请查看评论顶部的“写评论”标签页。

如果你已在该平台拥有账户,请登录(在右侧)。

否则,请使用此表单免费注册,并加入最大的电子/嵌入式/DSP/FPGA/ML工程师在线社区之一:

每天都有数百名垃圾信息发送者试图在此平台上创建账户,企图滥用论坛和评论区。

我们发现,确保只有合法用户被接纳的唯一有效方法,是要求新用户输入并确认其工作、学校或ieee邮箱地址。

关于Duane Benson

Duane Benson是一位技术记者和顾问。他在电子设计和制造行业拥有30多年的经验,担任过开发者、高管、演讲者和作家。Duane在将复杂主题变得通俗易懂方面有着公认的成绩,并且擅长从不止于显而易见的视角来评估信息。

Duane Benson的热门文章

博客 - 名人堂

VHDL教程系列 Gene Breniman

FPGA的工作原理以及你为什么会买一块 Yossi Krenin

MyHDL FPGA教程(LED频闪) Christopher Felton

微控制器简介 Mike Silva

免费PDF下载

关于FPGARelated.com

社交网络

相关网站

请注意,目前hotmail/outlook/msn邮箱地址存在问题。如果您输入这些提供商之一的邮箱地址,您将无法确认您的邮箱地址并使用本网站的功能。

阅读原文 →
来源:FPGARelated

本页摘要由 AI 辅助整理,经编辑审核后发布;AI 仅用于提炼与分类,原文均附来源链接。