MicroBlaze通过AXI_GPIO接收gen_data模块中断失效问题求助
问题分析与解决方案
核心问题
你的gen_data模块输出的out_data信号仅会被置为高电平,之后没有拉低动作,导致信号持续保持高电平。而AXI_GPIO的中断(默认多为边沿触发)需要信号存在电平跳变(如低→高的上升沿)才能触发,按键模块因有按下/松开的电平变化能满足触发条件,而你的模块输出无跳变,因此中断无法触发。
具体修改方案
修改gen_data模块,生成脉冲信号
修改代码让out_data产生1个时钟周期的高电平脉冲,确保每次计数到目标值时,信号有明确的上升沿和下降沿:entity generate_data is port ( clk : in std_logic; out_data : out std_logic ); end generate_data; architecture Behavioral of generate_data is begin process (clk) variable counter : integer := 0; begin if rising_edge(clk) then -- 默认拉低输出,仅在计数达标时输出1个时钟周期的高脉冲 out_data <= '0'; counter := counter + 1; if counter = 100000 then out_data <= '1'; counter := 0; end if; end if; end process; end Behavioral;该修改后,
out_data每1ms(100MHz时钟下,100000个周期)产生一次1时钟周期的高脉冲,刚好能触发AXI_GPIO的上升沿中断。确认AXI_GPIO中断配置
- 在Vivado块设计中双击AXI_GPIO核,检查中断触发模式,确保设置为上升沿触发(若需电平触发也可调整,但脉冲触发更稳定)。
- 确认MicroBlaze驱动代码中已正确使能该AXI_GPIO的中断位,并配置好中断服务函数。
重新验证流程
重新综合、实现设计,生成比特流后下载到FPGA中测试中断触发情况。
内容的提问来源于stack exchange,提问作者Andry
相关产品推荐
相关产品推荐

