VHDL语言基础-Testbech

news2024/9/21 18:44:11

目录

VHDL仿真概述:

基本结构:

VHDL一般仿真过程:

仿真测试平台文件:

编写测试平台文件的语言:

一个测试平台文件的基本结构如下:

测试平台文件包含的基本语句:

产生激励信号的方式:

时钟信号:

复位信号:

周期信性信号:

使用延迟DELAYD:

一般的激励信号:

动态激励信号:

使用测试矢量:

测试平台文件:

定义所测试元件的VHDL程序,该程序是一个简单的Mealy型状态机演示程序:

仿真响应:

控制仿真:

断言语句(ASSERT):

文件I/O的读写:

从文件加载数据或将数据存储到文件中:

定义文件:

打开文件:

定义文件句柄后就可以在程序中打开指定文件,同时指定打开模式。

读写文件:

关闭文件:

VHDL’93标准包括如下重要的文件I/O操作子程序:


VHDL仿真概述:

VHDL仿真器,modelsim,需要以下输入

设计的描述(项目的VHDL程序)

驱动设计的激励

VHDL本身是自激励时则无需此输入

基本结构:

VHDL一般仿真过程:


仿真测试平台文件:

测试平台文件:

定义:可以用来验证所设计的硬件模型的正确性的VHDL模型。

作用:为所测试的原件提供了激励信号,仿真结果可以以波形的方式显示或存储测试结果到文件中。

激励信号:

可以直接集成在测试平台文件中,也可以从外部文件中加载。


编写测试平台文件的语言:

个测试平台文件的基本结构如下:


测试平台文件包含的基本语句:

实体的定义语句

需要定义端口,只和被测试元件(DUT)通过内部信号相连接

测试元件的例化语句

产生时钟信号语句

产生激励源语句


产生激励信号的方式:

一定的离散时间间隔产生激励信号

基于实体的状态产生激励信号

下面通过实例,讲述激励信号的产生


时钟信号:

个周期性的激励信号可以使用一个并行的信号赋值语句来建立;

例如下面的语句即是建立周期为40ns的信号。

A <= not A after 20 ns;  --产生一个周期为40ns的信号A     

其对应的时钟波形如下图:时钟信号是同步设计中最重要的信号之一。它既可以使用并行的信号赋值语句产生(如上面的语句),也可以使用时钟产生的进程来实现定义。当使用并行的信号赋值语句时,产生的时钟信号可以是对称的或不对称的,但是信号的初始值不能为‘u

如果使用进程来定义信号,也可以产生各种时钟信号,包括对称和不对称的。在大部分情况下,时钟信号是一直运行的,并且是对称的。当定义不对称的时钟信号,如果使用并行信号幅值语句,则需要使用条件信号赋值语句;如果使用进程,则比较简单,使用顺序逻辑就可以。下面语句使用条件信号赋值语句,定义了一个25%占空比的时钟信号:

W_CLK <= '0' after PERIOD/4 when W_CLK = '1' else

                   '1' after 3*PERIOD/4 when W_CLK = '0' else

                   '0';

上述两个对称和不对称的时钟信号,也可以使用进程来定义,如下:


复位信号:

实现方式

使用并行赋值语句

在进程中设定

例如下面复位信号设置:仿真开始时,复位信号为’0’;经过20ns后,复位信号变为’1’;再经过20ns后,复位信号变为’0’

RESET <= '0', '1' after 20 ns, '0' after 40 ns;

再例如另一个复位信号设置实例,代码如下:

RESET <= '0', '1' after 100 ns, '0' after 180 ns, '1' after 210 ns;

RESET信号初始为’0’,经过100ns后,变为’1’;再经过80ns,该信号变为’0’;再经过30ns,该信号返回到’1’。其波形如下:


周期信性信号:

可以在进程中使用信号赋值语句实现信号的周期性信号设置。

上例定义了两个周期性信号,为了实现信号的周期性变化,后面使用一个WAIT语句。其波形如下:

 


使用延迟DELAYD:

可使用预定义属性DELAYD关键词来产生信号。如果已经产生了一个时钟信号,在这个时钟信号的基础上,可以使用DELAYD来使已经产生的时钟信号延迟一定的时间,从而获得另一个时钟信号。

