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中记录提供强大方式精简设计,堪比C语言结构体。将相关信号分组为单一类型,能大幅减少代码重复、提升可读性、简化跨多实体的端口映射。 记录在处理大型反复接口时大放异彩——如连接片外存储器或FIFO——同组控制与数据信号反复出现。在包中一次定义记录类型并到处复用,保持实体接口整洁,便于后续修改。 以下示例演示如何在专用包(example_record_pkg.vhd)创建两记录类型,建模FIFO输入输出信号。单一记录信号代表FIFO所有输入,另一代表所有输出。 核心收获: 记录简化VHDL实体声明与端口映射。 可容纳不同类型元素——std_logic、integer、std_logic_v
什么是VHDL过程? 过程属于VHDL子程序家族。封装可复用逻辑,减少代码重复,提升可维护性。一次定义,可从多进程或架构调用,保证行为一致。 示例:std_logic_vector自增1 以下示例演示过程接收8位std_logic_vector,加1返回结果。过程含1ns等待以说明测试平台内时序控制。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity example_procedure_simple is end example_procedure_simple; architecture
同时使用Numeric_Std与Std_Logic_Arith包文件 下文汇总最常用VHDL类型转换。分两节:首节展示依赖现代numeric_std包的转换,次节演示等效遗留std_logic_arith包转换。虽许多设计师仍用std_logic_arith,行业最佳实践推荐numeric_std以获清晰度与可移植性。 注意许多示例用VHDL属性length,确保代码自动适配向量宽度变化——可复用可维护设计关键策略。 Numeric_Std包转换示例 整数转有符号数 整数转Std_Logic_Vector 整数转无符号数 Std_Logic_Vector转整数 Std_Logic_Vect
简介 欢迎来到实战指南,带您在FPGA上用VHDL或Verilog创建简单LED闪烁器。例程演示核心FPGA概念:并发进程、频率合成、多路复用器逻辑——均由25MHz时钟驱动。 项目概览 生成四种可选闪烁频率:100Hz、50Hz、10Hz、1Hz。 各频率保持50%占空比。 LED_EN开关置位时才启用LED。 通过两独立开关选择所需频率。 部署硬件前必须仿真,尽早发现错误。 频率选择真值表 使能开关1开关2LED驱动频率 0--(禁用) 100100Hz 10150Hz 11010Hz 1111Hz 信号定义 信号名方向描述 i_clock输入25MHz系统时钟 i_enable
使用VHDL Process或Verilog Always块 VHDL中Process块与Verilog中Always块是描述硬件行为的核心构造。用于建模两类逻辑: 组合逻辑——输出仅依赖当前输入。 时序逻辑——输出依赖当前输入与过往状态,通常由时钟驱动。 教科书多演示简单组合示例,但实际设计几乎全靠时序块实现寄存器、状态机、流水线级。 为何D触发器关键 每个时序电路核心是D触发器,在时钟沿捕获存储单比特数据的最小元件。理解其时序与建立/保持约束是深入高级HDL代码前提。 不熟悉D触发器基础的读者请先复习基本操作。 Process/Always块中的组合逻辑 虽可用Process或Alw
VHDL,即超高速集成电路硬件描述语言,是设计FPGA和ASIC的两大主流硬件描述语言之一。虽较软件语言显冗长,但语法精确,旨在极高抽象层级描述数字逻辑。 深入VHDL代码前,了解其使用语境有助。FPGA(现场可编程门阵列)与ASIC(专用集成电路)是现代数字系统基石,从消费电子到航空航天应用。VHDL与Verilog提供文本方式描述电路行为与结构。 本教程将演练用VHDL创建简单与门。与门接受两个二进制输入,仅当两输入均高时输出高。 定义信号与操作 VHDL核心概念是信号,代表可持值的导线或存储元件。信号可用std_logic类型声明,这是二进制信号最常用类型。声明与门操作最小示例: si
VHDL