Quartus II 13.1 交通灯仿真:5个关键测试用例与波形分析

📅 2026/7/12 6:42:24 👁️ 阅读次数 📝 编程学习
Quartus II 13.1 交通灯仿真:5个关键测试用例与波形分析

Quartus II 13.1 交通灯仿真:5个关键测试用例与波形分析实战指南

在数字系统设计领域,交通灯控制器一直是验证硬件描述语言(HDL)和EDA工具能力的经典案例。本文将带您深入Quartus II 13.1环境,通过5个精心设计的测试用例,揭示交通灯控制器的验证要点与常见陷阱。

1. 测试环境搭建与基础验证

搭建可靠的测试环境是仿真成功的第一步。在Quartus II 13.1中,我们需要先创建一个完整的工程框架:

module traffic_light_tb; reg clk; reg rst_n; reg SEN1, SEN2; wire R1, Y1, G1; wire R2, Y2, G2; // 实例化被测设计 traffic_light uut ( .clk(clk), .rst_n(rst_n), .SEN1(SEN1), .SEN2(SEN2), .R1(R1), .Y1(Y1), .G1(G1), .R2(R2), .Y2(Y2), .G2(G2) ); // 时钟生成(50MHz) always #10 clk = ~clk; initial begin // 初始化信号 clk = 0; rst_n = 0; SEN1 = 0; SEN2 = 0; // 复位释放 #100 rst_n = 1; end endmodule

基础验证阶段需要确认三个核心功能点:

  • 复位信号是否有效初始化所有输出
  • 时钟信号是否正确驱动状态转换
  • 默认状态下交通灯是否进入预设模式

提示:在波形窗口中,建议将相关信号分组显示,如将{SEN1,SEN2}作为一组,{R1,Y1,G1}和{R2,Y2,G2}分别作为一组,便于观察状态转换。

2. 传感器触发场景的深度测试

交通灯控制器的核心逻辑是对传感器输入的响应。我们设计了三个关键测试场景:

测试场景SEN1SEN2预期输出验证要点
单传感器触发10G1=1, R2=1优先权响应时间
反向单触发01R1=1, G2=1对称性验证
双传感器触发11交替通行公平性算法

对应的测试代码片段:

initial begin // 等待复位完成 @(posedge rst_n); // 测试用例1:SEN1单独触发 SEN1 = 1; #200; // 保持200ns // 测试用例2:SEN2单独触发 SEN1 = 0; SEN2 = 1; #200; // 测试用例3:双传感器触发 SEN1 = 1; SEN2 = 1; #500; end

在波形分析时需特别注意:

  • 状态转换时的信号毛刺
  • 输出信号建立时间是否符合时序要求
  • 竞争条件导致的亚稳态问题

3. 边界条件与异常情况测试

真实的交通场景中存在各种边界情况,我们的第四个测试用例专门验证这些特殊场景:

// 测试用例4:边界条件验证 initial begin // 快速切换传感器输入 repeat(10) begin SEN1 = 1; #15; SEN1 = 0; #15; SEN2 = 1; #15; SEN2 = 0; #15; end // 长时间无车流 SEN1 = 0; SEN2 = 0; #1000; // 突然双传感器触发 SEN1 = 1; SEN2 = 1; #200; end

这个测试用例重点检查:

  • 输入信号快速变化时的系统稳定性
  • 默认循环模式的计时准确性
  • 状态机是否会出现死锁

常见问题包括:

  1. 快速输入变化导致状态机紊乱
  2. 计时器溢出处理不当
  3. 优先级逻辑在边界条件下失效

4. 全功能覆盖测试用例

第五个测试用例是一个完整的场景模拟,覆盖所有可能的状态组合:

// 测试用例5:完整场景模拟 initial begin // 阶段1:初始循环 #1000; // 阶段2:方向1车流高峰 SEN1 = 1; #1500; // 阶段3:方向2车流高峰 SEN1 = 0; SEN2 = 1; #1500; // 阶段4:双方向车流 SEN1 = 1; SEN2 = 1; #2000; // 阶段5:恢复正常循环 SEN1 = 0; SEN2 = 0; #1000; end

对应的波形分析要点:

  1. 时间参数验证

    • 绿灯持续时间是否精确20个时钟周期
    • 黄灯持续时间是否为5个时钟周期
    • 状态转换间隔是否符合设计要求
  2. 状态覆盖检查

    • 所有可能的状态组合是否都被执行
    • 非法的状态转换是否被正确处理
  3. 输出稳定性

    • 输出信号是否存在毛刺
    • 信号变化是否同步于时钟边沿

5. 常见问题排查与优化建议

在实际项目中,交通灯控制器常遇到以下几类问题:

计时器同步问题

// 错误示例:异步复位导致计时不同步 always @(posedge clk or negedge rst_n) begin if(!rst_n) timer <= 0; else if(timer == MAX_TIMER) timer <= 0; else timer <= timer + 1; end // 正确写法:完全同步设计 always @(posedge clk) begin if(!rst_n) timer <= 0; else if(timer == MAX_TIMER) timer <= 0; else timer <= timer + 1; end

状态机编码建议

编码方式优点缺点
二进制编码节省触发器易出现毛刺
独热码稳定性高占用资源多
格雷码降低功耗实现复杂

输出寄存器优化

// 好的实践:寄存器输出消除毛刺 always @(posedge clk) begin if(!rst_n) begin R1 <= 0; G1 <= 0; Y1 <= 0; R2 <= 0; G2 <= 0; Y2 <= 0; end else begin case(state) STATE_G1_R2: begin G1 <= 1; R2 <= 1; Y1 <= 0; Y2 <= 0; R1 <= 0; G2 <= 0; end // 其他状态... endcase end end

在Quartus II中调试时,推荐使用以下工具组合:

  • Signal Tap Logic Analyzer 实时捕获信号
  • TimeQuest Timing Analyzer 检查时序约束
  • RTL Viewer 可视化设计结构