我实现了一些VHDL代码,在编译时导出FSM状态编码,这些代码可以被Xilinx ChipScope读取。这个功能在XilinxISE14.7、iSim 14.7和Mentor的QuestaSim 10.2c上进行了测试。我的设计也可以与另一种顶级的Altera相结合,但是Quartus II似乎对return line.all;有问题。
Quartus II (14.0)错误消息:
在下面,我将描述我的代码。
VHDL码
该设计使用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不检查generate块中的函数。
发布于 2014-11-20 22:55:34
参见Quartus II VHDL支持,第14节预定义语言环境,表条目14.3,Support,最右边的列VHDL 1993支持:
支持。无法合成文件I/O;因此忽略对TEXTIO函数的调用。
如果您不能使用TEXTIO进行合成,您可以想象一个指向行缓冲区的指针可能也没有任何用处。
有一个问题是如何从FPGA写入文件。不了解主机操作系统或指定物理接口。
您可以通过对不受支持的构造进行转换、关闭和转换指令来综合设计的其余部分。见VHDL综合属性和指令。
https://stackoverflow.com/questions/27050091
复制相似问题