发明内容
本发明的目的在于克服以上所述的DMA通过类似APB总线读取再访问内存的缺点。
根据第一方面,本发明提供一种用于DMA内存访问的片上系统,包括低速模块、DMA控制器、总线仲裁单元和内存,其特征在于低速模块与DMA控制器之间采用DMA接口,该DMA接口包括工作在低速模块时钟下的第一D触发器和工作在DMA控制器时钟下的同步器和第二D触发器,其中:第一D触发器,用于产生翻转信号以作为低速模块和DMA控制器之间的握手信号;同步器,用于将所述翻转信号在低速模块时钟和DMA控制器时钟之间进行同步;第二D触发器,用于将时钟同步后的翻转信号延迟;以及异或门,用于将所述时钟同步后的翻转信号与延迟后的翻转 信号异或,产生脉冲信号以便DMA控制器通过总在仲裁单元向内存发起DMA请求。
根据第二方面,本发明提供一种片上系统的DMA内存访问方法,所述片上系统包括低速模块、DMA控制器、总线仲裁单元和内存,该低速模块与DMA控制器之间采用DMA接口,该DMA接口包括工作在低速模块时钟下的第一D触发器和工作在DMA控制器时钟下的同步器和第二D触发器,所述方法包括:产生翻转信号以作为低速模块和DMA控制器之间的握手信号;将所述翻转信号在低速模块时钟和DMA控制器时钟之间进行同步;将时钟同步后的翻转信号延迟;以及将所述时钟同步后的翻转信号与延迟后的翻转信号异或,产生脉冲信号以便DMA控制器通过总线仲裁单元向内存发起DMA请求。
本发明采用翻转信号作为握手信号,可以方便的支持诸如跨时钟域的DMA请求。并且,DMA模块将该请求标准化为内部数据总线信号,便于集成和复用。由于没有采用APB总线,数据读写所需要的等待时间可预计。
具体实施方式
针对DMA通过类似APB总线读取低速模块寄存器再访问内存的缺点,本发明提出一种DMA控制器和一般低速模块之间的直接DMA请求,并支持跨时钟域特性。
图2是本发明的低速模块访问内存的示意图。如图2所示,低速模块与DMA控制器之间采用DMA接口,该DMA接口以翻转信号作为握手信号,以便低速模块通过总线仲裁单元向内存发起DMA请求。
接下来,以具备读/写通道的DMA控制器为例,说明根据本发明的DMA接口。假设低速模块为XXX,其工作时钟为xxx_clk;DMA模块工作时钟为dma_clk,并且dma_clk频率>=xxx_clk。需要说明,这里的“低速” 是低速模块相对DMA控制器而言的,并不意味着低速模块自身的速度低。图3是本发明DMA接口的示意性接口信号及其时序图。
首先看DMA模块的写通道。写通道涉及四个信号,分别是xxx_dma_wreq,xxx_dma_wstop,xxx_dma_wdata和dma_xxx_wready。下表是这些信号的属性列表。
信号 |
宽度 |
输入/输出 |
所属时钟 |
xxx_dma_wreq |
1 |
输入 |
xxx_clk |
xxx_dma_wstop |
1 |
输入 |
xxx_clk |
xxx_dma_wdata |
数据宽度 |
输入 |
xxx_clk |
dma_xxx_wready |
1 |
输出 |
xxx_clk |
其中,xxx_dma_wreq是低速模块向DMA控制器发出的写请求信号。xxx_dma_wstop是低速模块向DMA控制器发出的写停止信号。xxx_dma_wdata是低速模块向DMA控制器发出的待写入内存的数据。dma_xxx_wready是DMA控制器向低速模块发出的写准备好信号。
图4是根据本发明一个实施例的低速模块写内存的接口逻辑示意图。如图4所示,该写内存接口逻辑包括工作在低速时钟xxx_clk下的第一D触发器,以及工作在DMA时钟dma_clk下的同步器和第二D触发器。
第一D触发器的作用在于,当写数据准备好的时候,产生xxx_dma_wreq。xxx_dma_wreq是一组翻转握手信号。这里之所以采用翻转信号作为握手是因为可以方便的进行跨时钟域处理,而不需要更复杂的信号。当低速的XXX模块需要通过DMA控制器来写内存,XXX模块首先将xxx_dma_wdata送上数据总线,然后将xxx_dma_wreq信号翻转一下。
同步器的作用在于将xxx_dma_wreq信号同步一定时钟以消除亚稳态影响,获得wreq_s2。在一个例子中,同步器由两个串联的D触发器组成。
第二D触发器将wreq_s2信号在dma_clk时钟域延迟一个时钟(wreq_s3)和wreq_s2做一个异或,来获得一个请求的脉冲信号wreq_pulse。也就是说,实现从翻转信号到脉冲信号的转换。
之后,就可以利用该请求的脉冲信号wreq_pulse来采样xxx_dma_wdata。
在一个优选实施例中,可以在采样xxx_dma_wdata的时候返回一个写准备好dma_xxx_wready信号(未图示)。dma_xxx_wready也是一组翻转握手信号。然后,用xxx_clk对dma_xxx_wready信号同步2个时钟, 再传递给XXX模块,以通知XXX模块,WDATA已经成功采样,可以进行下一次数据传送了。当然,也可以通过固定时间延迟的方式来确定下一次数据传送。
DMA控制器在之后进行内存访问等后续动作。
再看时序图图3。假设T1时刻,XXX模块需要写内存,则首先需要将wdata给出,然后在T2时刻翻转写请求wreq信号,则wreq_s2信号最坏情况在(当dma_clk频率=xxx_clk频率)T4时刻产生,则wreq_pulse在T5时刻产生;故而在T6时刻完成采样;在这之前,T5已经返还dma_xxx_wready信号,通过2次同步以后则T7时刻可以回到XXX模块端;XXX模块在T8时刻可以进行下一次传输。因此一次传输周期最多为7个(当xxx_clk频率=dma_clk时)。如果xxx_clk频率较小,则这个传输周期可以进一步缩短。
在一个例子中,信号xxx_dma_wstop表明XXX模块需要结束DMA请求,DMA控制器需要将缓存中的任意长度的来自XXX模块的数据写入内存。这个信号在如下场景中有较多作用:串口从外部接收不定长数据,每收到例如1个字节,就传给DMA控制器,DMA控制器的缓存中满足例如4个字节就写入内存。当串口检测到一定时间没有收到新的数据,则认为外部通信停止,就通过xxx_dma_wstop信号通知DMA控制器,则DMA控制器将缓存中的不到4个字节的数据立刻全部写入内存。
然后,看DMA模块的读通道。读通道涉及三个信号,xxx_dma_rreq,xxx_dma_rdata,dma_xxx_rready。下表是这些信号的属性列表。
信号 |
宽度 |
输入/输出 |
所属时钟 |
xxx_dma_rreq |
1 |
输入 |
xxx_clk
|
xxx_dma_rdata |
数据宽度 |
输出 |
xxx_clk
|
dma_xxx_rready |
1 |
输出 |
xxx_clk
|
xxx_dma_rreq信号是低速的xxx模块向DMA控制器发出的读请求信号。xxx_dma_rdata是低速的xxx模块待读取的数据信号。dma_xxx_rready是DMA控制器向xxx模块发出的准备好信号。
图5是根据本发明一个实施例的低速模块读内存的接口逻辑示意图。图5的读内存的接口逻辑和图4的写内存的接口逻辑结构相似,不同之处仅在于方向不同。其中,握手中rreq的同步机制与写通道的wreq一 样,故此不复赘述。但读通道的差别在于,dma_xxx_rready信号同时对应dma_xxx_rdata,告知XXX模块,dma_xxx_rdata已经有效,可以读取了。
结合图3的时序图可以看到,当低速的xxx模块在时刻T1向DMA控制器发出读请求之后,需要等待直至DMA控制器从内存中读出相关数据。当DMA控制器在例如T8时刻读到数据,则在接下来的T9时刻发出dma_xxx_rready信号,基于该dma_xxx_rready产生rready_pulse,通知低速模块读取数据。下一次的读请求也是通过翻转读请求信号xxx_dma_rreq完成。
本发明采用翻转信号作为握手信号,可以方便的支持跨时钟域DMA请求。并且DMA模块将该请求标准化为内部数据总线信号,便于集成和复用。但是,每个低速模块和DMA控制器之间必须增加一个DMA接口,而不是直接利用同一的内部低速总线(类APB总线)。
此外,需要指出,本发明同样可适用于同时钟域的DMA请求。由于是同时钟域,同步器将不再需要。
显而易见,在此描述的本发明可以有许多变化,这种变化不能认为偏离本发明的精神和范围。因此,所有对本领域技术人员显而易见的改变,都包括在本权利要求书的涵盖范围之内。