Vivado报CLOCK_DEDICATED_ROUTE错误:异步RS锁存器无时钟却报错
解决Vivado中异步RS锁存器的BUFG布局错误
错误原因
Vivado综合器误将异步置位信号S识别为时钟信号,自动为其分配了全局时钟缓冲(BUFG)资源。但S只是普通的异步控制信号,不需要走FPGA的专用时钟布线通道,这种不匹配导致布局工具抛出Place 30-574错误。
你的代码写法加剧了这个误判:进程中q <= aux;仅在R和S都为低电平时执行,这种不完整的输出赋值会让综合器生成非标准的锁存器结构,进一步误导工具的信号类型识别。
修复步骤
1. 修正RS锁存器代码逻辑
正确的异步RS锁存器需要在进程的所有分支中都更新输出信号,确保电路行为符合预期,同时避免综合器误判。修正后的代码如下:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity RSlatch is Port ( R, S : in std_logic; Q : out std_logic ); end RSlatch; architecture Behavioral of RSlatch is signal aux : std_logic := '0'; -- 改用signal而非variable,更符合VHDL设计规范 begin process (R, S) begin if R = '1' then aux <= '0'; elsif S = '1' then aux <= '1'; end if; -- 当R/S都为0时,aux保持原值,无需额外赋值 Q <= aux; -- 每次进程触发都更新输出 end process; end Behavioral;
注意:将原代码中的
variable改为signal,这是VHDL设计中存储状态的标准做法,variable的生命周期和作用域容易引发意外行为。
2. 添加约束强制禁用时钟专用布线(可选)
如果修正代码后仍出现该错误,可以在你的.xdc约束文件中添加以下命令,明确告诉工具R和S不是时钟信号,禁止为它们分配专用时钟布线:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets S_IBUF] set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets R_IBUF]
官方不建议长期使用该约束,优先通过修正代码逻辑让综合器正确识别信号类型。
内容的提问来源于stack exchange,提问作者Marcu Petric
相关产品推荐
相关产品推荐

