安路TD 5.6.2 + Vivado 联合仿真:流水灯Verilog代码3步验证与波形分析

FPGA安路科技Vivado联合仿真
于 2026-07-07 10:05:32 修改
·本内容遵循CC 4.0 BY-SA版权协议

安路TD与Vivado联合仿真实战:流水灯设计与波形解析全流程

在FPGA开发领域,工具链的选择往往直接影响开发效率和验证质量。对于习惯使用Vivado的开发者而言,当面对安路TD开发环境时,如何实现工程的无缝迁移和高效验证成为关键问题。本文将深入探讨安路TD 5.6.2与Vivado的联合仿真方案,通过流水灯案例演示从工程转换到波形分析的全过程。

1. 环境准备与工程转换

安路TD作为国产FPGA的代表性开发工具,其工程结构与Xilinx Vivado存在显著差异。实现联合仿真的第一步是建立工程转换的桥梁。

必备工具清单

  • 安路TD 5.6.2(需确保已正确安装驱动)
  • Vivado 2021.1或更高版本
  • EG4S20BG256开发板支持包
  • Python 3.6+(用于辅助脚本处理)

工程转换的核心在于文件格式的适配。安路TD生成的Verilog代码通常可直接用于Vivado,但需要特别注意以下转换要点:

  1. 时钟约束转换

    TCL
    # 安路TD原始约束
    create_clock -name sys_clk -period 20 [get_ports clk]
     
    # Vivado等效约束
    create_clock -period 20.000 -name sys_clk [get_ports clk]
    set_property IOSTANDARD LVCMOS33 [get_ports clk]
  2. IP核兼容性处理: 安路特有的IP核需在Vivado中寻找功能等效替代,或手动实例化相应模块。例如PLL配置参数需重新计算:

    安路TD参数 Vivado等效参数
    CLKIN_FREQ INPUT_FREQ
    CLKOUT_DIV CLKOUT1_DIVIDE
    CLKFB_MULT CLKFBOUT_MULT
  3. 测试平台适配: 原始testbench需添加Vivado仿真专用指令:

    VERILOG
    `timescale 1ns/1ps
    module tb_led();
    // 添加Vivado波形导出指令
    initial begin
    $dumpfile("wave.vcd");
    $dumpvars(0, tb_led);
    end
    // 原有测试逻辑...
    endmodule

提示:建议在TD中导出网表文件时选择"Verilog Netlist"格式,并保留所有层次结构信息。转换后的工程建议存放在独立目录,避免路径中包含中文或特殊字符。

2. Vivado测试平台搭建

在Vivado中重建测试环境是验证流程的核心环节。针对250ms流水灯设计,我们需要构建能准确反映时序特性的测试场景。

测试平台构建步骤

  1. 创建仿真源文件

    VERILOG
    `timescale 1ns/1ps
    module tb_led();
    reg clk;
    reg rst_n;
    wire [7:0] led;
    // 时钟生成(25MHz)
    initial clk = 0;
    always #20 clk = ~clk;
    // 复位控制
    initial begin
    rst_n = 0;
    #100 rst_n = 1;
    #50000000 $finish; // 仿真50ms
    end
    // 实例化被测设计
    led_test uut (
    .clk(clk),
    .rst_n(rst_n),
    .led(led)
    );
    // 波形记录
    initial begin
    $timeformat(-9, 2, "ns", 20);
    $monitor("At %t: led = %b", $time, led);
    end
    endmodule
  2. 仿真参数配置: 在Vivado中需特别设置仿真选项:

    TCL
    set_property -name {xsim.simulate.runtime} -value {100ms} -objects [get_filesets sim_1]
    set_property -name {xsim.simulate.log_all_signals} -value {true} -objects [get_filesets sim_1]
  3. 调试信号分组: 使用Vivado的波形配置文件(.wcfg)组织关键信号:

    XML
    <waveformconfig>
    <group name="Control">
    <signal name="/tb_led/clk"/>
    <signal name="/tb_led/rst_n"/>
    </group>
    <group name="LED Output">
    <signal name="/tb_led/led[7:0]"/>
    </group>
    <group name="Counters">
    <signal name="/tb_led/uut/cnt_250ms[23:0]"/>
    </group>
    </waveformconfig>

