VHDL-文件读写

VHDL-文件读写

在使用FPGA进行数字信号的时候经常要用到matlab对FPGA设计运行的结果进行验证,因此就需要在仿真的时候把modelsim运行的结果写入文件,事后可以用matlab分析验证。
VHDL对文件操作包括创建文件,写入,读取。其实在仿真的时候还可以结合modelsim的控制台,更方便的完成仿真。
参考博文,在此感谢:
1、VHDL中的文件I/O
2、VHDL中的文件I/O
VHDL有4中数据对象:
常量:constant
变量:variable
信号:signal
文件:file
其中文件(file)是不能被综合的,且只能声明在进程内,其余三种可以被综合。
变量能被综合,但变量不对应实际的物理线路,它通过对FPGA内部的存储空间的访问实现其功能,因此只能声明在进程内。
常量可以声明在进程内也可以声明在进程外,因为它可以对应实际的物理线路也可以通过FPGA内部的存储器实现。
信号对应实际的物理线路,只能声明在进程外。如果声明在进程内,仿真都过不去,modelsim会提示该信号不能声明在此区域。如下:
process(rst_n_i, clk_i)
file file1:text;
variable file_status:file_open_status;
variable buf:LINE;
– variable cnt_from_file_r:std_logic_vector(7 downto 0):=(others=>’0’);
variable cnt_from_file_r:natural:=0;
variable file_name:string(1 to 11):=”nihaonihaon”;
constant rst_cnt_stop:natural:=5;
signal rst_cnt_stop2:natural:=5;
begin

编译时modelsim提示的错误如下:
Signal declaration ‘rst_cnt_stop2’ not allowed in this region.

1.
1、文件类型有两种,一种是integer,文中的数据是以二进制存取的,不易查看(也可以通过ultraedit来查看)
另一种就是文本类型(text),数据以ASCii码存储,文本类型的数据容易查看。
定义文件:
file romData:text; //定义一个文件

2、文件打开有4中状态:
open_ok:打开成功
status_error:打开失败
name_error:名字错误
mode_error:打开模式失败
用file_open_status类型的数据来表示文件状态,声明方式如下:
variable file_status:file_open_status

3、line类型,是以行的形式写入或读取数据的,还能借助于line来实现把integer,natural,bit_vector等类型的数据写入text类型的文件,下面有介绍。
声明形式:variable buf:line;

文件操作:
打开文件:file_open
写入文件:write,writeline
读取文件:read,readline
关闭文件:file_close
file_open(file_open_status,file_fid,file_name,mode);
file_open_status:文件打开的状态
file_fid:文件句柄(file声明)
file_name:文件名字(string类型,如:”data.txt”)
mode:打开的类型,write_mode和read_mode

write和writeline的区别:
write只能写对应于文件类型的数据,如text类型只能写string,integer类型只能写integer类型数据
如果要写入integer,natural,std_logic,std_logic_vector类型的数据到text类型文件,就只能使用line来操作,
首先write(buf,std_logic_vector),把要写入的std_logic_vector类型数据写入line类型的buf,
然后通过writeline(file,buf)来写入数据.
read和readline的区别与write和writeline一样。

file_close(file_fid);

对控制台的操作:
writeline(output,buf); //output代表输出数据到控制台,是关键字,buf是line类型,可以理解为一行的意思
readline(input,buf); //input代表从控制台输入数据,是关键字

示例:
向控制台写入数据
signal cnt:natural:=0;
write(buf,cnt);
writeline(output,buf);

从控制台读取数据
readline(input,buf);
write(buf,cnt);

工程示例代码如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
use ieee.std_logic_textio.all;

entity count_tb is
end entity;

architecture rt1 of count_tb is

component count is
port(
--input:
        rst_n_i :in std_logic:='1';
        clk_i   :in std_logic:='0';
--output:       
        cnt_o   :out std_logic_vector(7 downto 0):=(others=>'0')        
);
end component;

signal  rst_n_i : std_logic:='1';
signal  clk_i   : std_logic:='0';
signal  cnt_o   : std_logic_vector(7 downto 0):=(others=>'0');  

signal rst_n_r:std_logic:='0';
signal rst_n_rise:std_logic:='0';
signal rst_cnt:natural:=0;



type status_type is (s_idle,  s_write,  s_write_end,  s_read_begin,   s_read,   s_end);
signal c_status:status_type:=s_idle;

signal cnt_from_file:std_logic_vector(7 downto 0):=(others=>'0');

