Vhdl 如何向控制台写入自定义数组类型

Vhdl 如何向控制台写入自定义数组类型,vhdl,Vhdl,我对VHDL相当陌生,我正在运行一段代码中的一些片段,以了解它在做什么。我想在控制台中看到一个自定义数组类型,但在尝试编写它时,我得到了一个错误 entity hello_world is end entity hello_world; library STD; library IEEE; use IEEE.std_logic_1164.all; use STD.text

我对VHDL相当陌生,我正在运行一段代码中的一些片段,以了解它在做什么。我想在控制台中看到一个自定义数组类型,但在尝试编写它时,我得到了一个错误

entity hello_world is 
end entity hello_world;

library STD;                          
library IEEE;                        
use IEEE.std_logic_1164.all;           
use STD.textio.all;                  
use IEEE.std_logic_textio.all;         
use IEEE.numeric_std.all;                                    

architecture test of hello_world is 

    type row_type is array(0 to 2)  of std_logic_vector(3 downto 0);
    type new_type is array(0 to 1)  of row_type;
    signal  max_new : new_type := (others => (others => (others => '0')));

    begin
    my_print :  process is                  
        variable my_line : line;    
        begin
            write(my_line, string'("Value of max_new"));      
            write(my_line, max_new);    
            writeline(output, my_line);            
            wait;
    end process my_print;
end architecture test;
我在运行模拟时遇到的错误是:
错误:“max\u new”附近的类型错误:应为“std\u ulogic”类型。错误:模式inout的形式“l”必须具有关联的实际值。错误:形式“值”没有实际值或默认值。错误:索引名称前缀类型“void”不是数组类型

如果我理解正确,行类型是一个大小为3的数组,在每个位置我有一个由4位组成的向量。新的_类型是一个大小为2的数组,在每个位置我都有一个row_类型,它是一个大小为3的数组,每个位置有一个4位向量。这是正确的吗?因为它被初始化为0,所以我只希望看到它

我使用Vivado 2018.3进行模拟

任何帮助都将不胜感激

std.textio的函数write可以将以下参数作为值():

  • 钻头
  • 比特向量
  • 布尔值
  • 性格
  • 整数
  • 真实的
  • 时间
IEEE.std_logic_textio将std_logic及其派生项添加到此列表中,但数组不由write处理

您可以这样打印阵列:

my_print :  process is                  
  variable my_line : line;    
begin
  write(my_line, string'("Value of max_new"));
  for I in 0 to 1 loop
    for J in 0 to 2 loop 
      write(my_line, max_new(I)(J));
    end loop;
  end loop;    
  writeline(output, my_line);            
  wait;
end process my_print;

您也可以编写自己的编写过程:

实体hello\u world是
世界末日;
--图书馆标准;
图书馆IEEE;
使用IEEE.std_logic_1164.all;
使用STD.textio.all;
使用IEEE.std_logic_textio.all;
--使用IEEE.numeric_std.all;
hello_world的架构测试是
类型行类型是标准逻辑向量(3到0)的数组(0到2);
type new_type是行类型的数组(0到1);
信号最大新:新类型:=(其他=>(其他=>(其他=>“0”);
过程写入(l:inout行;新类型\值:在新类型中)为
开始
写(l,字符串“(”);
对于新_类型“范围循环”中的i
写(l,字符串“(”);
对于行中的j_类型“范围循环”
写(l,字符串“(”);
写入(l,新类型值(i)(j));
写(l,字符串“(”);
如果j/=row_type'正确,则
写入(l,字符串“(“,”));
如果结束;
端环;
写(l,字符串“(”);
如果i/=new_type'正确,则
写入(l,字符串“(“,”));
如果结束;
端环;
写(l,字符串“(”);
结束程序;
开始
我的照片:
过程是
变量my_line:line;
开始
写入(我的行,字符串'(“max_new=”的值);
写(我的行,马克斯新);
writeline(输出,my_行);
等待
结束我的打印过程;
终端架构测试;
ghdl-r hello\u world
最大新值=((“0000”、“0000”、“0000”)、(“0000”、“0000”、“0000”))
使用先前存在的写过程重载作为构建块

您还可以使用特定于类型的字符串转换,消除对Synopsys软件包std_logic_textio的依赖,并引入使用报表语句的功能:

ieee库;
使用ieee.std_logic_1164.all;
使用std.textio.all;
hello\u world的架构无标准逻辑文本是
类型行类型是标准逻辑向量(3到0)的数组(0到2);
type new_type是行类型的数组(0到1);
信号最大新:新类型:=(其他=>(其他=>(其他=>“0”);
--对于VHDL版本<-2008:
函数到_字符串(inp:std_逻辑_向量)的返回字符串为
变量image_str:字符串(1到inp'长度);
别名输入\u str:std\u逻辑\u向量(1到inp'长度)是inp;
开始
对于输入_str'range循环中的i
图像(i):=字符值(标准逻辑)图像(输入(i));
端环;
返回图像;
末端功能;
函数到\u字符串(nt:新\u类型)返回字符串为
变量l:直线;
开始
写(l,字符串“(”);
对于新_类型“范围循环”中的i
写(l,字符串“(”);
对于行中的j_类型“范围循环”
写(l),“,”到字符串(nt(i)(j))&'”;
如果j/=row_type'正确,则
写入(l,字符串“(“,”));
如果结束;
端环;
写(l,字符串“(”);
如果i/=new_type'正确,则
写入(l,字符串“(“,”));
如果结束;
端环;
写(l,字符串“(”);
返回l.all;
末端功能;
开始
我的照片:
过程是
变量my_line:line;
开始
写入(我的行,字符串'(“max_new=”的值);
写入(我的行,到字符串(max_new));
writeline(输出,my_行);
报告LF&HT和“max_new=”和to_字符串(max_new);
等待
结束我的打印过程;
终端架构无标准逻辑文本;
这演示了写入
输出和报告语句:

ghdl-r hello\u world
最大新值=((“0000”、“0000”、“0000”)、(“0000”、“0000”、“0000”))
hello_world.vhdl:95:9:@0ms:(报告注释):
最大新值=((“0000”、“0000”、“0000”)、(“0000”、“0000”、“0000”))

这正是我需要的,谢谢。为了便于记录,这是输出:max_new 0000的值