【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

今天为数字钟写display显示代码,还是要用到testbench和modelsim,上次的方法感觉好乱好乱的,今天在前面学习的基础上又查找资料,学到了新的方法,有了新的体会,在这里记录下来。有部分图片啥的是从前面的文档里复制的,更新的主要是今天学习的操作方法。

注意,从今天开始,testbench使用VHDL语句了!

假设现在已经写好了一个电路vhdl,编译也没问题了,什么都没问题了,就差仿真了。

  1. 设置testbench语言

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

这里使用VHDL语言,确认。

  1. 生成testbench

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

点击之后,quartus会自动生成以.vht为扩展名的testbench文件。

  1. 建立modelsim工程

打开modelsim 10.1c

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真打开后是没有work库的【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

 

所以要新建work库

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

取名为work

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

 

在建立的library库之后,要再建立一个工程project

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

我们为这工程取名为display

 

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

点击OK后会弹出另一个对话框

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

因为我们的VHDL元件文件和testbench都是使用quartusII来生成的,所以我们直接选择“Add existing file”将我们设计的display元件和testbench都添加进来,为什么这两个文件都要添加呢?

因为仔细看testbench中,他有个component,他其实就是引用了display元件,要不他知道要对输入引脚的信号进行什么操作呢,对吧。

添加display元件

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

确定之后,我们会看到工程中会添加了display.vhd元件文件

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

接着我们在添加testbench文件就行了

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

是simulation->modelsim中的display.vht

最后整个工程中包含了两个文件,一个.vhd一个.vht

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

这样一个工程就完成了。

  1. testbench文件编写

在把整个大环境搭建完成后,我们就要修改quartusII直接生成的testbench文件,在上面工程的.vht文件上右键选择edit

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

在编辑界面可以对testbench进行修改,下面先把vhdl的元件代码复制到这里,让大家看看这个元件是什么,才能测试,对吧,所以先看元件是干啥的

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

这个用来驱动4位7段数码管,seg用来控制选第几个数码管,00表示第一个,01是第二个,10是第三个,11是第四个。BCDin是按BCD码的输入数字,将BCDin转成int型就是对应的数字。输出的seg_c是直接连到硬件的位选,num连到段选。

那么他的testbench怎么写的呢?

LIBRARY ieee;                                              

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all; 

use ieee.std_logic_arith.all;                             

ENTITY display_vhd_tst IS

END display_vhd_tst;

ARCHITECTURE display_arch OF display_vhd_tst IS

-- constants                                                

-- signals                                                

SIGNAL BCDin : STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL num : STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL seg : STD_LOGIC_VECTOR(1 DOWNTO 0);

SIGNAL seg_c : STD_LOGIC_VECTOR(3 DOWNTO 0);

COMPONENT display

       PORT (

       BCDin : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

       num : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);

       seg : IN STD_LOGIC_VECTOR(1 DOWNTO 0);

       seg_c : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)

       );

END COMPONENT;

BEGIN

       i1 : display

       PORT MAP (

-- list connections between master ports and signals

       BCDin => BCDin,

       num => num,

       seg => seg,

       seg_c => seg_c

       );

init : PROCESS                                            

-- variable declarations   

variable BCDintemp:std_logic_vector(3 downto 0);                                

BEGIN                                                       

        -- code that executes only once 

                     BCDin<="1111";

                     seg<="11";

                     wait for 500ns;

                    

                     BCDintemp:="0000";

                     for i in 0 to 9 loop

                seg<="00"; --out 0001

        BCDintemp:=BCDintemp+'1'; --use "+" must include std_logic_unsigned library

        BCDin<=BCDintemp;

        wait for 500ns;

      end loop;     

WAIT;                                                      

END PROCESS init;                                          

always : PROCESS                                             

-- optional sensitivity list                                  

-- (        )                                                

-- variable declarations                                     

BEGIN                                                        

        -- code executes for every event on sensitivity list 

WAIT;                                                       

END PROCESS always;                                         

END display_arch;

主要就是蓝色部分的文字,使用了一个变量BCDintemp来累加,看整个输出对不对。

  1. 编译

保存testbench,点击编译all

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

编译完成后会发现工程中的?号变为了对号√

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

说明编译通过了。

  1. 仿真

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

在弹出的对话框中选择仿真程序

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

点击OK后应该有一个object界面,如果没有,从view中选出来

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

在object界面中将所有的管脚都加到波形中:

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

在波形界面,修改为10ms,之后点击run就行了

【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真

 

上一篇:【LC】307. Range Sum Query - Mutable 【线段树】【TB】


下一篇:tokenizer.encode() 与 tokenizer.tokenize()对比,言简意赅 转 高人讲学