队伍编号: CICC1842
在SoC设计中一个重要通信方式就是中断,中断可以避免轮询方式造成的cpu空转消耗,可以更好利用cpu资源。蜂鸟e203中提供了plic外部中断总线进行中断的控制与配置,但在demo中已经被外设全部占用。为了避免较多更改rtl代码造成的不必要的bug,我们没有更改这些外设中断,e203在说明中明确指出可以支持最高1024个中断源,因此我们对plic中断信号进行扩展。具体需要修改的文件为/perips/sirv_plic_top.v,修改如下
加入后,对e203进行打包,如下图所示,其中usr_irq_0和usr_irq_1为扩展的外部中断端口,可以在Block Design中连接外设中断信号。
连接后,为了测试中断是否成功连接,需要对其进行板级验证,本次验证依然使用axi-gpio作为辅助,使能gpio2以及中断,将gpio2作为输入使用,连接到DDR200T上的按键,每当我们按下按键,即会触发中断,进入中断程序。Block Design连接如下图所示,其中gpio中断连接到usr_irq_0上。
软件部分,可以通过对IDE中提供的例程进行修改,从而完成对中断的配置。本例中使用软件部分如下,首先对gpio进行配置,再利用PLIC_Register_IRQ函数对中断进行配置。函数原型为int32_t PLIC_Register_IRQ(uint32_t source, uint8_t priority, void *handler),共有三个参数和一个返回值:source参数指明了中断号,本例中加入的usr_irq_0和usr_irq_1分别是17和18;priority指明了中断的优先级;handler为函数指针,指向中断服务程序;返回值可以为-1或0,若为0即中断设置成功,否则失败。
此外,对于扩展的中断而言,还需要在hbirdv2.h头文件中将__PLIC_INTNUM改为此时的中断数量,本实验中加入了两个中断扩展,因此将该参数改为19.
对于中断服务程序,需要指明的是,由于e203的中断是边沿触发,对于电平触发的中断,需要尽快将中断清空,否则会影响正常使用。最终程序如下
按下按键后可以在串口中进行观察,可以判断中断设置成功。