七星迪曼网站建设,网站建设 阳江,西部数码网站管理助手v4.0,山东网站建站建设目录 VHDL仿真概述:
基本结构:
VHDL一般仿真过程:
仿真测试平台文件:
编写测试平台文件的语言:
一个测试平台文件的基本结构如下#xff1a;
测试平台文件包含的基本语句:
产生激励信号的方式:
时钟信号:
复位信号:
周期信性信号:
使用延迟DELAYD:
一般的激励信号…目录 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_CLKDELAYED(10 ns);
以上两个时钟信号波形如下 一般的激励信号:
所定义的普通的激励信号来用作模型的输入信号
通常在进程中定义
一般使用WAIT语句来定义。
例如下面的激励信号定义 其波形如下: 动态激励信号:
动态激励信号就是被仿真的实体DUT的行为模型相关即DUT的输入激励信号受模型的行为所影响。
如下信号的定义模型的输入信号Sig_A和模型输出信号Count相关。 使用测试矢量:
将一组固定的输入输出矢量值存储在一个常量表或一个ascii文件中然后将这些值应用到输入信号从而产生激励信号
矢量的值序列可以使用多维数组或使用多列记录来描述。
如下面的数据表存储了输入矢量 假设所测试的实体DUT具有4个输入A、B、C和D信号如果以一般的时间间隔应用测试矢量则可以使用一个GENERATE语句例 如果将信号应用于任意时间间隔则需要使用并行的信号赋值语句产生多个信号的波形使用这种方法可以将一个矢量赋值给多个信号例如下面的代码 测试平台文件:
时钟周期为20ns在一个时钟波形产生进程中定义。激励信号波形在另一个进程中产生。实体为一个空实体没有输入输出信号端口。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY S_MACHINE_TB IS
END;ARCHITECTURE BHV OF S_MACHINE_TB ISCOMPONENT S_MACHINEPORT (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 SIGNALSIGNAL 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 instantiationDUT:S_MACHINE PORT MAP(CLKCLK, RESETRESET, STARE_INPUTSSTARE_INPUTS, COMB_OUTPUTSCOMB_OUTPUTS);--generate clock signalclk_gen: PROCESSBEGIN
CLK 1;WAIT FOR CLK_PERIOD/2;CLK 0;WAIT FOR CLK_PERIOD/2;END PROCESS;--drive signalTB: PROCESSBEGINWAIT 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 ISPORT (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 ISTYPE STATES IS (ST0, ST1, ST2, ST3); --define STATES as enumSIGNAL CURRENT_STATE, NEXT_STATE: STATES;BEGIN
REG: PROCESS (RESET, CLK)BEGINIF RESET 1 THENCURRENT_STATE ST0;ELSIF(CLK 1 AND CLKEVENT) THENCURRENT_STATE NEXT_STATE;END IF;END PROCESS;COM: PROCESS(CURRENT_STATE, STARE_INPUTS) --feedback signalBEGINCASE CURRENT_STATE ISWHEN ST0COMB_OUTPUTS00;IF STARE_INPUTS00 THENNEXT_STATEST0;ELSENEXT_STATEST1;END IF;WHEN ST1COMB_OUTPUTS01;IF STARE_INPUTS 00 THENNEXT_STATE ST1;ELSENEXT_STATE ST2;END IF;WHEN ST2COMB_OUTPUTS 10;IF STARE_INPUTS 11 THEN
NEXT_STATE ST2;ELSENEXT_STATE ST3;END IF;WHEN ST3COMB_OUTPUTS 11;IF STARE_INPUTS 11 THENNEXT_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码形式读取的可以被人识别integer、bit_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”文本文档打开文档其内容如下