本文学习 Verilog 模块基本结构、wire 数据类型及其向量形式用法,简要对比 VHDL 与 Verilog 差异。 本文学习 Verilog 模块基本结构、wire 数据类型及其向量形式用法,简要对比 VHDL 与 Verilog 差异。 Verilog 和 VHDL 是描述数字电路常用的两种语言。AAC 有系列技术文章讨论 VHDL 基础概念。本文作为 Verilog 系列的切入点。 是否需要同时掌握 Verilog 和 VHDL? 讨论前先回应显而易见的问题:真需要同时掌握这两语言吗? Verilog 和 VHDL 都是设计复杂数字电路的强大工具。虽两 HDL 有差异,您可自由选
本文讲解如何用 Verilog 建模组合逻辑,涵盖条件运算符实现真值表和强大的 always 块简洁设计。 本指南演示 Verilog 描述组合电路的关键技术。首先回顾 assign 关键字的连续赋值语法,然后介绍条件运算符 (?:) 作为表达多路选择器逻辑的简洁方式。最后展示 always 块如何提供更清晰的过程化描述。 前文覆盖了 assign 关键字的连续赋值。这些语句持续激活,允许获得电路门级描述。例如以下代码建模与门: assign out1 = a & b; Verilog 条件运算符让单个赋值基于条件改变值。语法: assign [signal_name] = [con
开源功能模拟器 Antmicro Renode 如何成为软硬件协同设计的关键利器 嵌入式系统快速演进,新一代 SoC 复杂度持续攀升。Semico Research 指出,复杂度驱动设计周期拉长、成本上升。为满足客户对新功能、更强安全性、更高性能的需求,厂商必须采用“全栈”协同设计——同步演进硬件、固件、操作系统和工具链。然而缺乏稳健模拟工具,协同设计易陷停滞,延长周期、膨胀预算。 开源功能模拟器 Renode 能填补这一空白。它让硬件和软件团队并行原型设计、测试、迭代,大幅缩短设计周期。下文通过 Dover Microsystems 真实案例,阐释 Renode 如何带来实质收益。 软件模
结构体是高效嵌入式 C 编程的基石。本文探讨其实际应用、声明语法及数据对齐对内存占用的影响。通过策略性排序结构体成员,往往能缩减数据对象体积,这在资源受限环境至关重要。 本文提供嵌入式 C 结构体简明而全面的概览。涵盖实际应用、正确声明方法、影响结构体大小的微妙数据对齐规则。 结构体 当多个同类型变量有逻辑关联,数组是便捷分组。例如保存 ADC 数字化语音输入的最近 50 个采样: uint16_t voice[50]; uint16_t 是 stdint.h 定义的无符号 16 位整数,确保跨平台尺寸一致。 但若需分组不同类型变量——如采样数组和 ADC 采样率?分别声明为独立变量产生不必
电气工程师日常工作中 Python 的应用场景全景 Python 的通用性使其成为电气工程师从早期研发到最终生产测试不可或缺的工具。以下探讨 Python 能显著简化工作流、减少人工干预、强化数据驱动决策的最具影响力领域。 工程师的瑞士军刀 电气工程师职责广泛:固件开发、硬件调试、原型测试、质量控制、大量数据采集。虽然 VHDL 或 C/C++ 等领域专用语言在利基任务中表现优异,但 Python 的通用特性填补了占据工程师大量时间的空白。 实践中,设计工作仅占工程师日历 5%-10%。剩余 90% 用于研究、原型测试、调试、搭建测试治具、生产测试、质量保证和文档编写。Python 擅长自动
理解嵌入式 C 语言中的联合体 在嵌入式系统中,联合体是一种强大的数据结构,允许在同一内存位置存储不同数据类型。本文梳理联合体基础,展示实战案例,解释为何它是内存受限和带宽敏感应用的首选工具。 嵌入式 C 中结构体与联合体的区别 前文介绍过结构体:将异构变量组合成单一实体。C 语言联合体也是组合不同类型的构造,但关键区别在于——所有成员共享同一内存地址。 入门示例 声明联合体与结构体几乎相同,只需将 struct 替换为 union: union test { uint8_t c; uint32_t i; }; 模板定义两个成员:c 占 1 字节,i 占 4 字节。创建该类型变量: uni
C 语言联合体实现高效数据打包与解包 联合体提供了一种强大且内存高效的方式,将同一字节序列重新解释为不同数据类型。虽最初设计用于互斥变量共享内存,现代 C 程序员常用联合体进行数据打包、解包和类型双关——特别是处理串行协议或底层通信时。 联合体如何共享内存 联合体所有成员共享同一内存区域。最大成员决定联合体大小,每个成员起始地址相同。 union { uint16_t word; struct { uint8_t byte1; uint8_t byte2; }; } u1; 此处 word 占两字节,嵌套结构将这两字节拆分为 byte1 和 byte2。内存布局可视化为: 将两字节打包为
学习如何使用外部文本文件初始化 C 语言数组 本指南讲解如何在 C 程序中使用存储在独立文本文件中的数据填充数组。这些值不嵌入源代码,而是在编译时加载。内容涵盖一维和多维数组,展示如何控制数组驻留在 RAM 还是非易失性存储器,并演示如何在多个数据文件中选择初始化源。 示例针对 32 位 ARM 微控制器,使用 GCC 编译。所有代码片段采用标准 C,兼容该编译器。 数组初始化基础 在 C 语言中声明数组时,可在花括号内提供初始值列表(称为初始化项)。例如: 若省略方括号内的大小,编译器会根据初始化项数量推断。如果声明的数组大于初始化列表,剩余元素默认为零。提供的初始化项超过声明大小会触发
感知机简介——神经网络分类的基石 本文是系列教程的第一篇,旨在全面讲解如何使用 Python 设计、训练和评估用于复杂分类任务的神经网络。系列核心聚焦于多层感知机(MLP),这是一种广泛应用的神经网络架构。 访问完整的感知机系列教程: 如何使用神经网络进行分类:什么是感知机? 如何使用简单感知机神经网络示例对数据进行分类 如何训练基本感知机神经网络 理解简单神经网络训练 神经网络训练理论简介 理解神经网络中的学习率 多层感知机进阶机器学习 Sigmoid 激活函数:多层感知机神经网络中的激活 如何训练多层感知机神经网络 理解多层感知机的训练公式与反向传播 Python 实现的神经网络架构 如
理解感知机:数据分类的实战示例 本文属于感知机神经网络系列文章。无论您是初学者还是想复习特定主题,下方相关文章提供完整学习路径。 如何使用神经网络进行分类:什么是感知机? 如何用简单感知机神经网络示例对数据分类 如何训练基础感知机神经网络 理解简单神经网络训练 神经网络训练理论导论 理解神经网络中的学习率 多层感知机进阶机器学习 Sigmoid 激活函数:多层感知机神经网络中的激活 如何训练多层感知机神经网络 理解多层感知机的训练公式与反向传播 Python 实现的神经网络架构 如何用 Python 创建多层感知机神经网络 神经网络信号处理:神经网络设计中的验证 神经网络训练数据集:如何训练
Python训练基本感知机神经网络 本指南演练全注释Python实现,自动学习单层感知机权重。代码可直接复制粘贴运行,并适配自有数据。 探索AAC感知机系列 为深入语境或跳转进阶主题,查看其余文章: 如何用神经网络分类:什么是感知机? 如何用简单感知机神经网络示例分类数据 如何训练基本感知机神经网络 理解简单神经网络训练 神经网络训练理论导论 理解神经网络学习率 多层感知机进阶机器学习 Sigmoid激活函数:多层感知机激活 如何训练多层感知机神经网络 理解多层感知机训练公式与反向传播 Python实现的神经网络架构 如何用Python创建多层感知机神经网络 神经网络信号处理:神经网络设计
本文解释 IEC 60730 Class B 标准如何确保家用电器功能安全,涵盖机械与电气设计,并介绍助力制造商满足要求的控制器 现代家电简化日常任务,让用户轻松自信完成家务。正常运行时增值;失效时则构成重大风险——包括危及生命财产的火灾隐患。 国际电工委员会 (IEC) 推出 IEC 60730 Class B 标准,将安全融入电器设计肌理。保险商实验室 (UL) 也背书该标准,强化其公信力,确保灶具、炉灶、洗衣机、干衣机、洗碗机、冰箱和冰柜满足严格安全标准。 预防严重家电问题 据国家消防协会 (NFPA),灶具和炉灶占所有报告家庭烹饪火灾 62%,无人看管烹饪为此类事故首因。NFPA 数据
探索时域数据滤波最常用技术,考察 LPC55S69 PowerQuad 双 Biquad IIR 引擎如何加速 DSP 任务 处理随时间采集的数据时,首要步骤往往是应用数字滤波器。理解各种滤波策略不仅改善信号质量,还能为嵌入式单片机释放 CPU 处理其他关键任务——这至关重要。 本文涵盖最广泛使用的时域滤波方法,深入剖析 LPC55S69 MCU 中 PowerQuad 单元的双 Biquad IIR 引擎,这是一个强大的 DSP 构建模块,可用于多种滤波场景。 连续采样数据的常用滤波器 在时域采集系统中,样本以固定已知速率到达。时域滤波器处理这些样本并产生新信号,可进一步处理或送往数模转换器
本文揭示 JTAG 如何集成到 ARM 核心器件中,聚焦 Arm 调试接口 (ADI) 及串行线调试 (SWD) 协议。 本系列早期文章探讨了 IEEE 1149.1 标准、测试访问端口 (TAP) 控制器和 TAP 状态机。我们也回顾了常见 JTAG 引脚定义、连接器和市场上可用的调试探针阵列。 此处我们转向 ARM 生态系统,详述无处不在的 ARM 核心处理器如何通过 ADI 及其双线 SWD 变体实现 JTAG。 什么是 ARM? ARM 指代处理器架构和庞大的知识产权组合,定义微处理器和微控制器接口。消费级 PC 通常用 x86,嵌入式系统几乎完全依赖 ARM 核心。 核心 IP 授权
利用 LPC55S69 PowerQuad 引擎实现高效 FFT 计算 NXP LPC55S69 微控制器专为高性能信号处理设计。其 PowerQuad 协处理器内置两个专用引擎:Biquad 滤波器和变换引擎。Biquad 处理时域滤波,而变换引擎以最小 CPU 参与执行快速傅里叶变换 (FFT),释放 Cortex®-M33 核心执行其他任务。 理解离散傅里叶变换 时域采集的信号往往在频域中最易解读。离散傅里叶变换 (DFT) 量化采样信号与不同频率正弦和余弦基函数的相关程度。 观察 图 1 所示采样输入信号: 用参考余弦说明相关性 将输入与参考余弦波(图 2)比较,点积产出标量表示相关
本文详细对比在 FPGA 上实现有限状态机 (FSM) 时的二进制、格雷码和独热编码。理解综合工具如何评估并可能转换这些编码,对实现最优性能和功耗效率至关重要。 有限状态机无处不在于数字设计。综合工具例行分析 RTL 以检测 FSM,并可能重写状态编码以满足时序、面积或功耗目标。即使您手动分配状态码,工具也可能基于其优化策略替换为不同值——有时甚至改变位宽。 如需 Verilog 构建 FSM 复习,请参阅我的文章《Verilog 中创建有限状态机》。 编码选项:二进制、格雷码与独热码 三种最常见 FSM 编码为二进制、格雷码和独热码。各有独特权衡。 二进制编码 二进制编码用最少位数表示所有状
跟随三个实验,阐释如何为 FPGA 设计选择最合适的编码 设计 FPGA 逻辑时,综合工具通常自动选择编码;一般建议信任其决策。但理解二进制、格雷码和独热码的细微差别,有助于预判编译器何时倾向于某种编码。 本文通过实战实验,以康威生命游戏为测试平台,凸显将各种编码应用于大规模有限状态机阵列时出现的权衡。 本系列已涵盖 Verilog FSM 构建、初始状态与存储对编码的影响,以及二进制、独热、格雷码的高层对比。 测试系统 为放大硬件差异,我在 23×23 网格中实例化数十个状态机,直接对比二进制、格雷码和独热编码。 康威生命游戏是经典细胞自动aton,在二维矩形格子上模拟细胞出生、存活和死亡。
本文涵盖 MOS 晶体管基础,旨在更好地理解此类晶体管中可能发生的漏电流。 MOS 晶体管不断缩小以最大化集成电路内封装密度。这导致氧化层厚度减小,进而降低了 MOS 器件的阈值电压。在较低阈值电压下,漏电流变得显著并加剧功耗。因此,了解 MOS 晶体管中的各类漏电流类型至关重要。 在尝试理解各漏电流成分之前,让我们先重温 MOS 晶体管核心概念。这将帮助我们获得更深入的见解。 MOS 晶体管结构回顾 MOS 晶体管结构由金属、氧化物和半导体组成(故称 MOS)。 以 p 型衬底、n+ 扩散阱作漏极和源极的 NMOS 晶体管为例。氧化层由 SiO2 制成,生长在漏极和源极之间的沟道上。栅极由
漏电流显著增加功耗,尤其是器件缩小至更低阈值电压时。本文考察现代 MOS 晶体管中六种最常见漏电路径。 在短沟道 MOSFET 中,以下漏电机制占主导: 反偏 p-n 结漏电 亚阈值漏电 漏极诱导势垒降低 (DIBL) 阈值电压翻滚 温度依赖性 栅极氧化层隧穿(直接和 Fowler-Nordheim) 热载流子注入栅氧化层 栅极诱导漏极势垒降低 (GIDL) 穿通漏电 熟悉基本 MOSFET 工作原理有助于理解各机制的细微差别。 1. 反偏 p-n 结漏电 正常工作时,MOSFET 的漏极-源极和衬底结处于反偏。这些结的漏电源于少数载流子漂移/扩散和雪崩产生。其大小取决于掺杂浓度和结面积
探索电池管理系统的核心作用,及实现安全、高效电源设计的基础组件 当今高性能锂离子电池能量密度高达 265 Wh/kg,若过度使用则极具危险性。电池管理系统 (BMS) 是将电芯维持在安全极限内的保障,防止热失控并延长寿命。 本文梳理 BMS 架构基本原理,剖析典型系统的核心部件。 基本 BMS 配置 图 1 展示了旨在防范重大故障的 BMS 常见构建模块。 图 1. 典型 BMS 框图 示例管理四串锂离子电芯。电芯监测器读取各电芯电压并均衡电池包,MCU 控制遥测、开关逻辑和均衡策略。 针对简单应用,市场提供省去均衡或 MCU 的精简方案,如图 2 所示。 图 2. 简单电池管理器。图片由
嵌入式