Pi.MX8_第五章 Pi.MX8 项目 - 板布局第3部分 1 min Altium Designer Projects PCB设计 PCB设计 PCB设计 欢迎来到Pi.MX8开源计算机模块项目的新一期!在这个系列中,我们将深入探讨基于NXP的i.MX8M plus处理器的系统模块的设计和测试。 在 上一次更新中,我们完成了布局准备。这包括创建阻抗配置文件,根据板材制造商的规格添加设计规则,并定义应用特殊设计规则的区域。我们还完成了LPDDR4接口的布线,但暂时没有进行长度调整。 在我们开始对DRAM接口进行长度调整之前,我们将查看Pi.MX8模块上其余接口的布线。板上有很多高速和低速总线,其中一些是占用大量布线空间的宽并行总线。为了给每个接口分配足够的空间,我们将首先为模块上的每个布线层创建一个粗略的平面图。 布线规划 路由计划将帮助我们确定如何在可用的信号层中分配所有高速和低速接口。通过提前设置一个大致指南,我们可以确保在当前工作的层上有足够的路由空间。这也有助于我们最小化层之间的转换,并减少在路由过程中需要重做的工作量。 设置布局规划有几种方法,主要取决于可用的工具。我们只需要一个基本的绘图工具,允许我们在现有图像上进行草图绘制。在这个例子中,我们将使用Inkscape。 在Inkscape中,我们可以添加一个背景图像,显示组件放置和以彩色气线形式展示的未路由接口。注意,这个截图中隐藏了电源网络,因为我们将只关注将在信号层上路由的网络。在原理图中,我们在每个电源网络上放置了一个网络类指令,通过简单地在布局编辑器中启用或隐藏相关的网络类,就可以轻松识别哪些网络在平面层上被路由。 对于实际的布线,我们只需在Inkscape中添加线条来代表我们想要在相应层上布线的接口。我们可以调整这些线条的宽度,以表示接口中将要布线的信号数量。线条的颜色可以从背景图像中选择,以便更容易识别正在表示的接口。 由于层间转换也需要在所有层上分配空间,我们可以在每条线的末端添加一个块来详细说明层间转换。 在Inkscape中使用Altium Designer截图作为背景图像进行布局规划 一旦我们对每个布线层重复上述过程,我们就可以开始实际的布线过程了。 顶层布线 有了布线策略后,让我们开始在顶层布线接口。由于我们已经完成了顶层组件的风扇出线布线,我们可以使用所有剩余空间进行信号布线。剩下的空间不多,但我们所拥有的还是可以通过在不会干扰到内层布线的区域策略性地放置过孔来使得内层信号层的布线更加容易。这是提前规划布局的另一个好处,否则这些区域在这个阶段不会被定义。 顶层对PiMX8模块的布线 在顶层放置走线时,我们还应该考虑到我们需要一些空间来添加如定位点或标签等特征在顶层。激光蚀刻的数据矩阵码也可能需要一个纯铜区域或一个没有走线的区域来提供均匀的对比度,意味着这些区域不能用于布线。 内层信号层布线 大多数连接将放置在我们在层堆栈管理器中定义的两个内部信号层上。让我们开始布线所有高速同步接口。在我们的案例中,这些接口可能包括MIPI-CSI、MIPI-DSI和LVDS接口。这些接口都使用低压差分信号,并且都带有一个专用的时钟线和至少两条数据线。它们需要大量的布线空间,因为每条数据线的长度必须在一定的时间范围内与时钟线匹配。匹配多个差分对的长度可能需要很多空间,因为很可能接口内的一个或多个对会引入必须考虑的显著延迟。通过首先布线这些接口,我们可以确保稍后进行长度调整时有足够的空间。 阅读文章
嵌入式系统架构:当您的产品拥有多个PCB时 嵌入式系统架构:当您的产品拥有多个PCB时 1 min Altium Designer Projects Electrical Engineers Electrical Engineers Electrical Engineers 在当今技术驱动的世界中,嵌入式系统无处不在。无论是联网的剃须刀还是复杂的汽车,嵌入式设备都是我们今天使用的大多数电子设备的核心。由一个或多个微处理器组成,嵌入式系统可以通过将复杂性卸载到软件来简化电子产品。随着嵌入式设备变得更大更复杂,印刷电路板(PCBs)也是如此。这些设备往往会发展成多个板并成为比最初预期更大的组装。 在本文中,我们将探讨由多个PCB组成的嵌入式系统的架构权衡和考虑因素。我们将讨论多PCB系统的好处、设计考虑因素和挑战。 为什么使用多个PCBs? 虽然将设备保持在单个PCB上是理想选择(无论是简单性还是成本),但有时我们必须将设计分成两个甚至更多的PCB,以实现我们的设计目标。我们想要将产品分成多个板的一些原因包括: 模块化:将组装分成多个板意味着如有必要,您只能更换产品的一部分。例如,如果单个PCB失败,可以更换它而不影响整个系统。如果正确执行,这可以减少制造商的成本和时间。 空间优化:通过在多个板上分配组件,设计师可以实现更紧凑、更高效的布局。想象一个非常长、狭窄的单板与几个短的、堆叠的板,由于包装的原因,高度并不重要。 热管理:可以在不同的PCB上分配产生大量热量的组件,以改善热量散发。通过在整个组装中均匀分配热量,您可以大大提高系统的可靠性。 可扩展性:使用多个PCB设计允许增量功能添加,可以通过单个板而不是整个组装来更换。想象一下,升级传感器或相机而不替换整个计算系统。 出于这些(以及更多)原因,我们考虑设计一个由多个PCB组成的组装,但嵌入式固件方面的挑战并非没有复杂性。 针对多PCB组装的嵌入式设计考虑因素 现在我们已经确定了使用多个PCB(在适用的情况下)的理由,理解在架构嵌入式系统时的设计考虑因素很重要。无论是从硬件还是软件的角度来看,当我们把一切都放在单个板上时,我们不倾向于仔细权衡的细微差别。 首先我们应该考虑的是板与板之间的通信问题。每块板如何相互通信?每块板上有什么样的处理能力(如果有的话)?或许其中一块板是大脑,而其他的是传感器?当我们仔细选择传输协议,无论是I2C、SPI、UART、以太网等,我们还必须考虑传输线、信号完整性,最重要的是,通过板与板之间的连接器进行信号传输。对设计师来说,最糟糕的事情(相信我,我经历过)就是设计完整个系统并从制造商那里收到你的PCB,只为了意识到你漏掉了一个或两个时钟信号。我们也倾向于忘记在我们的板与板连接器上保留备用引脚,试图将每个引脚数量最大化。这真的可能最终对我们不利。设计时要考虑到多板项目,如 Altium Designer中的多板组装功能,在PCB之间布线如此多的通信线时这是必须的。 我们还需要考虑如何分配电源,特别是如果我们将用我们的微处理器监控电源总线。我们希望能够访问“大脑”以便它能监控任何灾难性事件,但我们也需要考虑切换电源噪声、重负载的电源分配,以及我们的板与板连接器引脚是否能承受那种电力。 最后,虽然这与嵌入式系统的软件本身不直接相关,但机械设计也扮演着重要角色。按键、触摸屏和其他用户的物理接口仍然连接到微处理器,必须考虑在内。我们能否以这样的方式布线,以便微处理器可以访问它的输入?我们是否考虑了当我们从一块板传递到另一块板时高速数字输出的信号完整性?这些是我们在构建我们的嵌入式设备时必须考虑的事情。 挑战与解决方案 我一次又一次在规模扩大的初创公司(甚至是大公司)中看到的最被低估的挑战之一,就是软件和硬件之间版本控制方案的困扰。管理软件发布与PCB修订版之间的关系已成为一个永无止境的战斗,这经常导致混淆、延迟,甚至产品失败。 例如,在我参与的一个初创公司中,PCB的轻微修改需要重新旋转,因此,需要更新固件(尽管很小)。由于版本控制不善,工程团队在旧版PCB上部署了新固件,导致意外的电源下降和偶尔的烟雾。幸运的是,我们在产品发货前发现了这个问题,但这绝对是连续几天的噩梦。 为了避免这些陷阱,建立一个坚固的版本控制方案并确保硬件和软件团队之间的清晰沟通至关重要。即使是一个简单的版本控制方案,如固件的Git哈希(或语义版本)以及硬件修订版的基本支持查找表,也足以开始。随着时间的推移,更复杂的机制,如在固件中检测硬件修订版(从而检查兼容性),也大大减少了混淆。 阅读文章
使用生成式AI编写和运行嵌入式代码 使用生成式AI编写和运行嵌入式代码 1 min Altium Designer Projects 在 如何构建自定义GPT操作以与您的硬件对话和 构建AI实验室助手中,我们学习了如何使用生成式AI控制我们的硬件。通过在ChatGPT中使用自定义GPT操作,我们能够赋予ChatGPT不仅能让树莓派上的LED灯闪烁,还能控制实验室仪器并获取数据的能力。这意味着我们可以使用人工智能作为我们的实验室助手,并处理它从我们的仪器中获取的数据。在这篇文章中,我们将更进一步,让生成式AI不仅为我们编写代码,还能在嵌入式目标上执行代码并在此过程中接收反馈。 背景 使用生成式AI编写代码,即使是对于嵌入式系统,也不是什么新鲜事。已经有很多工具在建议或完全从头开始编写代码。最受欢迎的大型语言模型,如ChatGPT、Gemini和Claude,都已经变得相当擅长编写代码(参见 Gemini与ChatGPT:谁写的代码更好进行比较)。我已经写了一年多关于ChatGPT生成代码的文章了(参见 使用ChatGPT进行自动化测试),并宣称这是如今开发的唯一方式。真正的挑战是将AI纳入你的开发循环中。 代码生成只能带你走这么远,但要验证并确保它有效,当涉及到生成式AI时需要采取不同的方法。ChatGPT的代码解释器提供了一个封装的Python环境,可以在一定程度上运行生成的代码并验证它对你是否有效。我想更进一步,看看我们是否能在嵌入式系统上实现同样的事情。有两种方法可以使用OpenAI的ChatGPT。最常见的方法是创建一个使用OpenAI API的封闭循环应用。它会提示并从大型语言模型(LLM)使用API获取代码,编译它,将其加载到Arduino上,并使用额外的自定义代码来验证生成代码的功能。我决定采取不同的方法,使用GPT操作来使其更像是一种“代码配对体验”。这就是那种体验的样子: 图1:GPT操作示例 虽然这个例子可能很简单(即闪烁一个板载LED),但上面的演示总结了一切。我能够给我的自定义GPT清晰的指令,它完全按照我的预期执行了指令。我还能确认它确实上传到了我的设备,并以1秒的频率让LED闪烁。与封闭循环系统相比,使用自定义GPT的好处是我可以在提示符内很容易地进行迭代: 图2:在Arduino草图上进行迭代 现在你已经看到了一些例子,让我们来看看这一切是如何工作的。 工作原理 就像我们在其他自定义GPT文章中看到的那样,这个项目的GPT Actions设置或多或少是相同的。Dockerfile、Docker Compose、SSL证书以及仓库的总体结构并没有太大变化。当然,设计代码本身和OpenAPI YAML文件显著不同(这是意料之中的)。 这段代码(与之前的例子相比)最大的变化是我们在Python中引入了一个“子进程”来调用外部程序,在这个案例中是Arduino IDE。我们的OpenAPI 阅读文章