wind330

ImpulseC结合SOPC Builder

0
阅读(1958)

ImpulseC结合SOPC Builder (by Wind330)

   


概述

ImpulseC 的优势在于:面向流的处理方式,直接生成可综合的RTL代码,对大量的同步数据信息处理十分便利。而SOPCBuilder简化了系统架构的设计,让开发 人员可以专注于某个具体功能的开发。所以,利用ImpulseC完成数据信号处理,并将生成的RTL加速模块集成至SOPC Builder,作为NiosII的协处理器。

本文讲述ImpulseC是如何将生成的软硬件结合到SOPC Builder,并通过Avalon-MM总线读写RAM存储器。

ImpulseC RTL编码模型

前面提到,ImpulseC是面向流的处理方式,但是光有流(Stream)是不够的,还有,如何读取RAM,如何通过外部信号控制内部逻辑等等。wind330曾仔细看过生成的RTL代码,发现控制信号也是通过流模式输入,最终转换成某个信号值控制内部逻辑。存储接口则不同于控制信号,有专门的外部RAM控制接口,外部RAM控制接口与Stream接口的转换,则需要在*_hw.c代码中体现。

 

外部RAM接口如下:

  ICidata     : out std_ulogic_vector (31 downto 0);
  ICaddr      : out std_ulogic_vector (31 downto 0);
  ICnextaddr  : out std_ulogic_vector (31 downto 0);
  ICwri       : out std_ulogic;
  ICodata     : in  std_ulogic_vector (31 downto 0);
  ICack       : out std_ulogic;
  ICreq       : in  std_ulogic;
  ICmode      : in  std_ulogic;
  ICbase      : in  std_ulogic_vector (31 downto 0);
  ICsize      : in  std_ulogic_vector (2 downto 0);
  ICcount     : in  std_ulogic_vector (31 downto 0);

如果,你需要利用Avalon总线访问外部RAM,ImpulseC会自动添加avalon_dma模块,将外部RAM接口转换为Avalon接口。同理,控制信号也可以再封装avalon_to_stream模块,如此通过Avalon就能访问内部控制信号。

此外,ImpulseC生成外部RAM接口的同时,相应地还会生成一路config_*的输入信号,用于配置Memory接口(DMA)的基地址。

函数 co_architecture co_architecture_create(const char * name,const char * arch,co_function configure,void * arg)用 于通知ImpulseC如何生成处理模块的通信接口,如果第二个参数为"altera_nios2",则外部接口不论stream,signal,还是 memory,所以这些都是通过Avalon总线访问。因此当你需要多种接口类型,如stream用自定义流信号,siganl用外部控制信号,只有 memory可通过avalon访问时,则需根据自己的要求重新编写顶层文件,然后再通过New Component...导入SOPC。当你了解ImpulseC的RTL模型时,这些应该都是比较容易达到的。

ImpulseC软件实现

ImpulseC 根据配置函数及*_sw.c文件,生成相应的C源代码,如果不需要更改RTL代码的话,可以直接导入SOPC,利用Nios2测试RTL功能。在软件代码 中,co_stream,co_memory等定义为一系列的结构体,通过co_stream_read/write或者 co_memory_readblock/writeblock等函数与RTL模块交互。下面wind330主要描述co_memory的初始化过程。

每个流、信号、存储器创建(用co_stream/signal/memory_create()函数创建)时都有自己的专属名称,ImpulseC生成基于SOPC的Core时,基地址的命名都与上述名称相关:

流与信号命名规则为"USER_LOGIC_结构名_MODULE_0_P_进程名_专属名称_BASE";

存储器命名规则为"USER_LOGIC_结构名_MODULE_0_P_CONFIG_BASE" (当有两个不同的co_memory时不适用);

所以,在需要重新创建SOPC Component时,元件名以及总线名需要遵循原先的命名规则,否则配置会不成功。

co_init.c 文件完成对信号、流、存储器等的初始化,其中,nr_impc_write()函数将co_memory_create()分配的内存空间基地址通过 CONFIG接口初始化DMA相应的地址寄存器;co_memory_ptr()返回基地址值;而信号名,大小等信息都放在结构体co_memory中。

其他函数参照帮助"Codeveloper User Guide"中的"Function Reference"。

声明

wind330也是凭着兴趣学习这个工具,一是能力有限,有错误的话多多理解;二是文字功力也很差,很多地方觉得没有说清楚;但是欢迎大家一起讨论学习。