尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
第 2 章 Verilog HDL 开发环境搭建【轻量化开发环境】
2.1 Icarus Verilog 安装Icarus Verilog 是Verilog 编译仿真工具提供iverilog编译命令和vvp仿真命令添加环境变量必须勾选 Add executable directories to the user PATH官方网址https://bleyer.org/icarus/打开 cmd 终端 输入以下命令若能正常输出版本信息说明环境配置成功iverilog-v# 验证 Icarus Verilog 安装gtkwave-v# 验证 GTKWave 安装若提示“不是内部或外部命令”手动添加环境变量右键“此电脑”→属性→高级系统设置→环境变量→用户变量→PATH→编辑→添加Icarus Verilog 安装路径例如D:\FPGA_Tools\Icarus\bin重启CMD后重试即可2.1.1 Icarus Verilog 编译和仿真命令在 CMD 终端 执行以下命令# 编译iverilog 设计块文件 激励块文件# 仿真vvp 仿真文件# 查看波形图gtkwave 波形图文件2.2 Verilog 案例设计块激励块分离版【了解即可用于体验开发流程】2.2.1 Icarus Verilog 仿真流程Icarus Verilog 仿真需要二步 iverilog编译→ vvp执行Vivado 仿真需要三步 xvlog编译→ xelab链接→ xsim执行2.2.2 仿真文件仿真文件是编译「设计块激励块」后生成的、可执行文件——它整合了设计块的逻辑和激励块的测试驱动逻辑仿真文件仅用于仿真和 FPGA 烧录的网表文件、芯片综合文件无关唯一作用是运行仿真、生成波形设计块Verilog 里描述具体硬件功能如加法器、计数器的模块有输入输出端口是要被验证的核心对象。激励块TestbenchVerilog 里专门测试设计块的仿真模块无输入输出端口负责给设计块送测试信号、看输出结果。仿真文件的生成条件缺一不可必须同时输入「设计块激励块」仅设计块无法生成有效仿真文件必须指定**「顶层模块」**作为仿真的“入口”2.2.3 目录文件结构Verilog_Counter/ ├─ seq_0101.v // 设计块纯硬件逻辑 └─ tb_seq_0101.v // 激励块纯仿真逻辑2.2.4 设计块文件seq_0101.v带保护仅包含硬件可实现的逻辑无任何仿真专用语句可直接用于FPGA综合设计块保护SEQ_0101_V 防止 seq_0101 模块被重复定义// 防止seq_0101模块被重复定义 ifndef SEQ_0101_V // 检查SEQ_0101_V是否未定义 define SEQ_0101_V // 第一次包含时定义该标识符 timescale 1ns/1ps // 时序基准与激励块统一 module seq_0101( input clk, // 系统时钟5ns周期 input rst_n, // 低电平有效同步复位 output seq_out // 0101...交替序列输出 ); // 寄存器赋初始值避免仿真初始x reg seq_reg 1b0; // 时序逻辑逐时钟翻转持续输出0101... always (posedge clk) begin if(!rst_n) begin seq_reg 1b0; // 复位回到初始值0 end else begin seq_reg ~seq_reg; // 每时钟翻转0→1→0→1... end end // 序列输出赋值 assign seq_out seq_reg; endmodule endif // SEQ_0101_V 保护块结束2.2.5 激励块文件tb_seq_0101.v带保护 包含设计块仅包含仿真逻辑负责给设计块送测试信号、控制台输出、生成波形图无硬件逻辑激励块保护TB_SEQ_0101_V 防止激励模块被重复定义// 防止tb_seq_0101模块被重复定义 ifndef TB_SEQ_0101_V // 检查TB_SEQ_0101_V是否未定义 define TB_SEQ_0101_V // 第一次包含时定义该标识符 // 包含设计块即使多次包含seq_0101.v的保护块会避免重复 include ./seq_0101.v timescale 1ns/1ps module tb_seq_0101; // 1. 激励信号定义 reg clk 1b0; reg rst_n 1b0; wire seq_out; // 2. 例化设计块 seq_0101 u_seq_0101( .clk (clk), .rst_n (rst_n), .seq_out (seq_out) ); // 3. 生成时钟5ns翻转10ns周期 always #5 clk ~clk; // 4. 仿真逻辑 initial begin // 波形文件生成 $dumpfile(tb_seq_0101.vcd); $dumpvars(0, tb_seq_0101); // 保存所有层级信号 // 控制台输出ps单位时间准确 $monitor(Time%0t ps: seq_out%b, $time, seq_out); // 激励流程复位20ns → 持续输出0101... rst_n 1b0; #20; // 复位20ns20000ps rst_n 1b1; #180; // 运行180ns总200ns200000ps $finish; end endmodule endif // TB_SEQ_0101_V 保护块结束设计块 seq_0101.v 和激励块 tb_seq_0101.v 都加上 ifndef 条件编译保护彻底避免 “重复包含 / 重复定义” 错误同时保持代码可复用性设计块保护标识符SEQ_0101_V模块名 _V大写避免和变量重名激励块保护标识符TB_SEQ_0101_V激励模块名 _V保护块标识符要唯一不同模块用不同的标识符避免冲突保护块的作用范围seq_0101.v保护整个 seq_0101 模块即使被多次 include也只会编译一次tb_seq_0101.v保护整个激励模块同时包含设计块时设计块的保护块会自动防止重复定义。2.2.6 编译# 方式 1编译时指定两个文件# 1. 编译编译通过后会生成仿真文件 tb_seq_0101.outiverilog-Wall-otb_seq_0101.out seq_0101.v tb_seq_0101.v# -o 指定仿真文件名 默认a.out# -Wall 开启所有警告# seq_0101.v 设计块文件# tb_seq_0101.v 仿真块文件# 方式 2只编译激励文件靠 include 包含设计块iverilog-Wall-otb_seq_0101.out tb_seq_0101.v# 两种编译方式 都不会报 “重复定义” 错误且仿真结果完全一致2.2.7 运行仿真# 2. 运行仿真控制台输出持续的01交替vvp tb_seq_0101.out2.2.8 查看波形图# 3. 打开波形图查看规整的01交替方波gtkwave tb_seq_0101.vcdGTKWave 必加信号打开.vcd文件后默认不会显示任何信号必须手动选中并添加到 WaveView添加信号查看波形图clk规整的 5ns 周期方波作为时间基准。rst_n前 20ns 保持低电平复位之后变为高电平释放复位。seq_out复位期间恒为 0复位释放后开始严格的 0→1→0→1 交替翻转完全符合我们想要的持续 010101… 输出效果这说明你的 Verilog 代码和仿真流程已经完全跑通了
RELATED