假如我们已经使用如下的语句定义了一个时钟信号W_CLK

W_CLK <= '1' after 30 ns when W_CLK = '0' else

                   '0' after 20 ns;

然后可以使用如下的延迟语句获得一个新的时钟信号DLY_W_CLK,它比W_CLK延迟了10ns

DLY_W_CLK <= W_CLK'DELAYED(10 ns);

以上两个时钟信号波形如下:


一般的激励信号:

定义的普通的激励信号来用作模型的输入信号;

通常在进程中定义;

一般使用WAIT语句来定义。

例如下面的激励信号定义:

波形如下:


动态激励信号:

动态激励信号,就是被仿真的实体(DUT)的行为模型相关,即DUT的输入激励信号受模型的行为所影响。

如下信号的定义,模型的输入信号Sig_A和模型输出信号Count相关。


使用测试矢量:

将一组固定的输入输出矢量值存储在一个常量表或一个ascii文件中,然后将这些值应用到输入信号从而产生激励信号;

矢量的值序列可以使用多维数组或使用多列记录来描述。

如下面的数据表存储了输入矢量:

假设所测试的实体(DUT)具有4个输入:ABCD信号,如果以一般的时间间隔应用测试矢量,则可以使用一个GENERATE语句,例:

如果将信号应用于任意时间间隔,则需要使用并行的信号赋值语句产生多个信号的波形;使用这种方法可以将一个矢量赋值给多个信号,例如下面的代码:

 


测试平台文件:

时钟周期为20ns,在一个时钟波形产生进程中定义。激励信号波形在另一个进程中产生。实体为一个空实体,没有输入输出信号端口。

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY S_MACHINE_TB IS
END;
 
ARCHITECTURE BHV OF S_MACHINE_TB IS
  COMPONENT S_MACHINE
      PORT (CLK, RESET: IN STD_LOGIC;
              STARE_INPUTS: IN STD_LOGIC_VECTOR (0 TO 1);
              COMB_OUTPUTS: OUT STD_LOGIC_VECTOR (0 TO 1)
              );
  END COMPONENT;
  --INPUT SIGNAL
  SIGNAL CLK: STD_LOGIC := '0';
SIGNAL RESET: STD_LOGIC := '0';
SIGNAL STARE_INPUTS: STD_LOGIC_VECTOR (0 TO 1) := "00";
--OUTPUT SIGNAL
SIGNAL COMB_OUTPUTS: STD_LOGIC_VECTOR (0 TO 1);
  
--TIMER PERIOD DEFINE
CONSTANT CLK_PERIOD: TIME := 20 NS;
BEGIN
    --component instantiation
    DUT:S_MACHINE PORT MAP(CLK=>CLK, 
                            RESET=>RESET, 
                            STARE_INPUTS=>STARE_INPUTS, 
                            COMB_OUTPUTS=>COMB_OUTPUTS);
    --generate clock signal
    clk_gen: PROCESS
    BEGIN
CLK <= '1';
        WAIT FOR CLK_PERIOD/2;
        CLK <= '0';
        WAIT FOR CLK_PERIOD/2;
     END PROCESS;
     --drive signal
     TB: PROCESS
     BEGIN
        WAIT FOR 20 NS;
        RESET <= '1';
        WAIT FOR 20 NS;
        RESET <= '0';
        WAIT FOR 210 NS;
        STARE_INPUTS <= "01";
        WAIT FOR 20 NS;
        STARE_INPUTS <= "10";      
        WAIT  FOR  20 NS;
STARE_INPUTS <= "11";
        WAIT FOR 20 NS;
        STARE_INPUTS <= "00";
        WAIT FOR 20 NS;
        STARE_INPUTS <= "11";
        WAIT FOR 20 NS;
        STARE_INPUTS <= "10";
        WAIT FOR 20 NS;
        STARE_INPUTS <= "01";
        WAIT FOR 20 NS;
        STARE_INPUTS <= "00";
        WAIT FOR 20 NS;
       WAIT;
     END PROCESS;   
  END;



定义所测试元件的VHDL程序,该程序是一个简单的Mealy型状态机演示程序:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY S_MACHINE IS
  PORT (CLK, RESET: IN STD_LOGIC;
        STARE_INPUTS: IN STD_LOGIC_VECTOR(0 TO 1);
          COMB_OUTPUTS: OUT STD_LOGIC_VECTOR(0 TO 1)
          );
