VHDL中txt文件的读写

2024-04-09 15:32
文章标签 读写 txt vhdl

本文主要是介绍VHDL中txt文件的读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文转载:  https://blog.csdn.net/love_ljq/article/details/53637597


在对VHDL代码进行ModelSim仿真的时候,如果测试一个比较简单的功能,比如简单地测试一个IPCore,那么我们只需要

signalName <= x"01"; wait for cam_period*5; 
signalName <= x"10"; wait for cam_period*5;
  • 1
  • 2

类似的代码就可以满足我们的要求。 
  但是呢,假如你要测试一个大的COMPONENT,或者是测试一个数据序列,抑或是一个图像,那么这时候,通过文件读取数据将会使工作简单很多。与此同时,为了保存试验结果,也常常用到文件。尤其是对于FPGA的图像处理,文件读取必不可少。首先将一副正常图像转换为一个txt文件,然后作为FPGA的输入,经过处理的图像数据再保存成txt文件,再将这个txt文件转换为图像,这样就可以直观地看到图像处理的效果了。 
  那么今天笔者就来讲一下VHDLtxt文件的读取和写入。

file_open(file_status,FILE_OUT,"data_record.txt",write_mode);
  • 1

  上面那句代码是整个文件读取与写入系统中最重要的,意思是以write Mode形式打开“data_record.txt”这个文档。 
  TXT文本的读写方式一共有三种,分别是READ_MODEWRITE_MODEAPPEND_MODE。按照字面意思就可以理解,分别是读取模式、写入模式与扩展模式。APPEND_MODEWRITE_MODE的区别在于,WRITE_MODE会清除掉文本中原来存在的内容,而APPEND_MODE不会。

file_open(file_status,FILE_OUT,"data_record.txt",read_mode);
file_open(file_status,FILE_OUT,"data_record.txt",append_mode);
  • 1
  • 2

这是另外两种模式。

--读取数据
stim_process : process(cam_clk)
variable i : integer:= 0;
file TEST_IN  : TEXT;
variable LINE_IN: line;
variable dat_in : std_logic_vector(31 downto 0);
beginif(rst_n = '0' and dataIn = '0') thenfile_open(TEST_IN, "image-binary-data.txt", READ_MODE);dataIn <= '1';elsif(rising_edge(cam_clk)) thenif((i mod ((512*135) + 300)) < 300) thenvs_i <= '0';elsevs_i <= '1';end if;if (((i mod ((512*135) + 300)) < 300) or (((i mod (512*135+300))-300) mod 135) < 7) thenhs_i <= '0';dv_i <= '0';da_i <= (others => '0');elsehs_i <= '1';dv_i <= '1';readline(TEST_IN, LINE_IN);read(LINE_IN, dat_in); da_i <= dat_in;end if;i := i + 1;end if;
end process;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

  这是从 image-binary-data.txt 读取数据的一个过程,当然其中还包含了一个判断的过程,只在某些时刻才会从文本中读取数据。 
  在这边有一个小技巧,就是设置一个标志signal,这里我设置的是 dataIn , 设置其初始值为'0',当文本打开之后,将该signal设置为’1’,在 rst_n = '0'以及dataIn = '0' 这两个条件都满足的情况下才进行文本的打开,之后就开始进行文本按行地读取,并输入到下一个COMPONENT中。
  下面介绍一下文本的写入。

--保存输出数据
process(cam_clk)
FILE FILE_OUT : TEXT;
variable file_status:file_open_status;
variable buf:LINE;
beginif(rst_n = '0' and dataOut = '0') thenfile_open(file_status,FILE_OUT,"data_record.txt",write_mode);file_close(FILE_OUT);file_open(file_status,FILE_OUT,"data_record.txt",append_mode);dataOut <= '1';elsif(rising_edge(cam_clk))thenif(dv_o='1') thenwrite(buf,da_o);writeline(FILE_OUT,buf);end if;if(sim_end = '1') thenfile_close(FILE_OUT);end if;end if;
end process;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

  和上面的代码一样,这里也有一个dataOut的标志signal,在rst_n = '0' and dataOut = '0' 这两个要求同时满足的时候才打开文本。但是看到在 rst_n = '0' and dataOut = '0' 这个条件下面做了四件事情,打开文本,再关闭,再打开,然后将标志signal‘1’,而且两次打开的模式不同,一次是write_mode,一次是append_mode,为什么要这样处理呢。下面给大家讲一下这个缘由。 
  文本打开了,肯定是要关闭的,那如果用write_mode这种模式打开的话,file_close(FILE_OUT)的时候,也就是文本关闭的时候,文本中只会留下一行数据。而换成append_mode这种模式的话,在file_close(FILE_OUT)的时候,之前写入文本的数据都会留下来。那为什么先要用write_mode这种模式打开呢,我用这种模式打开了,然后再关闭,整个文档里的内容就清除了,就可以保证接下去操作的是空文本,这就是先用write_mode打开的原因。 
  要注意的是,在写入的状态下,在没有关闭文本的情况下,文本的大小一直是0K,但是呢,打开还是能看到文本中的数据信息的,里面的数据也可以复制出来,但是这些数据并不真正存在于这个文本中,这个文本也被ModelSim占用,不能复制,剪切等操作。 
  这里设置了一个结束仿真的标志signal sim_end,这个默认值也是‘0’。有两种用法,一个是在仿真代码里写明什么情况这个signal置一,比如延时多少之后,或者是某个标志位变化了之类的。还有一种比较暴力,就是利用ModelSimsignalForce,觉得仿真了一段时间差不多了,就将该值强制Force‘1’,然后文本就关闭了,仿真就结束了。 
  在write_modeappend_mode的时候,要写入的文本是会自动生成的,不需要事先生成,这样就比较方便,比如说仿真的时候,把输出文档命名成时间,或者是跟更改参数有关的文件名,多仿真几次之后再去处理这些生成的文本。 
  要提醒的是,输入进来的数据和输出的数据都是二进制数据,所以要先用Matlab或者是Visual Studio等工具先将数据转换成二进制数据。同理,输出的数据也要先转换为普通数据,才能很好地去观察其特性。 


这篇关于VHDL中txt文件的读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888535

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

Python脚本:TXT文档行数统计

count = 0 #计数变量file_dirs = input('请输入您要统计的文件根路径:')filename = open(file_dirs,'r') #以只读方式打开文件file_contents = filename.read() #读取文档内容到file_contentsfor file_content in file_contents: