Lattice ICE5LP下VHDL实例化SB_IO_OD出现VHDL-1358错误求助
Lattice ICE5LP RGB引脚作普通输入的VHDL综合错误分析
问题背景
使用Lattice Ultra ICE5LP器件,尝试将某RGB引脚作为普通输入端口in1_i,通过VHDL实例化SB_IO_OD模块实现,但Lattice综合工具报错:
in1_i with mode 'in' cannot be updated. VHDL-1358
相关代码片段:
library sb_ice40_components_syn; use sb_ice40_components_syn.components.all; entity design is port ( ... add_i : in std_logic_vector(3 downto 0); in1_i : in std_logic; dat_b : inout std_logic_vector(7 downto 0); ... ); end design; architecture rtl_design of design is signal sig1_s : std_logic; .... PINA6: SB_IO_OD generic map ( NEG_TRIGGER => '0', PIN_TYPE => "001001" ) port map ( DIN0 => sig1_s, -- 内部处理信号 OUTPUTENABLE => '0', PACKAGEPIN => in1_i );
错误原因
核心是端口模式与模块需求不匹配:
- 实体中
in1_i被声明为in模式,VHDL中该模式的端口是只读属性,只能作为外部信号输入到内部逻辑,不允许被内部模块驱动或修改。 SB_IO_OD是Lattice的IO缓冲模块,其PACKAGEPIN端口对应芯片物理引脚,本质是双向可访问的(即使只用做输入,模块也需要通过这个端口完成外部信号的读取,而in模式端口无法满足这种底层关联需求)。将in模式端口连接到PACKAGEPIN,相当于试图让内部模块“更新”只读端口,违反了VHDL的端口模式规则,因此触发VHDL-1358错误。
解决方法
- 修改端口模式:将实体中
in1_i的模式改为inout(即使只用做输入,inout模式才能满足SB_IO_OD模块对引脚的底层访问需求):in1_i : inout std_logic; - 保持输出使能配置:维持
SB_IO_OD的OUTPUTENABLE为'0',这样模块会保持输入方向,不会驱动外部引脚,完全符合将其作为普通输入的需求。
内容的提问来源于stack exchange,提问作者Renato
相关产品推荐
相关产品推荐

