TEXTIO及其在VHDL仿真中的应用

TEXTIO 在VHDL 仿真与磁盘文件之间架起了桥梁,使用文本文件扩展VHDL 的仿真功能。本文介绍TEXTIO 程序包,以一个加法器实例说明TEXTIO 的使用方法,最后使用ModelSim 对设计进行仿真,并分析仿真结果。

在对VHDL 源程序进行仿真时, 由于有的输入输出关系仅仅靠输入波形或编写testbench 中的信号输入是难以验证结果正确性的, 例如, 设计8 位加法器, 如果将所有的输入都验证一遍, 是非常麻烦的, 因为要全面判断输出是否正确需要一个个的验证。此外,若用VHDL 设计一个处理器, 需要读入指令,这时候采用文本文件非常必要。
       
TEXTIO 提供了VHDL 仿真时与磁盘文件的交互。在验证加法器时候, 可以将所有输入保存在一个文本文件中, 将其它软件计算出的结果保存在另外的文件中。在VHDL 仿真时,可以直接读取输入文件作为设计的输入参数, 并自动将结果与事先保存的文件相比较,给出一定的信息来确定结果的正确与否。在对VHDL 编写的处理器调试时, 可以将包括指令类型、源地址、目标地址在内的指令保存成文本文件, 利用TEXTIO 来读取这些指令。同时, 将结果及中间变量保存成文本文件,以事后判断是否正确及便于查找原因。
       
由于TEXTIO 的文本输入输出功能非常有限, 一些公司提供了扩展其功能的程序包,例如std_developerskit库中的std_iopak 程序包。在本文中,仅仅对TEXTIO 程序包做简单的介绍及其简单的使用。

1 TEXTIO介绍
       
TEXTIO 是VHDL 标准库STD 中的一个程序包(Package)。在该包中定义了三个类型:LINE 类型、TEXT类型以及SIDE 类型。另外,还有一个子类型(subtype)WIDTH。此外, 在该程序包中还定义了一些访问文件所必须的过程(Procedure)。

1.1 类型定义

(1)type LINE is access string
       
定义了LINE 为存取类型的变量,它表示该变量是指向字符串的指针,它是TEXTIO 中所有操作的基本单元。读文件时,先按行(LINE)读出一行数据,再对LINE 操作来读取各种数据类型的数据;写文件时, 先将各种的数据类型组合成LINE,再将LINE 写入文件。在用户使用时, 必须注意只有变量才可以是存取类型, 而信号则不能是存取类型。例如, 我们可以定义
variable DLine : LINE;

但不能定义成
signal DLine : LINE;

(2)type TEXT is file of string

定义了TEXT 为ASCII 文件类型。 定义成为TEXT 类型的文件是长度可变的ASCII 文件。例如在TEXTIO 中定义了两个标准的文本文件。

file input : TEXT open read_mode isSTD_INPUT;
file output : TEXT open write_mode isSTD_OUTPUT;

定义好以后,就可以通过文件类型变量input 和output 来访问其对应的文件STD _ INPUT 和STD_OUTPUT。
需要注意的是VHDL87 和VHDL93 在使用文件方面有较大的差异,在编译时注意选中对应的标准。

(3)type SIDE is (right,left)
定义了SIDE 类型。表示定义了一个名为SIDE 的数据类型,其中只能有两种状态,即right 和left,分别表示将数据从左边还是右边写入行变量。该类型主要是在TEXTIO 程序包包含的过程中使用。

(4)subtype WIDTH is natural
定义WIDTH 为自然数的子类型。所谓子类型表示其取值范围是父类型范围的子集。

1.2 过程定义

TEXTIO 提供了基本的用于访问文本文件的过程。类似于C++,VHDL 提供了重载功能, 即完成相近功能的不同过程可以有相同的过程名, 但其参数列表不同, 或参数类型不同或参数个数不同。

TEXTIO 提供的基本过程有:

procedure READLINE(文件变量;行变量);用于从指定文件读取一行数据到行变量中。
procedure WRITELINE(文件变量;行变量);用于向指定文件写入行变量所包含的数据。
procedure READ(行变量;数据类型);用于从行变量中读取相应数据类型的数据。
  
根据参数数据类型及参数个数的不同,有多种重载方式,TEXTIO 提供了bit、bit_vector 、BOOLEAN 、character、 integer、real、string、time数据类型的重载。同时, 提供了返回过程是否正确执行的BOOLEAN 数据类型的重载。例如, 读取整数的过程为

procedure READ(L:inout LINE; VALUE: out integer; GOOD: out BOOLEAN);其中,GOOD 用于返回过程是否正确执行, 若正确执行, 则返回TRUE 。
procedure WRITE(行变量; 数据变量; 写入方式; 位宽);

该过程将数据写入行变量。其中写入方式表示写在行变量的左边还是右边,且其值只能为left 或right,位宽表示写入数据时占的位宽。例如:

write(OutLine,OutData,left,2);
表示将变量OutData 写入LINE 变量OutLine 的左边占2 个字节。

2 TEXTIO应用实例

下面以一个简单的8 位加法器来说明TEXTIO 的使用。输入数据为两个8 位的有符号数, 输出为9 位的有符号数,以防止溢出。在编写加法器的描述文件时,首先要对两个数进行位的扩展,再进行加法运算。在编写测试文件时, 要注意读入数据与得到结果之间相差一个时钟周期。因此, 需要在读出的结果与计算的结果之间插入一个时钟周期的等待。

① 生成输入及预定结果文件的C++程序。

我们可以使用VC++、Matlab 等高级软件工具编写生成输入和预定结果文件的程序。由于设定输入为8 位有符号数, 因此,其范围为[-127,127]。C++程序如下:

  #include iostream.h
  #include stream.h
  void main(void){
  int i,j;
  ofstreamfsIn(d:yuprojmodelsimNineBitAdd er2TestData.dat);
  ofstreamfsOut(d:yuprojmodelsimNineBitAdd er2Result.dat);
  for(i=-127;i<128;i++) {
  for(j=-127;j<128;j++) {
  fsIn< <<J<<ENDL;
  fsOut<<<ENDL;
  }
  }
  fsIn.close();
  fsOut.close();
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值