FPGA+DSP SRIO通信(四)——中断系统(一)

本文介绍FPGA如何通过SRIO向DSP发送中断,重点探讨6678 DSP的中断系统,包括系统事件、SRIO中断与系统事件的关系及映射方法,涉及ICRR、ICSR和ICCR寄存器的作用,并给出中断配置的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这学期一直在忙项目的事情,没什么时间写博客,最近过年闲下来,会把之前欠的内容补上。

目录

(本文的基础是FPGA能向DSP发送doorbell类型的包。)

从上一节FPGA+DSP SRIO通信(三)——基于LSU的数据传输我们已经了解到了如何将数据通过SRIO,以LSU的方式传输。而现实的数据传输任务中除了传输数据,还需要传输中断。例如,使用FPGA将一段视频传输给DSP,除了需要传输数据,还需要在传输一帧数据之后,向DSP发送中断,以告知CPU—— “DSP的存储空间中数据已经存在,请及时读取”。这便是中断最常用的场景。

1、6678的中断系统

1.1、系统事件

在谈SRIO的中断系统之前,先说一说6678DSP中断系统。
C6678的CPU中断是由C66x CorePac Interrupt Controller配置的。该中断控制器(C66x CorePac Interrupt Controller),下文直接称66x中断控制器

66x中断控制器允许将最多128个系统事件映射到12个CPU中断上(CPUINT4 - CPUINT15),或映射到CPU异常,或映射到高级仿真逻辑上。。

上面说的CPU异常和高级仿真逻辑都不是今天的重点,我们最重要的,要理解的概念是——系统事件,系统事件包括核上产生的事件以及片级事件(也就是 外设产生的中断事件)。

额外的系统事件被路由到每个C66x CorePac,以提供额外的芯片级事件,因为CPU中断/异常作为仿真事件被路由到中断控制器,所以额外的系统事件也可以走这条路 。此外,错误类事件或不常使用的事件也通过系统事件路由器路由,以减轻C66x CorePac中断选择器的负担。 这是通过芯片级中断控制器(CIC)块完成的,CIC使用的时钟是CPU主频的六分之一。

事件控制器由简单的组合逻辑组成,为每个C66x CorePac提供附加事件,加上EDMA3CC,CIC0和CIC1为每个C66x CorePac提供17个附加事件和8个广播事件,CIC2提供26个和24个附加事件给 EDMA3CC1和EDMA3CC2,CIC3分别为EDMA3CC0和HyperLink提供8个和32个附加事

### FPGADSP间基于SRIO的门铃中断机制 在FPGADSP间的通信中,为了确保高效的数据传输并及时通知DSP有新数据到达或特定事件发生,采用了门铃(Doorbell)中断机制。当FPGA需要向DSP发送消息或指示某些条件已满足时,会触发这种特殊的中断。 #### 门铃中断的工作原理 门铃中断允许FPGA通过设置个专门设计的状态位来告知DSP某个操作已完成或是存在待处理的任务。旦状态位置位,就会激活连接到DSP的硬件线路,从而引起后者执行相应的服务程序[^1]。 具体来说,在支持SRIO协议的情况下,FPGA可以构建并向DSP发出种称为“doorbell packet”的特殊报文。这类报文并不携带实际的有效载荷而是用来唤醒远端设备上的软件组件以便其能够查询新的情况或准备接受后续到来的信息流[^2]。 #### 实现方法 要实现在FPGA侧发起针对DSP的门铃中断请求,需遵循如下几个方面: - **配置CIC+INTC模块**:这是指完成对核心互联控制器(Core Interface Controller, CIC) 和内部嵌入式中断控制器(Internal Nested Vectored Interrupt Controller, INTC) 的初始化工作,使得它们准备好接收来自外部源如SRIO链路上产生的各类事件的通知。 - **编写Verilog/VHDL代码片段** 下面给出段简单的VHDL伪码作为例子展示如何定义个函数用于创建doorbell packets并通过指定通道将其传递给目标节点(DSP): ```vhdl -- 定义个过程用于生成并发送doorbell包 procedure send_doorbell_packet ( signal srio_channel : out std_logic_vector; constant destination_id : integer := DESTINATION_ID; -- DSP ID constant doorbell_value : integer := DOORBELL_VALUE -- 自定义值 ) is begin -- 构造doorbell包头部信息 construct_header(srio_channel, "DOORBELL", destination_id); -- 添加doorbell有效负载 append_payload(srio_channel, to_stdlogicvector(doorbell_value)); -- 发送整个packet transmit_packet(srio_channel); end procedure; ``` 此段代码展示了怎样封装个doorbell类型的事务,并经由选定的SRIO信道传送给预设的目的地址即DSP实例。每当调用`send_doorbell_packet()` 函数时,它会在两者之间建立次单向通讯路径以传达即时性的控制指令或者同步信号。 #### 处理潜在问题 值得注意的是,在实践中可能会遇到些挑战比如因持续不断地尝试写入而造成的资源争用现象。如果DSP侧未能正常响应,则可能导致FPGA继续无休止地试图更新共享存储器区域进而影响整体性能甚至造成系统崩溃。因此建议加入必要的流量控制措施防止此类状况的发生[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值