EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) D4 t" s( k- p3 A
所有的入门的屌丝都是知道处理器中断模式是两种是边沿触发和电平触发。
" L3 s; T# R* j1 @/ e2 C& H1 L* H 边沿触发用的很少,一般还是以下降沿触发为主。当设备完成一个数据后,会输出一个下降沿,触发处理器。而电平触发,是输出一个电平,并且会保持这个电平, 至到系统处理或者清除该中断后才会输出另外的电平。 1 |' y# J3 z7 d
在fpga经常会遇到AXI总线或者AVALON总线,总线接口经常是电平触发。如果fpga一端是主控一端。需要设计中断触发状态机以及清除中断操作。
2 Z% M2 F1 R: ]* I. Ualways@(clk) begin if(rst) ... else if(irq) state <= irq_state; else case (state) .... end
/ T a) j# B q8 r1 W; S 上述代码,目测是没有问题,但是问题就是irq是电平触发,代码会一直在if(irq)中,不会进入case语句,这个会导致irq一直没办法清除,一直代码死在if(irq)中。
) T/ i8 c5 w4 U0 ~- {: d. Z% | 解决上述办法,一个是得到irq边沿触发,如果高电平有效,就是上升沿。如果是低电平,就是下降沿。 . P" E/ c+ M r9 U
所以代码就是 if(rst) else if(irq_rising) ... else case(state)
4 n. [0 t. I4 K c, M# g 这个状态也会导致一个问题,就是如果进入正常的状态,转移到这个状态,会导致数据全部变乱。当然,用轮询状态机会好点。也就是说在状态机中使用轮询irq是否高电平。 + ^' P1 {- V% `( k4 z2 {! c b
case(state) idle : normal_irq_sw: begin if(normal_req) 。。。 else if(irq) state <=irq——state end % \, J# V5 q+ i, O
|