分步指南:构建你的第一个 FPGA LED 闪烁器 第一部分:设计 VHDL 或 Verilog 代码 本教程将教你编写 VHDL 和 Verilog 代码,以用户定义频率驱动 LED。根据工作流选择适合的语言。 编写 HDL 时必须验证设计行为是否符合预期。错误难免,因此仿真必不可少。教程分为两个关键阶段: HDL 设计 HDL 仿真 跳过仿真会导致昂贵的上板调试。请将仿真视为强制检查点。 项目需求 编写 HDL 使 LED 以 100 Hz、50 Hz、10 Hz 或 1 Hz、占空比 50% 闪烁。两个拨码开关选择频率,额外的 LED_EN 开关置高电平才启用 LED。FPGA 运行
本文展示一个VHDL模块,可在Digilent的Pmod SSD:七段显示器上显示两位数字。双7段显示兼容Pmod接口,无需焊接即可使用。它适配标准于许多FPGA开发板的Pmod连接器。 测试VHDL实现用Lattice iCEstick,一款带Pmod连接器的低成本FPGA开发板。除iCEstick外,需2×6针转双6针Pmod分线缆,将iCEstick并行Pmod连接器转为7段显示器期望的串联版插头。另外建议买USB Type-A延长线,因直接插iCEstick到电脑USB口不便。 7段显示器工作原理 市面7段显示器种类繁多。位数、物理接口、引脚排布各异。覆盖所有可能遇到的7段显示器的通用
* 本文含UpCloud VPS广告链接 持续交付与持续集成是敏捷软件开发方法论,缩短代码变更到部署的周期。通过自动化验证代码变更与构建发布文件,团队能更高效、富有成效。 软件公司长期实践持续开发,但FPGA项目同样适用。本教程教您在虚拟专用服务器(VPS)上使用Jenkins、Xilinx Vivado、Git/GitHub源代码管理(SCM)系统搭建自动化服务器。 什么是Jenkins? Jenkins自动化服务器是用Java编写的免费开源程序。可在Windows或Linux运行。本文使用Linux,因其是无头服务器最常用平台。Jenkins在Linux以守护进程、在Windows以服务运
如何在仿真波形中显示 VHDL 变量 ModelSim 默认不在 Objects 窗口显示变量,查看变量需额外步骤。 步骤 1:显示进程 右键点击要查看变量的设计单元,选择 Show → Processes,确保勾选。这会让设计层级下显示进程名(因此建议给进程加标签)。 步骤 2:启用局部变量视图 变量属于进程局部,不存在于进程外部。在 ModelSim 菜单栏 View 中勾选 Locals。 步骤 3:查看并添加变量到波形 点击目标进程,Locals 窗口将显示该进程内所有局部变量。将变量拖拽至波形窗口即可监控。 实用技巧:保存波形配置 若需重复运行同一仿真,可将波形窗口保存为 .
教程:ModelSim 仿真入门 ModelSim 是 Mentor Graphics(现属 Siemens EDA)推出的 VHDL/Verilog 仿真工具,是商业与教育领域最广泛使用的仿真软件。本教程先解释仿真的重要性,再演示如何免费获取 ModelSim 学生版。 为什么仿真至关重要 仿真是 FPGA/ASIC 设计流程的关键环节。它允许设计者施加激励信号,观察代码对各种输入场景的响应。完善的仿真能遍历设计的所有可能状态,确保每种输入组合都被正确处理。漏写 if 语句、case 语句未全覆盖等错误,不仿真极易遗漏。 获取与安装 ModelSim 学生版 访问官网下载安装包,按默认
教程:VHDL 简介 VHDL 是个拗口的缩写:VHSIC Hardware Description Language。其中 VHSIC 代表 Very High Speed Integrated Circuit。全称展开为:Very High Speed Integrated Circuit Hardware Description Language。VHDL 与 Verilog 是教育界与工业界设计 FPGA 与 ASIC 的两大主流语言,其硬件描述范式与 C、Java 等传统软件语言截然不同。 本例将创建一个描述与门的 VHDL 文件。与门有两个输入、一个输出,仅当两输入均为 1 时输
VHDL(VHSIC Hardware Description Language)是一种专用计算机语言,用于建模、设计和验证数字集成电路。不同于 Java 或 C++ 等通用编程语言,VHDL 不用于构建软件应用,而是描述电子硬件的结构和行为。 VHDL 事件驱动且支持并行执行,非常适合捕捉处理器或其他数字逻辑内部的并行操作。因此 VHDL 可用于指定最终成为 CPU、FPGA 或 ASIC 的逻辑。 访问基础 VHDL 教程系列! 观察上图。CPU 芯片内部,众多数字电路(中间部分)执行算术、控制和数据移动任务。这些电路通常用原理图(右侧)表示。但创建集成电路的第一步是用文本格式定义逻辑电
VHDL 和 FPGA 设计看似昂贵,但学生可零成本获取前沿工具。下面分步指南安装两大最受信任的 VHDL 工具——行业标准仿真器和轻量级免费编辑器,让你立即开始编码和测试。 1. 选择 VHDL 仿真器 Siemens EDA 的 ModelSim(前身 Mentor Graphics)仍是 VHDL 仿真行业基准。无论你准备首份职业角色还是原型验证,ModelSim(或其姊妹产品 QuestaSim)提供职场所需的广泛特性和兼容性。 商业许可虽贵,但 ModelSim 提供多种免费合法选项,含学生许可、社区版和学术包,支持 Windows、Linux 和 macOS。点此获取免费 VHDL
学习新语言时,打印简单消息是经典的完整性检查。掌握“Hello World!”输出能确认环境配置正确,并窥见语言核心语法。 VHDL 是硬件描述语言,而非传统软件语言,你可能好奇它如何显示文本。诀窍在于 VHDL 代码在仿真器中执行,仿真器能模拟数字电路并将诊断消息输出到屏幕。本教程专注于语言本身,不涉及 FPGA 或 ASIC 硬件。 本文属于基础 VHDL 教程系列。 把 VHDL 看作并行编程语言:你描述电路行为,仿真器在虚拟环境中运行该描述。在该环境中,你可轻松产生控制台输出,使“Hello World!”成为理想起点。 如何免费安装 VHDL 仿真器和编辑器 练习 此视频教程引导你创
上一教程将 VHDL 进程比作程序线程,介绍了无限挂起进程的 wait; 语句。但如果需要进程暂停特定时长该怎么办? 完全移除 wait; 会触发编译错误,因为每个 VHDL 进程都是无限循环,必须包含至少一条 wait 语句。循环在 begin 与 end process; 之间持续运行。 本文属于基础 VHDL 教程系列。 wait; 让执行永远停止,而 wait for 结构允许你按需延迟进程。 wait for 语法: wait for <time_value> <time_unit>; <time_value> 为数值字面量,<time_un
上一教程介绍了用 wait for 语句进行时序延迟并探讨了进程循环。现在聚焦于一个核心 VHDL 构造,它让你执行一次代码然后重复某块直到满足特定条件:loop 语句。 进程可无限运行,但你常需要受控循环并能优雅退出。VHDL 中的 loop 语句是此类结构的最简形式,仅在遇到 exit 时终止。 简单循环语法 loop -- statements end loop; 每个 exit 立即跳出其所在的最内层循环,可出现在任何循环类型中。 练习 本教程演示如何构建基本循环并在单次迭代后退出。 示例代码 entity T03_LoopTb is end entity; architect
上一教程探讨了如何用 loop 语句创建无限循环并用 exit 退出。若需循环固定次数怎么办?For 循环是最直接的解决方案。 For 循环遍历固定整数范围或枚举项。当前迭代值通过隐式声明的常量自动在循环内可用。 本文属于基础 VHDL 教程系列。 语法 for <constant> in <range> loop -- loop body end loop; <constant> 是用户定义的循环计数器名,<range> 可以是整数范围(升序或降序)或枚举值集合。 整数范围 升序范围:0 to 9 – 迭代 0,1,2,…,9。 降序范围:9
在早前探讨 for 循环的基础上,本教程深入 while 循环——一种基于动态条件而非预定范围控制迭代的强大结构。 while 循环只要指定条件保持 true 就反复执行循环体。这使其成为迭代次数取决于运行时数据或复杂逻辑场景的理想选择。 本文属于基础 VHDL 教程系列。 语法 while <condition> loop -- loop body end loop; <condition> 必求值为布尔值。可以是简单比较或更复杂的表达式。条件在每次迭代前检查,确保仅当其保持 true 时继续循环。 条件示例 i < 10 – 当 i 小于 10 时为真。 i
测试你的 VHDL 基础知识 – 互动测验第 1 部分 恭喜完成基础 VHDL 教程系列第一章!通过这个测验检验你的掌握程度。每道题旨在强化关键概念,帮助你评估成为 VHDL 专家的进度。 1. 这个进程有什么错误? 不包含 Wait 语句 process is 后缺少分号 进程没有输入 - 继续 >> 2. i 的值将被打印多少次? 无限次 零次 一次 - 继续 >> 3. 这个进程将打印多少次 Haha!? 总是 10 次 总是 11 次 取决于仿真时长 - 继续 >> 4. 在这个进程中使用 exit
上一教程探讨了如何在进程内声明变量。变量适合局部算法工作,但无法在进程外被看到。当需要与其他设计部分共享值时,应使用信号。 信号声明在架构的声明区域——即 architecture <architecture_name> of <entity_name> is 与 begin 关键字之间。 本文属于基础 VHDL 教程系列。 声明信号的语法:signal <name> : <type>; 信号可选带初始值:signal <name> : <type> := <initial_value>; 练习 本视频教程教你
上一教程探讨了 VHDL 中信号与变量的区别,强调信号作用域比变量大(变量局限于单个进程)。下一个合乎逻辑的问题是如何利用信号协调多个进程。 除了熟悉的 wait;(无限暂停)和 wait for(基于时间的暂停),VHDL 还提供两个强大的事件驱动同步语句:Wait On 和 Wait Until。它们也可与 wait for 组合,创建复杂的控制流。 Wait On wait on 语句挂起进程,直到列表中任一信号值发生变化。 wait on <signal_name1>, <signal_name2>, ...; Wait Until wait until 语句暂
上一教程我们用条件表达式配合 Wait Until 语句,仅在两个计数器信号匹配时触发进程。若需根据不同输入采取不同动作该如何处理? If-Then-Elsif-Else 结构让我们能分支逻辑。根据变量值或表达式结果,程序可遵循不同路径执行。 本文属于基础 VHDL 教程系列。 基本语法 标准形式: if <condition> then elsif <condition> then else end if; elsif 和 else 子句可选,elsif 可多次出现。<condition> 可以是布尔字面量或求值为 true/false 的表达式。 示例:
在生产级 VHDL 中,进程通常由敏感度列表驱动,而非 wait 语句。敏感度列表枚举了所有应在发生变化时唤醒进程的信号。 虽然 wait on 和 wait until 便于仿真,但很少用于可综合的 RTL。在综合中,wait 语句常被忽略,导致不可预测的硬件行为。相反,敏感度列表直接映射到组合逻辑或时序同步块,综合工具能可靠地实现它们。 基础 VHDL 教程 – 进程敏感度 编写仿真代码时,我总依赖 wait 语句控制时序。但对于将综合成硅片的设计,我完全避免使用 wait,改用敏感度列表。 带敏感度列表的进程语法如下: process( signal1, signal2, ... )
在VHDL中,std_logic类型是表示物理线上单比特的基石。不同于早期教程用的简单integer类型,std_logic提供更丰富的值集,更准确建模真实数字信号行为。 数字引脚通常只有逻辑高(1)或逻辑低(0),但物理信号也可能呈高阻态、弱态或未定义状态。std_logic类型捕获所有这些可能性,使其成为VHDL设计中最常用类型。 本文属基础VHDL教程系列。 std_logic信号可取的完整值列表: 1逻辑1 0逻辑0 Z高阻抗 W弱信号;不定0或1 L弱0(下拉) H弱1(上拉) -不关心 U未初始化 X未知(多驱动器) 多数教程聚焦主要值1和0,偶尔用U和X突显设计错误。其余
std_logic_vector类型是VHDL定义信号总线的标准。std_logic建模单根线状态,std_logic_vector将其扩展为线阵列,实现多位总线表示。 与单比特std_logic不同,std_logic_vector是复合类型——std_logic元素的索引集合。可容纳任意位数,适合连接交换多位数据的组件。 本文属基础VHDL教程系列。 声明std_logic_vector信号语法:signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;或signa
VHDL