1

我用 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]

表达式如何超出范围?这个消息很奇怪。


是否有另一种方法来获取循环的范围,具体取决于当前行的长度?

4

0 回答 0