常见问题解决方案

  • 时钟域不匹配:若出现时序违例,可添加跨时钟域约束:

    TCL
    set_false_path -from [get_clocks sys_clk] -to [get_clocks vio_clk]
  • 初始化冲突:在仿真脚本中添加全局复位:

    TCL
    set_property -name {xsim.simulate.xsim.more_options} -value {-g.force_reset=1} -objects [get_filesets sim_1]

3. 流水灯代码深度解析

理解核心代码逻辑是有效验证的基础。下面拆解250ms流水灯的Verilog实现关键点。

核心算法实现

VERILOG
module led_test(
input clk, // 25MHz时钟
input rst_n, // 低有效复位
output reg [7:0] led
);
// 250ms计数器(25MHz时钟下需计数6,250,000次)
reg [23:0] cnt_250ms;
parameter TIME_250ms = 24'd6_250_000;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt_250ms <= 0;
else if (cnt_250ms == TIME_250ms - 1)
cnt_250ms <= 0;
else
cnt_250ms <= cnt_250ms + 1;
end
// LED状态机
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
led <= 8'b0000_0000;
else if (cnt_250ms == TIME_250ms - 1)
case(led)
8'b0000_0000: led <= 8'b1111_1110;
8'b1111_1110: led <= 8'b1111_1101;
// ...其余状态转换
default: led <= 8'b0000_0000;
endcase
end
endmodule

时序优化技巧

  1. 计数器位宽优化

    VERILOG
    // 使用参数化设计便于修改
    parameter CLK_FREQ = 25_000_000; // 25MHz
    parameter DELAY_MS = 250; // 250ms
    localparam COUNT_MAX = CLK_FREQ * DELAY_MS / 1000 - 1;
  2. 状态编码优化

    VERILOG
    // 使用移位寄存器实现更简洁的状态转换
    always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
    led <= 8'b1111_1110;
    else if (cnt_250ms == TIME_250ms - 1)
    led <= {led[6:0], led[7]};
    end
  3. 功耗优化

    VERILOG
    // 添加时钟门控
    wire sample_en = (cnt_250ms == TIME_250ms - 1);
    always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
    led <= 8'b0000_0000;
    else if (sample_en)
    led <= next_led;
    end

4. 波形分析与调试技巧

在Vivado中获取仿真波形后,需要专业的方法解读时序关系。以下是针对流水灯设计的分析要点。

关键波形检查点

  1. 复位释放时序

    • 确认rst_n信号从低到高跳变后,cnt_250ms是否立即开始计数
    • 检查led输出是否在复位后初始化为全0
  2. 250ms计时验证

    VERILOG
    // 计算实际时间差
    measure_time = ($time - last_transition) / 1_000_000.0;
    assert(measure_time >= 249.5 && measure_time <= 250.5);
  3. LED状态转移: 使用波形窗口的"Radix"功能将led信号显示为二进制,观察是否按以下顺序循环:

    TEXT
    11111110 → 11111101 → 11111011 → ... → 01111111 → 11111110

高级调试方法

  1. 条件触发设置

    TCL
    # 在led发生变化时暂停仿真
    when {/tb_led/led[7:0]'event} {
    puts "LED changed at [current_time]"
    stop
    }
  2. 性能计数器插入

    VERILOG
    // 在testbench中添加性能监测
    realtime period;
    always @(posedge led[0]) begin
    period = $realtime - last_edge;
    last_edge = $realtime;
    $display("LED0 period: %0.3fms", period/1_000_000.0);
    end
  3. 自动化验证脚本

    PYTHON
    # 使用Python分析VCD波形文件
    import vcd
    with open('wave.vcd') as f:
    v = vcd.VCDReader(f)
    led_changes = [ts for ts, val in v['/tb_led/led'] if val.changed]
    periods = [j-i for i,j in zip(led_changes[:-1], led_changes[1:])]
    avg_period = sum(periods)/len(periods)/1e6 # 转换为ms
    assert 249 < avg_period < 251, "Timing violation"

