首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quartus II支持line.all吗?

Quartus II支持line.all吗?
EN

Stack Overflow用户
提问于 2014-11-20 21:40:58
回答 1查看 499关注 0票数 2

我实现了一些VHDL代码,在编译时导出FSM状态编码,这些代码可以被Xilinx ChipScope读取。这个功能在XilinxISE14.7、iSim 14.7和Mentor的QuestaSim 10.2c上进行了测试。我的设计也可以与另一种顶级的Altera相结合,但是Quartus II似乎对return line.all;有问题。

Quartus II (14.0)错误消息:

  • 错误(10351):VHDL子程序体错误在sata_PhysicalLayer.vhdl(504):函数"dbg_GenerateEncodings“并不总是返回一个值
  • 错误(10346):debug.vhdl的VHDL错误(47):形式端口或参数“编码”必须有实际值或默认值
  • 错误(10657):sata_PhysicalLayer.vhdl(514)的VHDL子程序错误:未能详细说明对子程序"dbg_ExportEncoding“的调用

在下面,我将描述我的代码。

VHDL码

该设计使用3个函数导出FSM状态编码:

  1. 将当前本地FSM状态编码为二进制值-> dbg_EncodeState。 (此函数的结果连接到ILA端口)
  2. 将本地FSM的所有状态转换为分号分隔字符串-> dbg_GenerateEncodings。
  3. 格式化此字符串并将其元素写入令牌文件-> dbg_ExportEncoding (此功能位于一个包中)

FSM声明:

代码语言:javascript
复制
TYPE T_STATE IS (
    ST_HOST_RESET,
    ST_HOST_SEND_COMRESET,
    ST_HOST_SEND_COMRESET_WAIT,
    [...]
    ST_HOST_SEND_ALIGN,
    ST_HOST_TIMEOUT,
    ST_HOST_LINK_OK
);

-- OOB-Statemachine
SIGNAL State                    : T_STATE       := ST_HOST_RESET;
SIGNAL NextState                : T_STATE;

本地函数-每个实体函数

代码语言:javascript
复制
function dbg_EncodeState(st : T_STATE) return STD_LOGIC_VECTOR is
begin
    return to_slv(T_STATE'pos(st), log2ceilnz(T_STATE'pos(T_STATE'high) + 1));
end function;

function dbg_GenerateEncodings return string is
  variable l : STD.TextIO.line;
begin
    for i in T_STATE loop
        STD.TextIO.write(l, str_replace(T_STATE'image(i), "st_host_", ""));
        STD.TextIO.write(l, ';');
    end loop;
    return  l.all;
end function;

全局函数-在debug.pkg.vhdl:中定义

代码语言:javascript
复制
impure function dbg_ExportEncoding(Name : STRING; encodings : string; tokenFileName : STRING) return BOOLEAN is
    file        tokenFile : TEXT open WRITE_MODE is tokenFileName;

    variable cnt, base : integer;
    variable l : line;
begin
    report "Exporting encoding of '" & Name & "' to '" & tokenFileName & "'..." severity note;
    report "dbg_ExportEncoding: '" & encodings & "'" severity note;

    -- write file header
    write(l, "# Encoding file for '" & Name & "'"); writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);
    write(l, "# ChipScope Token File Version");     writeline(tokenFile, l);
    write(l, "@FILE_VERSION=1.0.0");                writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);
    write(l, "# Default token value");              writeline(tokenFile, l);
    write(l, "@DEFAULT_TOKEN=");                    writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);

    -- write state entires
    cnt  := 0;
    base := encodings'left;
    for i in encodings'range loop
        if encodings(i) = ';' then
            -- Leave the str_trim call in!
            -- Otherwise, the new parser of ISE 14.7 fails to slice properly.
            write(l, str_trim(encodings(base to i-1)));
            write(l, character'('='));
          write(l, raw_format_nat_hex(cnt));
            writeline(tokenFile, l);
            cnt  := cnt + 1;
            base := i+1;
        end if;
    end loop;

    file_close(tokenFile);
    return true;
end function;

代码的最后一部分是实体中的一个虚拟常量,它调用导出函数:

代码语言:javascript
复制
CONSTANT test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");

使用辅助函数:

  • log2ceilnz(x)计算所需的位以二进制方式编码x符号。
  • to_slv将所有内容转换为std_logic_vector;在本例中,整数转换为slv。
  • str_replace用字符串替换字符串
  • str_trim从str‘’low返回一个字符串到NUL的第一次出现
  • raw_format_nat_hex将自然字符串格式化为十六进制字符串。

附加说明:

所有的vhdl文件都标记为VHDL-2008.

我的问题:

  1. 有没有人在Quartus环境中使用过line.all?
  2. 有解决办法吗?
  3. 是否有更好的解决方案来完成导出任务而不使用恒定长度的字符串?

工作范围:

我将函数dbg_GenerateEncodings封装在一个generate语句中:

代码语言:javascript
复制
genXilinx : if (VENDOR = VENDOR_XILINX) generate
  function dbg_GenerateEncodings return string is
  [...]

  constant test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");
begin
end generate;

与XST不同,Quartus不检查generate块中的函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 22:55:34

参见Quartus II VHDL支持,第14节预定义语言环境,表条目14.3,Support,最右边的列VHDL 1993支持:

支持。无法合成文件I/O;因此忽略对TEXTIO函数的调用。

如果您不能使用TEXTIO进行合成,您可以想象一个指向行缓冲区的指针可能也没有任何用处。

有一个问题是如何从FPGA写入文件。不了解主机操作系统或指定物理接口。

您可以通过对不受支持的构造进行转换、关闭和转换指令来综合设计的其余部分。见VHDL综合属性和指令

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27050091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档