FPGA学习笔记(7)——Vivado Simulator仿真软件的使用

1 仿真概述

Simulator仿真虽然不需要使用硬件资源,但是需要编写激励文件,也就是testbench代码。

仿真是设计输入后的第一个步骤,也是实现后的最后一个步骤,可以分为功能仿真(RTL仿真)和时序仿真。

  • 功能仿真:验证电路的功能是否符合设计要求,不考虑电路门延迟与线延迟。
  • 时序仿真:布局布线后仿真,电路映射到特定的工艺环境以后,综合考虑FPGA芯片的路径延迟与门延迟,验证电路能否在一定时序条件下满足设计构想的过程,能较好地反映芯片实际工况。

2 Testbench文件

激励程序是输入设计顶层模块的信号波形,TB文件的结构如下:

typescript 复制代码
`timescale 仿真单位/仿真精度
module test_bench();
// 通常testbench没有输入与输出端口
// 信号或变量定义声明
//使用initial初始化信号电平
//使用always语句产生时钟波形
//例化设计模块 模块名 例化名(...)
endmodule
  • `timescale 1ns/1ps较为常见。
  • 在以上仿真时间情况下,# 100表示延迟100ns。
  • 如果是`timescale 1ps/1ps,# 100表示延迟100ps,延迟只看timescale的仿真单位。

3 试验步骤

本节使用之前的LED交替闪烁试验工程作为模板,添加tb文件进行仿真试验。

3.1 编写testbench文件

1、在Sources窗口右键Simulation Sources,Add Sources。

2、新建源文件:Create Source File,文件取名为tb_test_project.v。

3、编写测试文件:

查看test_project模块的输入输出,tb中如果对端口使用always或initial进行赋值,则使用reg类型;如果对端口使用assign进行赋值,则使用wire进行赋值

// 000_test_project.v

module test_project(
    input sys_clk,
    input sys_rst_n,
    
    output [1:0] led
);

// ......

模块中初始化赋值使用initialbeginend一头一尾相对应。#200为延时200ns,模拟复位按钮按下一段时间后弹起。

如果sys_clk时钟周期为20ns,则时钟频率为50MHz,在一个时钟周期内高电平和低电平分别占据10ns。因此采用always语句来模拟时钟。

typescript 复制代码
// tb_test_project.v

`timescale 1ns / 1ps

module tb_test_project();

// 信号或变量定义声明
reg sys_clk;
reg sys_rst_n;
wire [1:0] led;

//使用initial初始化信号电平
initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #200 
    sys_rst_n = 1'b1;
end

//使用always语句产生时钟波形
always #10 sys_clk = ~sys_clk;

//例化设计模块 模块名 例化名(...)
test_project u_test_project(
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .led(led)
);

endmodule

3.2 开始仿真

点击Vivado左侧窗口SimulationRun Simulation,选择Run Behavioral Simulation

五个选项分别为:

  • Run Behavioral Simulation:运行行为仿真(功能是否完整)。
  • Run Post-Synthesis Functional Simulation:运行综合后的功能仿真
  • Run Post-Synthesis Timing Simulation:运行综合后的时序仿真
  • Run Post-Implementation Functional Simulation:运行实现后的功能仿真
  • Run Post-Implementation Timing Simulation:运行实现后的时序仿真

运行一段时间后,可以观察到波形如下所示:

如果需要查看cnt计数器的值,点击u_test_project,然后将cnt拖动到右侧波形图中,然后重新运行仿真就可以看到cnt的变化情况。

运行较长时间后,可以在波形图中观察到当cnt的值为25000000后,led的值发生改变。

Ctrl+S就可以保存波形信息为.wcfg格式。

相关推荐
Chef_Chen14 分钟前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
北城笑笑36 分钟前
FPGA 14 ,硬件开发板分类详解,FPGA开发板与普通开发板烧录的区别
fpga开发·fpga
2202_7544215442 分钟前
一个计算频率的模块
驱动开发·fpga开发
hopetomorrow1 小时前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow1 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
/**书香门第*/1 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
美式小田2 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
小灰灰的FPGA2 小时前
低速接口项目之串口Uart开发(七)——如何在FPGA项目中实现自适应波特率串口功能
fpga开发
猫爪笔记2 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
_不会dp不改名_2 小时前
HCIA笔记3--TCP-UDP-交换机工作原理
笔记·tcp/ip·udp