一切的入门的屌丝都是知道处理器中止形式是两种是边缘触发和电平触发。
边缘触发用的很少,一般仍是以下降沿触发为主。当设备完结一个数据后,会输出一个下降沿,触发处理器。而电平触发,是输出一个电平,并且会坚持这个电平, 至到体系处理或许铲除该中止后才会输出别的的电平。
在fpga经常会遇到AXI总线或许AVALON总线,总线接口经常是电平触发。假如fpga一端是主控一端。需求规划中止触发状况机以及铲除中止操作。
always@(clk)
begin
if(rst)
…
else if(irq)
state <= irq_state;
else case (state)
….
end
上述代码,目测是没有问题,可是问题便是irq是电平触发,代码会一向在if(irq)中,不会进入case句子,这个会导致irq一向没方法铲除,一向代码死在if(irq)中。
处理上述方法,一个是得到irq边缘触发,假如高电平有用,便是上升沿。假如是低电平,便是下降沿。
所以代码便是
if(rst)
else if(irq_rising)
…
else case(state)
这个状况也会导致一个问题,便是假如进入正常的状况,转移到这个状况,会导致数据悉数紊乱。当然,用轮询状况时机好点。也便是说在状况机中运用轮询irq是否高电平。
case(state)
idle :
normal_irq_sw:
begin
if(normal_req)
。。。
else if(irq)
state <=irq——state
end