END;
 
ARCHITECTURE ART OF S_MACHINE IS
  TYPE STATES IS (ST0, ST1, ST2, ST3); --define STATES as enum
  SIGNAL CURRENT_STATE, NEXT_STATE: STATES;
    BEGIN
REG: PROCESS (RESET, CLK)
        BEGIN
          IF RESET = '1' THEN
            CURRENT_STATE <= ST0;
          ELSIF(CLK = '1' AND CLK'EVENT) THEN
            CURRENT_STATE <= NEXT_STATE;
          END IF;
        END PROCESS;
        
        COM: PROCESS(CURRENT_STATE, STARE_INPUTS)  
         --feedback signal
        BEGIN
          CASE CURRENT_STATE IS
          WHEN ST0=>
            COMB_OUTPUTS<="00";
             IF STARE_INPUTS="00" THEN
               NEXT_STATE<=ST0;
             ELSE
               NEXT_STATE<=ST1;
             END IF;
          WHEN ST1=>
            COMB_OUTPUTS<="01";
             IF STARE_INPUTS = "00" THEN
               NEXT_STATE <= ST1;
             ELSE
               NEXT_STATE <= ST2;
             END IF;
          WHEN ST2=>
            COMB_OUTPUTS <= "10";
             IF STARE_INPUTS = "11" THEN
NEXT_STATE <= ST2;
             ELSE
               NEXT_STATE <= ST3;
             END IF;
          WHEN ST3=>
            COMB_OUTPUTS <= "11";
             IF STARE_INPUTS = "11" THEN
               NEXT_STATE <= ST3;
             ELSE 
               NEXT_STATE <= ST0;
             END IF;
          END CASE;
        END PROCESS;
     END ART;

 使用以上测试平台文件对元件进行功能仿真,仿真结果如下图:


仿真响应:

控制仿真:

控制,则仿真会一直持续到时间等于设定的仿真时间;

如果想在某个时间终止仿真,可使用断言语句ASSERT来实现;

另外,ASSERT语句可以实现对某些值或行为作出响应。

断言语句(ASSERT):

适合于执行仿真的自动响应;

可以检查一个条件并报告信息;

根据所选择的严重级别和仿真工具的设置,在ASSERT语句报告了信息后,仿真可以继续执行(警告级别WARNING)或者停止(错误ERROR或致命错误FAILURE),默认的严重级别为ERROR

使用断言语句判断仿真的时间,如果当前时间为1000ns,则仿真完成,使用ERROR严重级别终止仿真过程。

断言语句判断条件时,如果条件的判断结果为FALSE,则执行后面的报告及严重级语句,否则仿真会忽略后面的报告和严重级语句并继续执行。

可以使用ASSERT语句设定一个判断条件,以便对仿真的某个结果或值做出响应,例如:

下面的程序为4位计数器的行为模型,计数器的位数为4位。方向由信号DIR决定,如果DIR为高电平,则正向计数,如果DIR为低电平,则反向计数。计数结果保存在CT_RESULT信号中。

下面的程序为测试平台,在程序中,一个断言语句用于判断计数结果是否等于”1001”。条件判断使用了“不等于(/=)逻辑”,如果判断条件为FALSE,即等于“1001”,则报告信息,并终止仿真。

以上测试文件在Modelsim中的仿真波形如下:

当计数到”1001”,在Modelsim的信息栏输出所要报告的信息,如下:


文件I/O的读写:

从文件加载数据或将数据存储到文件中:

例如用户定义的测试矢量可以保存在文件中,然后在仿真时从文件中读取这些测试矢量。

另外,仿真的结果可以保存在文件中。

VHDL’93的文件I/O读写主要是用于仿真,综合工具并不支持文件I/O的读写。

如果想在仿真时进行文件操作,必须包括标准库STD中的TEXTIO定义的程序库,该程序库中包含了文件啊你输入输出所需要的基本子程序(函数和过程)。


定义文件:

文件的两个类型:

Integer:文件中的数据是以二进制存取的,不能被人识别,只有integer型的数据能够存入这列文件。

String:文件是以ascii码形式读取的,可以被人识别;integerbit_vector(x downto y)string(x downto 1)std_logic_vector(x downto o)bit等都可以被存入此类文件。

定义语法:

FILE FILEIN : TEXT;

TYPE INTEGERFILE IS FILE OF INTEGER;

FILE FILEIN : INTEGERFILE;


打开文件:

定义文件句柄后就可以在程序中打开指定文件,同时指定打开模式。

读写文件:

打开文件后就可以对文件进行读写操作,其语句格式如下:

使用以上语句只能写入指定类型的数据,如integer类型的只能写入integer型数据。如果写入其他类型需要遵循以下步骤:


关闭文件:

在文件读写完毕后,需使用file_close(file_handle);关闭文件。

ENDFILE(file_handle);判断在文件操作中是否读取到文件的末尾


VHDL’93标准包括如下重要的文件I/O操作子程序:

下面举一个例子,使用了上面介绍的各种语法:

h3

modelsim控制台做如下操作:

等待数秒后,在modelsim工程目录下将会新建一个”DATAIN.TXT”文本文档,打开文档其内容如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法leetcode|36. 有效的数独(rust重拳出击)

文章目录36. 有效的数独&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a;分析&#xff1a;题解&#xff1a;rustgoccpythonjava36. 有效的数独&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效…

【C++】类和对象---需掌握的功能

目录1.初始化列表1.1构造函数赋值1.2初始化列表格式&#xff1a;编译器执行的顺序&#xff1a;特性&#xff1a;1.3explicit关键字类型替换过程多参数构造函数类型替换&#xff08;C11&#xff09;2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时…

linux高级命令之获取管理员权限的相关命令

获取管理员权限的相关命令学习目标能够知道切换到管理员用户的命令1. sudo命令的使用命令说明sudo -s切换到root用户&#xff0c;获取管理员权限sudo某个命令的执行需要获取管理员权限可以在执行命令前面加上sudosudo -s效果图:sudo 命令效果图:说明:如果只是某次操作需要使用管…

面向对象与面向过程编程

从语言角度来讲&#xff1a; C是面向过程编程&#xff1b; C一半是面向过程编程&#xff0c;一半是面向对象编程&#xff1b; Java是面向对象编程。 一、什么是面向对象编程与面向过程编程&#xff1f; 面向过程&#xff08;Procedure Oriented 简称 PO&#xff09;&#xff1…

云计算ACP云服务器ECS实例题库

&#x1f618;作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。&#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。&…

2.你的程序乱码了吗?

学习的动力不止于此&#xff1a; 1. 乱码 #include <QApplication> #include <QLabel> #include <QFont> int main(int argc, char *argv[]) {QApplication a(argc, argv);QLabel lb;lb.setFont(QFont("Sans Serif", 24));lb.setText(" 乱…

Linux文件隐藏属性(修改与显示):chattr和lsattr

文件除了基本的九个权限以外还有隐藏属性存在&#xff0c;这些隐藏属性对于系统有很大的帮助&#xff0c;尤其是系统安全&#xff08;Security&#xff09;上 chattr&#xff08;配置文件隐藏属性&#xff09; chattr 【-】【ASacdistu】文件或目录名称 选项与参数&#xff1a…

Visual Navigation(一):阅读三篇经典论文

文章目录前言一、Learning to Navigate in Cities Without a Map二、Unsupervised Predictive Memory in a Goal-Directed Agent三、Zero-Shot Imitation LearningImitation Learning:前言 研究生不读论文还是不行的呀&#xff0c;在这里结合下别人的总结等下一次组会吹水。 …

大客户市场:阿里云、腾讯云、华为云“贴身肉搏”

配图来自Canva可画 近年来&#xff0c;随着中国逐渐进入数字化经济快车道&#xff0c;国内企业数字化、智能化升级已是刻不容缓。而为了帮助自身或其他企业实现数字化转型升级&#xff0c;阿里、腾讯、百度、京东、字节、网易、华为等众多国内知名企业早在多年以前&#xff0c…

【Git学习】Git如何Clone带有Submodule的仓库?

文章目录一、问题描述二、解决问题三、参考链接四、解决问题4.1 下载主模块4.2 查看主模块的配置4.2 子模块的添加4.3 查看子模块的配置4.4 查看子模块的检出状态4.5 检出submodule4.6 再次查看.git/config4.7 重新打开Android Studio运行代码一、问题描述 在GitHub上下载了一…

Android12 Launcher3 最近任务客制化

实现的最终效果: 目录 修改图标位置+添加应用名称 代码实现: 图标控件的边距调整:

微信小程序 button按钮怎么触发事件? bindtap语法怎么使用?

在前端网页中我们需要触发一个事件如果按钮点击后调用函数&#xff0c;文本、图片、链接被点击后调用一个函数一个事件&#xff0c;我们都知道用click&#xff0c;可是微信小程序中的click是不存在的&#xff0c;他怎么才能和网页中一样的使用click的呢&#xff1f; 1.bindtap语…

编程思想-0x00架构

产生架构的原因&#xff1f; 1、代码均摊 将不同的代码进行分块&#xff0c;然后简历联系&#xff0c;低耦合、高内聚&#xff1b; 原则上&#xff1a;合理的App架构应该是合理分配每个类、结构体、方法、变量的存在都应该遵循单一职责的原则 2、便于测试 测试确保代码质量&…

【编程基础之Python】3、创建Python虚拟环境

【编程基础之Python】3、创建Python虚拟环境创建Python虚拟环境为什么需要虚拟环境Windows上的Anaconda创建虚拟环境conda 命令conda env 命令创建虚拟环境切换虚拟环境验证虚拟环境Linux上的Anaconda创建虚拟环境创建虚拟环境切换虚拟环境验证虚拟环境总结创建Python虚拟环境 …

性能优化方向

性能怎么样就看io的应用&#xff0c;网络和数据库要好好设计&#xff0c;能一次查出来就一次。 对外接口尽量不要多创建对象&#xff0c; 少用bean复制 少用getbean(.class) 缓存不要频繁操作&#xff0c;最好异步 循环不要调用数据库&#xff0c;调用接口最好批量 Compon…

UG NX二次开发(C#)-UIStyler-创建长方体

文章目录 1、前言2、UG NX自动的创建长方体界面3、在块样式编辑器中创建UI界面4、创建一个工程5、在创建按钮中添加代码6、调用dll7、结论1、前言 UG NX二次开发中,UIStyler是一种非常高效的开发方式,UG NX已经为我们提供了比较完善的UIStyler开发模板,只要通过拖动的方式就…

GAN系列基础知识

原始值函数 原始GAN的值函数是 minGmaxDV(D,G)Ex∼pdata(x)[logD(x)]Ez∼pz(z)[log(1−D(G(z)))]min_Gmax_DV(D,G) E_{x \sim p_{data}(x)}[logD(x)]E_{z \sim p_{z}(z)} [log(1-D(G(z)))]minG​maxD​V(D,G)Ex∼pdata​(x)​[logD(x)]Ez∼pz​(z)​[log(1−D(G(z)))] 其中Ex…

尚医通(十二)SpringCloud相关概念介绍 | 搭建Nacos服务

目录一、什么是微服务1、微服务的由来2、为什么需要微服务3、微服务与单体架构区别4、微服务本质5、什么样的项目适合微服务6、微服务开发框架7、什么是Spring Cloud8、Spring Cloud和Spring Boot是什么关系9、Spring Cloud相关基础服务组件10、Spring Cloud的版本二、Nacos1、…

XXL-JOB 极简入门

文章目录1 概述2 特性3 架构设计3.1设计思想3.2 系统组成3.3架构图3.4 高可用3.4.1 调度中心的高可用3.4.2 执行器的高可用4 搭建调度中心4.1 克隆源码4.2 初始化 XXL-JOB 表结构修改配置文件4.4 修改日志配置文件4.5 IDEA 启动调度中心4.6 编译源码4.7 命令行启动调度中心4.8 …

D32 Vue2 + Vue3 K124-K143

D32.Vue F21.创建vue3项目&#xff08;K124-K129&#xff09; 该笔记是从vue2过渡到vue3的&#xff0c;所以不会特别详细的介绍某些vue2学过的&#xff0c;主要介绍vue3新增的 1.Vue3快速上手 A. Vue3简介 1&#xff09;2020年9月18日&#xff0c;Vue.js发布3.0版本&…