我很高兴分享我过去六个月开发的 VHDL 与 FPGA 课程即将完成。目前处于测试版,将于今秋正式发布。 课程面向谁? 本课程面向已掌握其他编程语言但初涉 VHDL 和 FPGA 的开发者。从入门或中级进阶到掌握高级 VHDL 构造。 适合被指派 FPGA 开发的专业软件工程师,以及探索硬件设计或考虑转行 FPGA 工程的学生和自由职业者。 具备基本编程技能者均受益于我们的实战方法。我们从零构建真实物理产品,走完我作为 FPGA 工程师的每一步。 项目 最终产品是点阵 LED 显示控制器。点阵 LED 常用于大型户外广告牌和信息显示,历史上也用于数字手表和自动售货机。 可仅用仿真完成课程;无
初次接触 AXI 接口设计模块时,我对其精简流控方式感到惊讶。不同于依赖 busy/valid、full/valid 或 empty/valid 对的传统协议,AXI 仅用两个信号:ready 和 valid. 最初的挫败感很快变成了着迷。 AXI 将流控直接嵌入握手,省去额外状态线。基本规则虽简单,但映射到 FPGA 硬件时需细致注意。本教程演练一个运行在块 RAM 上的 VHDL AXI FIFO 实现。 AXI 解决延迟一周期问题 两个时钟同步模块交换数据流时,防止过读和过写是常见挑战。核心问题在于每个模块只能在发生后一个时钟周期观测对方输出。 上图展示顺序模块写入使用经典 写使能/满
从 ASCII 文件读取二进制或十六进制字面量预填充块 RAM 是最高效方法。此技术也可创建 ROM,因为 FPGA ROM 只是只读的 RAM。 下文示例在 VHDL 文件声明区声明以下常量和 RAM 类型: constant ram_depth : natural := 256; constant ram_width : natural := 32; type ram_type is array (0 to ram_depth - 1) of std_logic_vector(ram_width - 1 downto 0); 本文属 TEXTIO 系列。测试平台用 TEXTIO 读激励文件
从外部文件读取激励数据是控制 VHDL 中被测设备 (DUT) 的强大方式。通过在纯文本文件中编写信号值和仿真时间序列,设计者无需修改测试平台逻辑即可快速切换测试模式。本文是 VHDL 文件访问系列第二篇,演示如何用 TEXTIO 库读取激励文件并应用到 4 输入多路复用器。 测试用例概览 DUT 为标准异步 4 选 1 多路复用器,8 位数据字。测试平台不做输出验证——仅驱动输入以便手动观察波形。实体重现如下: entity mux_4 is port( din_0 : in unsigned(7 downto 0); din_1 : in unsigned(7 downto 0); di
VHDL 测试平台导入图像最简单方式是用 BMP 光栅图形格式。BMP 文件被 Windows 原生支持,且以无压缩方式暴露原始像素数据,极适合仿真。 本文讲解如何读取二进制 BMP 文件、将像素数据存入动态内存、送入 VHDL DUT、并将处理后图像写回新 BMP 文件。示例 DUT 执行灰度转换,但技术适用于任何逐像素处理模块。 属于 TEXTIO 系列:用 TEXTIO 从文件初始化 RAM用 TEXTIO 在测试平台读取激励文件 为何 BMP 是 VHDL 最优格式 JPEG 和 PNG 网络普及,但都用压缩。JPEG 有损,PNG 无损;两者都给测试平台直接访问像素数据增加复杂层。B
这是一个关于 FPGA 与可编程逻辑技术的入门演示视频。我于 2019 年 11 月 19 日在泰国曼谷 7 Peaks Software 主办的活动上进行了这场 45 分钟演讲。演讲亮点:05:07 – 谁在使用 FPGA?09:06 – 什么是 FPGA?12:13 – 用静态 RAM 仿真逻辑门17:47 – 常见 FPGA 基元19:51 – 最便宜和最贵的 FPGA20:53 – FPGA 平面图24:30 – VHDL28:05 – 综合与布局布线30:50 – 软核33:15 – 混合 FPGA/CPU (Zynq‑7000)36:44 – FPGA 优缺点40:28 – 含 F
VHDL 内置伪随机生成器产生 [0, 1] 区间浮点值。通过缩放和偏移,可创建任意类型随机数据——实数、整数、std_logic_vector 或 time,适用于测试平台。以下指南展示如何用 IEEE MATH_REAL 包的 uniform 过程构建这些生成器,并利用 OSVVM Random 包获得更大灵活性。 下面示例基于 IEEE MATH_REAL 包定义的 uniform 过程: procedure UNIFORM(variable SEED1, SEED2 : inout POSITIVE; variable X : out REAL); 它需两个种子变量,每次调用更新。输
脉宽调制 (PWM) 将数字 FPGA 引脚变为强大的模拟控制器。通过高速切换电源开关,PWM 在从未产生真实模拟电压的情况下,向负载提供所需精确平均电流。 典型 PWM 应用包括扬声器音频输出、LED 调光、控制感应电机转矩,如伺服电机、电脑风扇、水泵、电动汽车无刷直流电机等。 延伸阅读:FPGA 引脚 PWM 实现 RC 舵机控制器 PWM 工作原理 当电源在高频下在 100% 和 0% 间切换,负载看到的时间平均电流与电源导通时间比例成正比。下图说明原理: 占空比 占空比定义 PWM 输出每个周期保持高电平的时长。以百分比表示,由二进制计数器值计算: VHDL 实现中将占空比视为无符
我注意到近两年购买的许多小工具已从 LED 闪烁转为 LED 呼吸。多数电子设备含状态 LED,其行为指示设备内部状态。 我的电动牙刷在需充电时闪烁 LED,手机用 LED 提醒各种事项。但 LED 不再像过去那样闪烁,而是呈现模拟脉冲效果,强度连续变化。 下方 GIF 动画展示我的罗技鼠标用此效果指示充电。我称之为 呼吸 LED,因光强变化模式在速度和加速度上类似人类呼吸周期。之所以显得自然,是因为照明周期遵循正弦波模式。 本文延续上周关于脉宽调制 (PWM) 的博文。今天将使用 PWM 模块、锯齿计数器和上篇教程创建的复位模块。点击下方链接阅读 PWM 文章! 如何在 VHDL 中创建
当 VHDL 测试平台达到预期执行末尾,您会希望仿真器干净停止,并尽可能将控制权返回给调用脚本。本文回顾主流 VHDL 仿真器中停止仿真的常用可靠技术,提供 ModelSim、Vivado 和 Tcl 脚本的代码示例。 1. 使用 finish 过程 (VHDL‑2008) std.env 包的 finish 例程是结束无错误完成测试平台最直接的方式。仅以 VHDL‑2008 编译测试平台;RTL 可保持早期标准。 use std.env.finish; ... SEQUENCER_PROC : process begin -- Insert testbench logic here wait
大多数 VHDL 仿真器将工具命令语言 (Tcl) 作为主要脚本接口。在仿真器控制台输入命令即是在使用 Tcl,也可编写脚本驱动和观测 VHDL 设计。 本文指导构建自检测试平台,用 Tcl 而非 VHDL 验证简单密码锁模块行为。结果是一个清晰、可维护的测试框架,无需重新编译 VHDL 即可运行、修改和复用。 延伸阅读: 为何你需要学习 Tcl 使用 Tcl 的交互式测试平台 下方下载代码和 ModelSim 工程文件。 DUT:VHDL 密码锁模块 深入测试平台前,先回顾被测设备 (DUT)。该模块模拟简单锁,在数字小键盘输入正确数字序列时打开保险箱。 虽常称「组合锁」,但正确术语是「
遥控 (RC) 舵机是模型飞机、车、船的核心。它们将遥控无线电指令转换为精确角度位置。由于 RC 系统已存在数十年,行业标准接口是脉宽调制 (PWM) 而非纯数字协议。凭借 FPGA 的确定性时序,实现高精度 PWM 易如反掌。本文演示一个通用 VHDL 舵机控制器,适用于任何使用 PWM 的 RC 舵机,含仿真测试平台和基于 Lattice iCEstick FPGA 板的实机实现。 RC 舵机 PWM 控制原理 PWM 基础另有介绍,RC 舵机略有不同。舵机忽略完整占空比,仅采样每个脉冲的高电平持续时间。标准脉冲间隔为 20 ms,对应 50 Hz 频率。在该 20 ms 窗口内,舵机读取
VHDL generate 语句允许设计者自动跨多个实例复制代码块,每个实例连接不同信号。可将其视为编译期 for 循环,能创建链式进程或模块实例,大幅减少样板代码并提升可维护性。 与仅限于进程或子程序的传统循环不同,generate 直接位于架构区域。结合泛型,它成为打造高度可配置、可复用 VHDL 组件的强大机制。 Generate 语句语法 [label :] for <constant_name> in <range> generate [declarations_local_to_each_loop_iteration] [begin] <process
VHDL 中的文本字符串通常局限于固定长度的字符数组。这在硬件描述层面合情合理,因为通用长度字符串需要动态内存。 要定义字符串数组,必须在编译时为最大字符串数量分配空间。更麻烦的是,必须预先决定字符串的最大长度,并将每个元素填充至该长度。下面代码展示了这种构造的典型用法: type arr_type is array (0 to 3) of string(1 to 10); signal arr : arr_type; begin arr(0) <= "Amsterdam "; arr(1) <= "Bangkok "; arr(2) &l
本教程将指导您使用 Xilinx Vivado 的 集成逻辑分析器 (ILA) 和 虚拟输入/输出 (VIO) 核对 VHDL 设计进行片上调试与监控。学完后,您将掌握如何插入探针、配置触发条件,并在无需外部设备的情况下精准捕获信号行为。 概述 文中将引用 Vivado 截图。点击图片可放大查看。 可使用侧边栏或移动端弹出导航快速跳转。 ILA 与 VIO ILA IP 可让您实时探测 FPGA 内部信号,而 VIO IP 则允许从 Vivado 驱动内部信号。两者均免费、高度可配置,并能无缝集成到 Vivado 工作流中。 Xilinx IP:集成逻辑分析器 (ILA) Xilinx IP
为安全关键FPGA应用设计VHDL,仅写测试平台远不够。工程师必须证明模块完全符合规范、无隐藏副作用。形式化验证提供这种数学级保证。 形式化验证通过证明所有可能输入序列均满足设计属性,弥合需求与实现鸿沟。它是医疗器械、航空电子等要求DO-254认证领域的必经之路。 本客座文章由资深形式化验证实践者Michael Finn Jørgensen撰写,分享实战洞见与可落地技巧。示例基于熟悉的AXI FIFO教程如何用就绪/有效握手在块RAM中实现AXI FIFO,演示如何对真实VHDL设计应用PSL。 什么是形式化验证? 形式化验证(FV)是综合前系统性方法,保证设计对所有输入组合正确。不同于依赖人
VUnit是领先的开源VHDL验证框架,融合Python测试套件运行器与专用VHDL库,自动化测试平台编译、执行、结果报告,助力工程师践行测试驱动开发。 本教程由VHDLwhiz作者Ahmadmunthar Zaklouta执笔,带你走完VUnit全流程——安装配置、创建测试平台、编写测试用例、ModelSim运行。含即拿即用的示例项目下载。 概览 侧边栏或移动端导航键可跳转章节。教程含截图供视觉参考。 前置条件 Intel ModelSim — 此处免费安装,加入系统PATH。 Python 3.6+ — 下载并加入PATH。 Git(可选)— 下载。 Windows Terminal(可
你是否想在VUnit验证框架中运行包含Quartus IP核的VHDL仿真? FPGA工程师Konstantinos Paraskevopoulos有此需求,却找不到合适教程。幸而他凭才华攻克并慷慨分享给VHDLwhiz,成就这篇客座文章。 有请Konstantinos! 在用VUnit仿真系统时,常需引入Quartus IP目录的预定义IP。本教程提供生成、合并、链接外部Quartus IP库至VUnit环境所需知识。 VUnit新手?查阅:VUnit入门教程 概览 教程含三主体: 所选IP简述 生成与链接库的步骤 利用VUnit与ModelSim验证 前置条件 Quartus 下载
VHDL中变量行为类似C变量:赋值后值即时可用,直至下次赋值才变。这使其成进程内临时存储与过程计算理想选择。 VHDL使用变量关键规则 变量局限于声明它的进程内。 每进程拥有自身变量集;不可跨进程共享。 在process关键字与begin关键字间声明变量。 赋值用:=算子。 一旦赋值,变量即刻持有新值供同进程后续语句使用。 最后一点——即时赋值——常是困惑源头。下方简例演示变量如何拼接两信号驱动case语句。 VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choic
数字设计师依赖FPGA/ASIC内精确算术。核心概念是VHDL中有符号与无符号数据类型区别。 两类型均定义于IEEE库numeric_std包。虽许多设计师仍用std_logic_arith,但该包非IEEE标准,不推荐生产设计使用。 VHDL中,有符号信号按二补数解释,允许正负值。无符号信号仅表示非负值。内部FPGA对所有位向量始终用二补数,无论声明类型。 位无符号值有符号值 01133 01022 00111 00000 1117-1 1106-2 1015-3 1004-4 乍看映射似反直觉,但理解二补数后行为可预测。 关键点:算术运算二进制结果相同,无论操作数声明有符号或无
VHDL