时序违例处理方案

问题现象 可能原因 解决方案
LED变化间隔不稳定 计数器溢出处理错误 检查TIME_250ms常量计算
复位后LED不亮 复位极性错误 确认rst_n与硬件连接一致
仿真时间过长 实际250ms仿真不现实 修改测试参数为缩短版本

通过这套完整的验证流程,开发者可以确保安路TD设计的可靠性,同时充分利用Vivado强大的仿真能力。在实际项目中,建议建立自动化验证流程,将上述步骤集成到持续集成环境中。

安路科技FPGA实战】从零搭建开发环境到流水灯仿真TD软件+Vivado
本文详解基于安路EG4S20BG256开发板的FPGA开发全流程涵盖TD软件与Vivado协同环境搭建、Verilog流水灯模块设计(含计数器时序控制)、Testbench编写及波形仿真验证、引脚约束配置、综合实现比特流生成,最终完成硬件下载LED动态演示。重点突出国产FPGA工具链实操要点硬件描述语言关键规范。
491
基于TD与Modelsim的FPGA功能仿真实战指南
本文详解安路FPGA开发中TD工具Modelsim协同进行功能仿真的完整流程涵盖TD端RTL/门级/布线级仿真模型配置、SDF延时文件生成,Modelsim中安路仿真库(EF2/EF3系列)的编译映射,工程构建、测试平台集成及波形调试。强调环境路径规范、库版本匹配、SDF反标要点等关键技术实践。
键盘侠预备役979
842
国产FPGA开发利器:TD+Modelsim联合仿真全流程指南(附EF2芯片配置)
本文详解国产FPGA开发中安路TD软件Modelsim联合功能仿真的全流程,涵盖环境配置、TD仿真模型生成(RTL/门级/布线后)、Modelsim仿真库编译(EF2系列芯片专用)、工程搭建及调试排错。重点突出芯片型号匹配、SDF时序反标、库路径映射等关键技术点,适用于EF2系列FPGA的Verilog设计验证
lau.ray
309
避坑指南:安路TD+ModelSim联合仿真时信号被优化的3种解决方法
本文聚焦安路PH1系列FPGAModelSim联合仿真中中间信号被优化导致波形缺失的问题,剖析常量传播、死代码消除等仿真级优化机制,并系统提出三种关键技术方案关闭ModelSim全局优化、在RTL中添加keep/translate_off仿真属性、修改vsim/vlog编译参数(-novopt/-access +rwc)及安路仿真库专项编译。强调仿真优化综合优化相互独立,需针对性干预。
史图馆
231
基于FPGA的DDS在安路TD和EG4A20BG256上的实现从环境搭建到波形生成
本文详细介绍了基于安路EG4A20BG256 FPGA芯片和TangDynasty(TD)开发工具实现直接数字频率合成(DDS)的全流程,涵盖TD环境搭建、License驱动配置、DDS Verilog模块设计(含相位累加器BRAM波形ROM)、引脚约束(XDC)、资源优化(流水线/相位截断处理)、动态频率控制及上板验证(ILA+示波器观测)。重点突出国产FPGA平台下DDS工程化落地的关键技术要点。
初恋是一滩水Null
927
安路TangDynasty联合Modelsim仿真避坑指南从库文件配置到波形调试的完整流程
本文系统梳理安路TangDynastyModelsim联合仿真的关键实践问题,涵盖仿真库编译失败排查、glbl模块缺失处理、Load Design Error分析波形调试优化及脚本错误修正等核心环节。重点解决库路径配置、文件编码、环境变量冲突、信号分组自动化触发等典型技术障碍,适用于EF3安路FPGA器件的RTL/门级仿真流程。
weixin_30644369
374
[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-01 软件工具环境搭建
本教程适用于安路FPGA,介绍了开发环境搭建。包括代码编辑VSCode工具安装,安路TD、FD开发工具软件下载安装,安装license及设置第三方编辑工具;还讲解了下载器JTAG驱动安装、TD相关设置,最后进行下载器芯片识别和bit文件下载测试。
米联客(milianke)
2846
基于FPGA的DDS在安路TD和EG4A20BG256上的实现(序)
本文介绍了使用上海安路科技的FPGA实现直接数字频率合成器(DDS)的过程。DDS因其高分辨率、相位连续性好等优点,在通信等领域广泛应用。通过Verilog语言编程,在安路TD环境下完成了DDS的设计实物测试,成功产生多种波形
荔内内
2187
Verilog仿真避坑实录:TD生成TestbenchModelsim联调的那些坑
本文聚焦于安路TD工具生成Testbench并Modelsim联调的功能仿真实践,详细解析仿真环境搭建、芯片专用仿真库移植、Testbench常见陷阱(初始值、时钟、路径)、典型错误排查流程及脚本优化方案。重点涵盖undefined module错误根因、库编译映射、复位时序协同、信号X态诊断等关键技术点,面向FPGA数字电路功能验证场景。
506
安路TD开发环境搭建EG4A20BG256开发板DDS实现指南
本文详细介绍了基于安路TD工具链在EG4A20BG256 FPGA开发板上实现DDS(直接数字频率合成)的完整流程,涵盖TD开发环境搭建(软件安装、License配置、USB-JTAG驱动)、工程创建约束设置、DDS原理及Verilog实现、波形表生成方法,并提供了调试技巧针对EG4系列的性能优化策略,重点突出FPGA资源利用时序收敛实践。
巴尔莫斯
435
EG4A20BG256开发板实战手把手教你用安路TD软件实现DDS信号发生器(含完整驱动安装烧录教程)
本文基于安路EG4A20BG256 FPGA开发板,使用TangDynasty(TD)软件全流程实现高精度DDS信号发生器。涵盖TD环境部署、驱动License配置、Modelsim联合仿真、32位相位累加器192×7 ROM波形查表的Verilog设计、管脚时钟约束、比特流生成及JTAG烧录,并通过示波器完成硬件验证与典型故障排查。
218
安路TD软件实战:5步搞定EG4A20BG256上的DDS信号发生器(附波形生成技巧)
本文详解如何在安路EG4A20BG256 FPGA上,基于TangDynasty(TD)软件实现多波形DDS信号发生器。涵盖工程创建、ROM IP核部署、.mif波形数据自动化生成(Python脚本)、32位相位累加器Verilog设计、管脚约束DAC硬件连接、综合实现及上板调试全流程。强调实操导向,规避理论冗余,突出国产FPGA平台下的快速落地能力。
195
[米联派-安路飞龙DR1-FPSOC] FPGA基础篇连载-01 软件工具环境搭建
本教程适用于安路FPGA开发,介绍了在WIN10 64bit系统下的开发工具安装。包括代码编辑工具vscode、安路TD开发工具、FD软件的下载安装,安路下载器JTAG驱动安装,以及TD软件不同调试模式设置,最后进行下载器芯片识别和bit文件下载测试。
米联客(milianke)
1930
基于FPGA的DDS信号发生器在安路TD与EG4A20BG256上的多波形切换实现
本文基于安路EG4A20BG256 FPGATangDynasty开发环境,实现支持正弦波、方波、三角波和锯齿波四波形切换的DDS信号发生器。采用12位精度、4096点波形ROM,结合32位相位累加器多路选择逻辑,实现纳秒级波形切换及100Hz–100kHz频率跳变。详细涵盖MIF波形生成、ROM IP核构建、Verilog DDS核心设计、管脚约束实测验证全过程。
秉烛叶谈
106
[米联派-安路飞龙DR1-FPSOC] FPGA基础篇连载-04 安路TD开发工具在线调试FPGA
本文基于Anlogic -TD5.9.1-DR1_ES1.1软件、WIN10 64bit系统和安路FPGA,介绍添加ChipWatcher在线逻辑分析仪的方法。包括新建IP核、添加观察信号、设置触发条件等步骤,还说明了在线调试和修改已有watcher的操作,可在线监测电路内部信号变化。
米联客(milianke)
1624
[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-04 安路TD开发工具在线调试FPGA
本教程适用于安路FPGA,使用米联客开发板。介绍添加Chipwatcher在线逻辑分析仪,实现在线监测电路内部信号变化。包括新建Chipwatcher IP核、添加观察信号、设置触发条件和采样时钟等步骤,还说明了在线调试及修改已存在watcher的方法。
米联客(milianke)
1745
国产安路FPGA逻辑分析仪ChipWatcher实战从创建到触发抓取全流程解析
本文详解国产安路FPGA配套工具ChipWatcher的全流程应用Verilog信号防优化标记、TD软件中创建调试核、配置采样时钟深度、添加观测信号,到JTAG下载后设置边沿/组合触发、执行单次抓取及波形分析。重点涵盖预触发机制、多条件触发、存储深度时钟权衡、跨时钟域信号捕获技巧,以及常见X态、资源溢出等典型问题规避方法。
燕麦麦
260
[米联客-安路-EG4D] FPGA基础篇连载-04安路TD开发工具在线调试FPGA
本文介绍在安路FPGA中添加ChipWatcher在线逻辑分析仪进行调试的方法。先完成FPGA工程编译,接着新建ChipWatcher IP核、添加观察信号、设置触发条件、采样时钟、采样深度和触发位置。创建成功后重新编译工程,进行在线调试,还可修改已有的watcher。
米联客(milianke)
3444
基于FPGA的DDS波形发生器Verilog实现ModelSim仿真
本文详细阐述基于FPGA的DDS波形发生器设计与验证全流程涵盖DDS核心原理(相位累加器+波形查找表)、Verilog模块化实现(支持正弦/方波/三角波/锯齿波)、Quartus工程构建引脚约束、ModelSim testbench编写及波形分析技巧,并给出资源优化(如四分之一波对称查表、流水线加速)和常见问题(相位截断误差、时序违例)的解决方案。
838
国产FPGA开发踩坑记:安路TD工具链下,如何用Verilog模块将标准FIFO“魔改”成FWFT模式
本文针对安路TD工具链缺乏原生FWFT FIFO支持的问题,提出基于Verilog的转换模块设计方案。通过三段式状态机预测数据有效窗口,适配标准FIFO的read latency特性,实现零延迟读取。详细阐述接口定义、状态机设计、IP核配置要点、分层验证方法及时序优化技巧,确保在EG4系列FPGA上达成Xilinx/Intel平台兼容的FWFT行为。
AnFat
235
流水灯波形仿真结果一直为零,为何?
m0_onjun
FPGA状态机实战流水灯到可乐机,3种编码方式全解析(附避坑指南)
Lebron Q
Verilog HDL快速上手指南7天掌握嵌入式工程师必备的硬件描述语言技能
SW_孙维
【Xilinx ISE从入门到精通】掌握10大核心流程IP核实战秘籍
SW_孙维
【FPGA HDL 编程从入门到精通】掌握硬件描述语言的10大核心技能实战秘诀
SW_孙维
计数器电路深度研究二进制、十进制、环形计数器的6种典型实现方案
SW_孙维
多通道LED驱动芯片选型宝典TLC5916、WS2811等5款主流IC权威评测
SW_孙维
时序组合逻辑实战构建稳定嵌入式控制模块的8种经典电路设计
SW_孙维