VHDL学习之TEXTIO在仿真中的应用
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 is STD_INPUT;
file output : TEXT open write_mode is STD_OUTPUT;
定义好以后,就可以通过文件类型变量input 和output 来访问其对应的文件STD _ INPUT 和STD_OUTPUT。
(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 位的有符号数,以防止溢出。在编写加法器的描述文件时,首先要对两个数进行位的扩展,再进行加法运算。在编写测试文件时,要注意读入数据与得到结果之间相差一个时钟周期。因此,需要在读出的结果与计算的结果之间插入一个时钟周期的等待。textio包如下
-- textio.vhdllibrary std; use std.standard.all; -- needed for bootstrap modepackage TEXTIO is-- Type Definitions for Text I/Otype LINE is access STRING; -- a line is a pointer to a STRING valuetype TEXT is file of STRING; -- a file of variable-length ASCII recordstype SIDE is (RIGHT, LEFT); -- for justifying output data within fieldssubtype WIDTH is NATURAL; -- for specifying widths of output fields-- Standard Text Filesfile INPUT: TEXT open READ_MODE is "STD_INPUT";file OUTPUT: TEXT open WRITE_MODE is "STD_OUTPUT";-- Input Routines for Standard Typesprocedure READLINE (file F: TEXT; L: inout LINE);procedure READ (L: inout LINE; VALUE: out BIT; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out BIT);procedure READ (L: inout LINE; VALUE: out BIT_VECTOR; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out BIT_VECTOR);procedure READ (L: inout LINE; VALUE: out BOOLEAN; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out CHARACTER; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out CHARACTER);procedure READ (L: inout LINE; VALUE: out INTEGER; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out INTEGER);procedure READ (L: inout LINE; VALUE: out REAL; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out REAL);procedure READ (L: inout LINE; VALUE: out STRING; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out STRING);procedure READ (L: inout LINE; VALUE: out TIME; GOOD: out BOOLEAN);procedure READ (L: inout LINE; VALUE: out TIME);-- Output Routines for Standard Typesprocedure WRITELINE (file F: TEXT; L: inout LINE);procedure WRITE (L: inout LINE; VALUE: in BIT;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0);procedure WRITE (L: inout LINE; VALUE: in BIT_VECTOR;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0);procedure WRITE (L: inout LINE; VALUE: in BOOLEAN;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0);procedure WRITE (L: inout LINE; VALUE: in CHARACTER;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0);procedure WRITE (L: inout LINE; VALUE: in INTEGER;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0);procedure WRITE (L: inout LINE; VALUE: in REAL;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0;DIGITS: in NATURAL := 0);procedure WRITE (L: inout LINE; VALUE: in STRING;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0);procedure WRITE (L: inout LINE; VALUE: in TIME;JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0;UNIT: in TIME := ns);-- File Position Predicatesfunction ENDLINE (L: in LINE) return BOOLEAN;end TEXTIO;
8位全加器如下:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all;entity Add2In isport( D1 : in std_logic_vector(7 downto 0);D2 : in std_logic_vector(7 downto 0);Q : out std_logic_vector(8 downto 0);Clk : in std_logic); end entity;architecture beha of Add2In is begin process(Clk)beginif Clk'event and Clk = '1' thenQ <= ('0' & D1) + D2;end if; end process; end beha;
编写测试文件。
在测试程序中, 首先读出输入文件的一行内容,再从该行中提取出两个值输入加法器。从预定结果文件中提取出一个值,将加法器计算结果与该值比较, 若两者不同则输出警告信息。也可以将输出写入一个文本文件,再比较两个文本文件的异同以获知出错的地方。这里要注意的是要使用TEXTIO 程序包, 另外, 测试文件实体内的端口为空,相当于一块独立的电路板。使用Component 在其中包含了上面定义的加法器,该独立的电路板所完成的功能是对设计的加法器进行测试。在程序中使用了assert 断言语句,要注意该语句后的表达式或变量为真时不执行后续的输出,为假时执行后续的输出。在程序中,还使用了类型转换函数CONV _ STD _LOGIC_VECTOR (),将整数转换为8 位的标准类型。另外,在程序中定义了变量Dlatch ,该变量的作用是将计算结果与预定结果的比较延迟一个时钟周期, 周期地与预定结果比较。
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_signed.all; USE std.textio.all;ENTITY Add2In_vhd_tst IS END Add2In_vhd_tst; ARCHITECTURE Add2In_arch OF Add2In_vhd_tst ISSIGNAL Clk : STD_LOGIC := '0'; SIGNAL D1 : STD_LOGIC_VECTOR(7 DOWNTO 0):=(others => '0'); SIGNAL D2 : STD_LOGIC_VECTOR(7 DOWNTO 0):=(others => '0'); SIGNAL Q : STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL SResult : INTEGER; SIGNAL OutData : INTEGER; SIGNAL Dlatch : boolean := false;COMPONENT Add2InPORT (Clk : IN STD_LOGIC;D1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);D2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);Q : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)); END COMPONENT; BEGINi1 : Add2InPORT MAP (Clk => Clk,D1 => D1,D2 => D2,Q => Q);init : PROCESS(Clk) BEGIN Clk <= not Clk after 10ns; END PROCESS init;always : PROCESS FILE InputD : text open read_mode is "TestData.dat";FILE OutputD : text open write_mode is "OutData.txt";VARIABLE Dline : LINE;VARIABLE Rline : LINE;VARIABLE Data1 : INTEGER;VARIABLE Data2 : INTEGER;VARIABLE OutData : INTEGER; BEGIN WAIT UNTIL Clk'event and CLk = '1';readline(InputD, Dline);read(Dline, Data1);read(Dline, Data2);D1 <= conv_std_logic_vector(Data1, 8);D2 <= conv_std_logic_vector(Data2, 8);OutData <= conv_integer(Q);writeline(OutputD, Rline);write(Rline, OutData); END PROCESS always; PROCESS FILE InputR : text open read_mode is "Result.dat"; VARIABLE Rline : LINE; VARIABLE Result : INTEGER; BEGINWAIT UNTIL Clk'event and Clk = '1';Dlatch <= true;if Dlatch thenreadline(InputR, Rline);read(Rline, Result);SResult <= Result;if(SResult /= Q) thenassert false report "Two values are different"severity warning;end if;end if; END PROCESS;END Add2In_arch;
TEXTIO 使得VHDL 的仿真功能有了大的飞跃, 在使用VHDL 描述处理器等模型及判断系统对不规则输入的响应时,起到了非常大的作用。本文通过简单的实例,说明了TEXTIO 库及其简单的应用流程。在当前嵌入式系统广泛应用的背景下,将更为需要TEXTIO 的应用。
引用地址:http://www.eefocus.com/article/08-03/9143280903334AkJ.html
转载于:https://www.cnblogs.com/xd-elegant/p/3982318.html
VHDL学习之TEXTIO在仿真中的应用相关推荐
- modelsim仿真中 do文件的写法技巧
Modelsim之 DO文件简介 网上的关于DO文件的编写好像资料不多,比较杂,所以本人总结一下常用的简单语法,方便大家查看.其实本人也刚接触DO文件没多久,有纰漏很正常,欢迎指正批评,互相学习.PS ...
- 【ROS】中级操作学习整理-gazebo机器人仿真
系列文章目录 ·[ROS]中级操作学习整理-gazebo机器人仿真 ·[ROS]中级操作学习整理-TF坐标变换 ·[ROS]中级操作学习整理-传感器建模 ·[ROS]中级操作学习整理-激光SLAM 目 ...
- 一生一芯 预学习阶段 搭建verilator仿真环境 之 示例:双控开关
一生一芯 预学习阶段 搭建verilator仿真环境 之 示例:双控开关 1.前言 一生一芯预学习 中需要安装4.210版本Verilator,通过git方式下载所需要版本. 2.步骤 1.官网链接: ...
- 用于强化学习的自动驾驶仿真场景highway-env(3): rewards,graphics
在用于强化学习的自动驾驶仿真场景highway-env(2): obs,action,dynamics中,我们详细说明仿真环境中的环境如何构建, 车辆的action都有哪些,如何对车辆进行运动学建模以 ...
- 【强化学习炼金术】李飞飞高徒范麟熙解析强化学习在游戏和现实中的应用
在新智元上一篇文章中,Jim Fan(范麟熙)介绍了强化学习的概念和目的.今天是<强化学习炼金术>Introduction第三讲. 在这一课里,Jim Fan会跟各位炼金术师们聊一聊游戏中 ...
- 使用Quartus13进行VHDL工程的编写与仿真
使用Quartus13进行VHDL工程的编写与仿真 四川师范大学工学院·徐浩宇 2021.4.19 编写代码 点击新建一个工程 选择工程保存的路径,填写工程名称,注意,三个圈起来的应该相同 与上一步的 ...
- 卫星工具包在分布式仿真中的实时控制研究
卫星工具包在分布式仿真中的实时控制研究 刘成国,祁 飞 摘 要:提出了基于STK-RTI 的分布式仿真架构,给出了具体的时间同步策略:然后介绍了基于STK/ Connect 模块的网络通信原理和编程实 ...
- HFSS学习笔记——Vivaldi天线仿真(一)
HFSS学习笔记--Vivaldi天线仿真(一) Vivaldi天线简介 Vivaldi 天线是一种行波天线,具有端射特性,其导体贴片上开有渐变.非周期性的开槽.其上电流沿槽线分布,不同的工作频率对应 ...
- 计算机仿真模拟在装配,飞机装配仿真中数字人模型及工人姿态的模拟
飞机装配仿真中数字人模型及工人姿态的模拟 由于飞机的结构及其制造工艺复杂,制造过程中的工艺性问题和人机问题时有发生.采用数字人和计算机仿真技术,模拟飞机制造中工人的作业姿势,为在生产准备阶段提前发现这 ...
最新文章
- MindSpore网络模型类
- HTML+CSS基础(2)-HTML标签的简单介绍和网页注释
- (转载)Unity中解析ini配置文件----INIParser
- 汇总运行在Hadoop YARN上的开源系统
- jtessboxeditorfx 界面显示不出来_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示...
- 事半功倍的验证码漏洞处理:真牛到了南极,牛逼到了极点
- android整合极光im与极光推送,极光IM + 极光推送,集成中遇到的问题
- 改名后火速递表,飞天云动冲刺国内元宇宙第一股,借力能否成功?
- Docker自学笔记 (二)
- Tanzu Observability by Wavefront Spring Boot Starter
- IT桔子分布式项目2
- 破解Excel2013密码设置工作表保护
- 华为p10关闭更新_华为P10正常升级和强制降级详细方法
- redis生成自增流水号每天自动从头开始
- C++学习笔记(四)~substr()函数
- 一个老股民的炒股心得
- 深度学习中patch的意思
- EasyUI datagrid 动态加载表头和数据
- 【学习汇编语言】王爽的汇编语言书中更改字母大小写的一道题
- 微信公众号配置服务器地址并配置url