Vivado中Clocking Wizard生成时钟无法作为系统输入的解决问询
问题分析与解决方案
错误根源
你当前代码的核心问题是将Clocking Wizard的输出信号映射到了实体的输入端口mclk_i——VHDL中输入端口仅能从外部接收信号,不允许被内部模块赋值,这直接违反了端口方向规则,导致编译报错。
修正后的代码实现
我们需要通过内部信号承接Clocking Wizard生成的时钟,再将该信号分配给需要的输出端口和内部逻辑:
entity clk_generator is port( clk : in std_logic; -- 100MHz输入时钟 mclk_o : out std_logic; -- 22.579MHz输出时钟 bclk : out std_logic; -- MCLK/8 lrclk : out std_logic -- MCLK/64 ); end clk_generator; architecture Behavioral of clk_generator is -- 声明Clocking Wizard组件 component clk_wiz_0 port ( mclk : out std_logic; clk_in1 : in std_logic ); end component; -- 内部信号:承接Clocking Wizard生成的22.579MHz时钟 signal mclk_internal : std_logic; -- 计数器信号 signal bclk_counter : integer range 0 to 7 := 0; signal lrclk_counter : integer range 0 to 63 := 0; begin -- 例化Clocking Wizard,生成22.579MHz时钟 clk_gen : clk_wiz_0 port map( clk_in1 => clk, mclk => mclk_internal ); -- 将内部时钟输出到mclk_o端口 mclk_o <= mclk_internal; -- 生成bclk(MCLK/8) process(mclk_internal) begin if rising_edge(mclk_internal) then if bclk_counter = 7 then bclk_counter <= 0; bclk <= not bclk; else bclk_counter <= bclk_counter + 1; end if; end if; end process; -- 生成lrclk(MCLK/64) process(mclk_internal) begin if rising_edge(mclk_internal) then if lrclk_counter = 63 then lrclk_counter <= 0; lrclk <= not lrclk; else lrclk_counter <= lrclk_counter + 1; end if; end if; end process; end Behavioral;
关键说明
- 内部信号的作用:
mclk_internal作为Clocking Wizard输出和内部逻辑的桥梁,既可以直接输出到mclk_o,也能作为后续时钟域逻辑(比如上升沿检测)的时钟源。 - 时钟域同步:所有基于22.579MHz的逻辑(包括计数器、上升沿检测)都必须在
mclk_internal的时钟进程中实现,确保时序正确性。 - 端口清理:移除了原本多余的
mclk_i输入端口,因为该时钟是内部生成的,无需外部输入。
内容的提问来源于stack exchange,提问作者Alvaro Suarez Menendez
相关产品推荐
相关产品推荐

