我在编译时实现了一些VHDL代码来导出FSM状态编码,这可以通过Xilinx ChipScope回读。此功能通过Xilinx ISE 14.7,iSim 14.7和Mentor Graphic的QuestaSim 10.2c进行测试。我的设计可以使用替代的顶层以及Altera FPGA进行综合,但Quartus II似乎遇到return line.all;
的问题。
Quartus II(14.0)错误消息:
在下文中,我将描述我的代码。
该设计使用3个函数导出FSM状态编码:
FSM声明:
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;
本地功能 - 每个实体功能:
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中定义:
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;
代码的最后一部分是实体中的虚拟常量,它调用导出函数:
CONSTANT test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");
使用了辅助功能:
附加说明:
所有vhdl文件都标记为VHDL-2008。
我将函数dbg_GenerateEncodings包装在generate语句中:
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不检查生成块内的函数。
答案 0 :(得分:1)
参见Quartus II VHDL Support,第14节预定义语言环境,表项14.3,构造TEXTIO,最右边的列VHDL 1993支持:
支持的。文件I / O无法合成;因此,致电TEXTIO 函数被忽略。
如果您无法使用TEXTIO进行合成,您可以想象一个指向行缓冲区的指针也可能没有任何用处。
这就是你如何从FPGA写入文件的问题。不了解主机操作系统或指定物理接口。
您可以通过使用translate off和translate指令包含不受支持的结构来设法合成设计的其余部分。请参阅VHDL Synthesis Attributes and Directives。