begin

    count_inst:count port map
    (
        rst_n_i =>  rst_n_i,
        clk_i   =>  clk_i,
        cnt_o   =>  cnt_o
    );

    rst_n_i<='1',
             '0' after 100 ns,
             '1' after 200 ns,
             '0' after 1 us,
             '1' after 1100 ns,
             '0' after 2 us,
             '1' after 2100 ns,
             '0' after 3 us,
             '1' after 3100 ns,
             '0' after 4 us,
             '1' after 4100 ns,
             '0' after 5 us,
             '1' after 5100 ns,
             '0' after 6 us,
             '1' after 6100 ns;

    clk_i<=not clk_i after 10 ns;

    process(rst_n_i, clk_i)
    file file1:text;
    variable file_status:file_open_status;
    variable buf:LINE;
    --  variable cnt_from_file_r:std_logic_vector(7 downto 0):=(others=>'0');
    variable cnt_from_file_r:natural:=0;
    variable file_name:string(1 to 11):="nihaonihaon";
    constant rst_cnt_stop:natural:=5;
    begin
    if rising_edge(clk_i) then
        case c_status is
        when s_idle     =>      c_status<=s_write;
                                file_open(file_status,file1,"data_record.txt",write_mode);                              

        when s_write    =>      if rst_cnt>=rst_cnt_stop then
                                    c_status<=s_write_end;                                  
                                else
                                    c_status<=s_write;
                                end if;
                                write(buf,cnt_o);
                                writeline(file1,buf);

        when s_write_end  =>    file_close(file1);
                                c_status<=s_read_begin;

        when s_read_begin =>    file_open(file_status,file1,"sinWave.txt",read_mode);
                                readline(file1,buf);
                                --read(buf,file_name);
                                writeline(output,buf);
                                c_status<=s_read;

        when s_read     =>      
                                if endfile(file1) then
                                    c_status<=s_end;
                                else
                                    c_status<=s_read;
                                readline(file1,buf);
                                read(buf,cnt_from_file_r);
                                cnt_from_file<=std_logic_vector(to_unsigned(cnt_from_file_r,8));                                    
                                end if;


        when s_end      =>      c_status<=s_end;
                                file_close(file1);

        when others     =>      c_status<=s_end;
        end case;
    else
    null;
    end if;
    end process;

    process(clk_i)
    begin
    if rising_edge(clk_i) then
        rst_n_r<=rst_n_i;
    else
    null;
    end if;
    end process;

    rst_n_rise<=rst_n_i and (not rst_n_r);

    process(clk_i)
    begin
    if rising_edge(clk_i) then
        if rst_n_rise='1' then
            rst_cnt<=rst_cnt+1;
        else
        null;
        end if;
    else
    null;
    end if; 
    end process;

end rt1;