相关推荐

如何用一行代码获取2000+金融数据源?AKShare免费财经数据接口库完全指南

如何用一行代码获取2000+金融数据源?AKShare免费财经数据接口库完全指南

如何用一行代码获取2000金融数据源?AKShare免费财经数据接口库完全指南 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/g…

📅 2026/10/8 0:23:11
解决Windows安装OpenClaw错误1006的完整指南

解决Windows安装OpenClaw错误1006的完整指南

1. 问题现象与初步诊断 最近在Windows系统上安装OpenClaw时遇到一个棘手问题:安装过程中突然弹出"错误代码1006 - 未知错误"的提示框,导致整个安装流程中断。这个问题看似简单,但实际上可能涉及多个层面的因素。 从技术角度来看&a…

📅 2026/10/6 10:39:53
离散型与流程型制造排程差异及优化策略

离散型与流程型制造排程差异及优化策略

1. 离散型制造与流程型制造的本质差异在制造业摸爬滚打十几年,我发现很多同行对"离散型"和"流程型"制造的理解还停留在表面。这两种生产模式在排程逻辑、工位设计和工序管理上存在根本性差异,直接套用同一种方法论会导致排产系统水土…

📅 2026/9/25 17:07:38
MORE NEWS

更多资讯

📰

鸿蒙录音实时转文字:音频流采集与流式语音识别实战

做鸿蒙开发的朋友,凡是从“录音”功能开始折腾项目的,大概都有过这种体验:调用麦克风不难,把录音存成文件也不难,真正难的是让录音“长了脑子”——一边录音一边把声音变成看得见的文字。这次分享的案例,就…

📰

Strassen矩阵乘法:Python实现、分治优化与性能分析

Strassen 这个名字,大多数接触过算法的人都不陌生:用分治把矩阵乘法的复杂度从 (O(n^3)) 压到 (O(n^{\log_2 7}))。(\log_2 7 \approx 2.807),意思是矩阵规模翻倍时,朴素算法的工作量变成 8 倍,Strassen 只变成约 7 倍…

📰

论文格式总错?AI写作工具用“样式驱动”重构目录与参考文献

先说个我常碰到的画面:论文内容改到第十版,交稿前一晚发现目录页码和正文对不上,三级标题全部是手动敲的编号,删掉中间一段之后,后面的序号全军覆没。这几乎是每个被论文格式虐待过的人都经历过的崩溃。以前我总把这类…

📰

宝塔面板安装教程:从零搭建LNMP环境与安全配置

刚接触服务器的人,十个有九个都卡在环境配置这一关。命令行窗口里敲apt-get、yum、编译安装,光是装一个LNMP环境就能折腾一晚上,更别说后面还要配数据库、配伪静态、拉SSL证书。宝塔面板的存在,就是把这一堆事变成可视化点击操作&…

📰

QC 2.0 快速充电接口控制器D1531

一、产品简介1.1 产品概述D1531 是一款基于 Quick Charge 2.0(QC 2.0) 快速充电协议的接口控制器IC。该芯片可自动识别充电设备类型,通过与设备握手协商,使充电设备获得其允许的安全最大功率,在充分保护充电设备的前提…

📰

Activiti运行表ACT_RU_VARIABLE深度解析:变量作用域与存储机制

如果你接手过Activiti工作流项目,一定有过这样的经历:在某个节点用delegateExecution.setVariable("orderId", "xxx")存了一个变量,结果到下一个节点getVariable取出来是null,翻遍日志看不出原因,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