我用 VHDL 编写了一个JSON解析器。解析器核心使用两个嵌套循环:
1. 遍历所有行直到 EOF
2. 遍历每个 char 直到行结束
为了清除:它不是硬件解析器。解析器用于在综合时读取综合设置以配置实例化实体,例如 UART 模块中的波特率。)
内部循环如下所示:loopj : for j in CurrentLine.all'range loop
Source: JSON.pkg.vhdl
此代码适用于 XST 14.7、iSim 14.7 和 GHDL,但不适用于 Vivado。Vivado 不支持.all
。错误消息是这样的:
错误:[Synth 8-27] 不支持访问类型取消引用 [D:/git/GitHub/JSON-for-VHDL/vhdl/JSON.pkg.vhdl:293]
由于 kraigher 的提示,更新了代码:
@Paebbles 您是否尝试过 foo'range 而不是 foo.all'range?我想我记得它应该隐含地工作。- 克莱格
我之前尝试过,但出现错误。也许这个错误与另一个有关。现在它的工作。所以我当前的 loopj 行看起来像这样:
loopj : for j in CurrentLine'range loop
这条线在 XST、iSim、GHDL 和 QuestaSim 中运行良好,但 Vivado 仍然存在问题:
信息:[Synth 8-638] 合成模块 'Boards2' [.../Boards2.vhdl:16]
错误:[Synth 8-278] 表达式 0 超出范围 [.../JSON.pkg.vhdl:293]
错误:[Synth 8-421] 分配的 rhs 和 lhs 中的数组大小不匹配 [.../Boards2.vhdl:20]
错误:[Synth 8-285] 合成模块“Boards2”失败 [.../Boards2.vhdl :16]
表达式如何超出范围?这个消息很奇怪。
是否有另一种方法来获取循环的范围,具体取决于当前行的长度?