例化的元件count是一个计数器,把计数的结果写入文件data_record.txt文件中,
从另一个存有波形数据的文件sinWave.txt中读取数据。

  • 6
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VHDL语言100例 目录检索: 第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例 属性TRANSACTION和分辨信号 第27例 块保护及属性EVENT, 第28例 形式参数属性的测试 第29例 进程和并发语句 第30例 信号发送与接收 第31例 中断处理优先机制建模 第32例 过程限定 第33例 整数比较器及其测试 第34例 数据总线的读写 第35例 基于总线的数据通道 第36例 基于多路器的数据通道 第37例 四值逻辑函数 第38例 四值逻辑向量按位或运算 第39例 生成语句描述规则结构 第40例 带类属的译码器描述 第41例 带类属的测试平台 第42例 行为与结构的混合描述 第43例 四位移位寄存器 第44例 寄存/计数器 第45例 顺序过程调用 第46例 VHDL中generic缺省值的使用 第47例 无输入元件的模拟 第48例 测试激励向量的编写 第49例 delta延迟例释 第50例 惯性延迟分析 第51例 传输延迟驱动优先 第52例 多倍(次)分频器 第53例 三位计数器与测试平台 第54例 分秒计数显示器的行为描述6 第55例 地址计数器 第56例 指令预读计数器 第57例 加.c减.c乘指令的译码和操作 第58例 2-4译码器结构描述 第59例 2-4译码器行为描述 第60例 转换函数在元件例示中的应用 第61例 基于同一基类型的两分辨类型的赋值相容问题 第62例 最大公约数的计算 第63例 最大公约数七段显示器编码 第64例 交通灯控制器 第65例 空调系统有限状态自动机 第66例 FIR滤波器 第67例 五阶椭圆滤波器 第68例 闹钟系统的控制 第69例 闹钟系统的译码 第70例 闹钟系统的移位寄存器 第71例 闹钟系统的闹钟寄存器和时间计数器 第72例 闹钟系统的显示驱动器 第73例 闹钟系统的分频器 第74例 闹钟系统的整体组装 第75例 存储器 第76例 电机转速控制器 第77例 神经元计算机 第78例ccAm2901四位微处理器的ALU输入 第79例ccAm2901四位微处理器的ALU 第80例ccAm2901四位微处理器的RAM 第81例ccAm2901四位微处理器的寄存器 第82例ccAm2901四位微处理器的输出与移位 第83例ccAm2910四位微程序控制器中的多路选择器 第84例ccAm2910四位微程序控制器中的计数器/寄存器 第85例ccAm2910四位微程序控制器的指令计数器 第86例ccAm2910四位微程序控制器的堆栈 第87例 Am2910四位微程序控制器的指令译码器 第88例 可控制计数器 第89例 四位超前进位加法器 第90例 实现窗口搜索算法的并行系统(1)——协同处理器 第91例 实现窗口搜索算法的并行系统(2)——序列存储器 第92例 实现窗口搜索算法的并行系统(3)——字符串存储器 第93例 实现窗口搜索算法的并行系统(4)——顶层控制器 第94例 MB86901流水线行为描述组成框架 第95例 MB86901寄存器文件管理的描述 第96例 MB86901内ALU的行为描述 第97例 移位指令的行为描述 第98例 单周期指令的描述 第99例 多周期指令的描述 第100例 MB86901流水线行为模型 VHDL收藏参考资料.part1.rar (5.72 MB, 下载次数: 1436 ) VHDL收藏参考资料.part2.rar (5.72 MB, 下载次数: 1257 ) VHDL收藏参考资料.part3.rar (5.72 MB, 下载次数: 988 ) VHDL收藏参考资料.part4.rar (5.72 MB, 下载次数: 1140 ) VHDL收藏参考资料.part5.rar (2.88 MB, 下载次数: 1008 ) 资料内容不断更新和增加中。。。 fpga , VHDL , 例程 , 资料
VHDL是一种硬件描述语言,主要用于电子设计自动化中的硬件描述和仿真。它的主要应用领域包括集成电路设计、嵌入式系统设计和通信系统设计等。 要实现VHDL中的偏移读写文件,可以借助于VHDL的文件操作功能。首先,需要使用file类型来声明要操作的文件,并使用open函数打开文件。然后,可以使用read过程从文件中读取数据,或使用write过程将数据写入文件中。 实现偏移读取文件操作可以使用seek过程,通过指定文件和文件指针的偏移量来定位需要读取的数据位置。通过设置文件指针位置,可以在文件中随意跳转,从而实现偏移读取文件的功能。 以下是一个简单的VHDL代码示例,用于实现偏移读写文件的操作: ```vhdl -- 声明文件类型和文件指针 file file_handle: TEXT open WRITE_MODE is "data.txt"; type file_buf is array (natural range <>) of character; variable buf: file_buf(0 to 255); -- 偏移读取文件 procedure read_file(offset: integer; size: integer) is begin -- 设置文件指针位置 seek(file_handle, offset); -- 读取数据 read(file_handle, buf(0 to size-1)); end; -- 偏移写入文件 procedure write_file(offset: integer; size: integer) is begin -- 设置文件指针位置 seek(file_handle, offset); -- 写入数据 write(file_handle, buf(0 to size-1)); end; begin -- 偏移读取文件示例 read_file(10, 20); -- 偏移写入文件示例 write_file(30, 15); -- 关闭文件 close(file_handle); end; ``` 上述代码中,首先声明了一个文件类型file_handle,用于打开名为"data.txt"的文件,并指定操作模式为WRITE_MODE,即可写入模式。然后定义了一个file_buf类型的变量buf,用于存储读取或写入的数据。 在主程序中,通过调用read_file和write_file过程,分别实现了偏移读取和偏移写入文件的功能。偏移量和数据大小作为参数传入这两个过程,通过设置文件指针的位置来实现偏移操作。最后,通过close过程关闭文件。 这样,我们就可以使用VHDL实现偏移读写文件的操作了。需要注意的是,以上代码仅为示例,实际应用中还需要根据具体需求进行适当的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值