目前在嵌入式开发中,嵌入式cpu成为比较热门的开发方式,在FPGA中嵌入一个cpu核,并且可以按需添加一些cpu的外设。用专门的编译器编译C语言 后直接在cpu中运行,将逻辑控制与算发集成在一块芯片上,大大缩短了产品的开发周期。然而,在数字信号处理中的算法由纯粹的c语言实现速度是一个很大的 问题。而直接用vhdl实现算法,可以大大提高信号的处理速度,比如fft需要大量的运算,而用vhdl硬件实现,可以在很少的时钟周期内完成一个 1024点的fft。然而从算法到vhdl的转换却是很麻烦的事,Xinlix AccelDSP为此问题提供了支持。
System Generator可以在matlab simulink实现仿真验证设计,可以将设计生成ISE的工程,还可以通过share memory生成EDK的IP核,在EDK中直接加入工程,然后可以通过指针对其进行数据读写操作,就像读写存储器一样方便。 AccelDSP可以将matlab描述的算法直接转换为vhdl语言描述的模块,也可以转换为,System Generator的一个模块。大大简化了从算法描述到vhdl的转换。 下面以一个的在指纹图像细化处理中的一个简单的算法函数介绍一下,AccelDSP与System Generator的联合使用。 首先,打开AccelDSP,新建一个工程名为thin的工程,点击软件左边蓝色区域如下图所示的图标。 然后在下图所示中选择“create new project”,工程名为thin,将已经编写好的thin.m文件和thinscript2.m文件加入到工程。 然后点击OK完成创建工程,点击窗口左边的verify floating point,选择脚本文件thinscript2.m,以一个二值化的简单矩阵验证细化功能: data=[0 0 0 0 1 1 0 0 0; 1 1 1 1 1 1 1 1 0; 1 1 1 1 1 1 1 0 0; 0 0 1 1 1 1 0 0 0; 1 0 1 1 1 0 0 0 0; 1 1 1 1 1 0 0 0 0; 0 0 1 1 1 0 0 0 1; 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1]; thin模块部分代码如下: function f=thin(din,start) persistent x; persistent flag; persistent delflag1; persistent delflag2; if isempty(x) x=zeros(1,9); end if isempty(flag) flag=0; end if isempty(delflag1) delflag1=0; end if isempty(delflag2) delflag2=0; end ..................... ...算法实现部分(略) verify floating point完成后,得到的结果如下图所示: 由图可见,该模块实现了图片细化的功能。 此时,可以在窗口的中间见到如下图所示得工程设计文件的结构: 下面进一步完成设计,先选择好器件型号,在此使用spartan3e-xc3s500e-fp320-4 50MHz,Flow选择system Generator。 下一步,点击Analyze完成后点击Generate Fixed Point后得到一个生成报告,包括输入,输出和设计所用到的变量的定点量化信息。 然后点击verify fixed point得到的结果与前面floating point 几乎一致。说明通过了定点数的验证。 接着点击Generate RTL,通过后点击Verify RTL,通过后可以看到入下图所示的图标出现: 此时点击此图标根据提示选择好相应的目录就可以生成在System Generator的模块了。 紧接着启动matlab2007a,打开sumilink,点击xilinx blockset,可以看到刚才生成的模块,如下图: 然后新建一个.mdl文件,命名为thincore.mdl,将此模块添加进去,并加入share memory中的“to regester”和“from regester”,然后加入Basic Elements中的System Generator模块,添加一个index中的EDK processor,按下图所示连接好各个模块: 然后双击EDK processor,将10个寄存器添加到memory map中点击OK。双击System Generator,按下图所示选择好后点击Generate就可以生成EDK的ip核了。 在生成的目录下面找到pcores文件夹。将其中的文件夹复制到EDK的工程目录下面的pcore文件夹中去。然后打开已经建好的xps工程,在IP Catalog下出现了一个Project Local pcores。点开可以看到一个IP核,将其,加入到工程中,并将起连接到plb总线上,选择好地址空间,自动生成地址。然后点击Device Configuration->update bitstream,更新比特文件。 运行完成后,新建一个software project编写代码,并初始化thincore_plbw核。其初始化程序如下: void Initialize_thincore() { xc_iface_t *iface; xc_to_reg_t *face_x1,*face_x2,*face_x3; xc_to_reg_t *face_x4,*face_x5,*face_x6; xc_to_reg_t *face_x7,*face_x8,*face_xp,*face_start; xc_from_reg_t *face_del; xc_create(&iface, &THINCORE_PLBW_ConfigTable[0]); xc_get_shmem(iface, "x1", (void **)&face_x1); xc_get_shmem(iface, "x2", (void **)&face_x2); xc_get_shmem(iface, "x3", (void **)&face_x3); xc_get_shmem(iface, "x4", (void **)&face_x4); xc_get_shmem(iface, "x5", (void **)&face_x5); xc_get_shmem(iface, "x6", (void **)&face_x6); xc_get_shmem(iface, "x7", (void **)&face_x7); xc_get_shmem(iface, "x8", (void **)&face_x8); xc_get_shmem(iface, "x9", (void **)&face_xp); xc_get_shmem(iface, "start", (void **)&face_start); xc_get_shmem(iface, "del", (void **)&face_del); x1 = (Xuint32 *) face_x1->din; x2 = (Xuint32 *) face_x2->din; x3 = (Xuint32 *) face_x3->din; x4 = (Xuint32 *) face_x4->din; x5 = (Xuint32 *) face_x5->din; x6 = (Xuint32 *) face_x6->din; x7 = (Xuint32 *) face_x7->din; x8 = (Xuint32 *) face_x8->din; xp = (Xuint32 *) face_xp->din; start = (Xuint32 *) face_start->din; del = (Xuint32 *) face_del->dout; } 其中x1~xp为全局变量,分别指向thincore核的各个端口的映射地址。 初始化后就可以在C语言程序中直接用指针对端口进行读写。一个实际的指纹图片细化结果如下图所示: 可见,在算法上实现了指纹细化的功能。而且在实际中相对于直接用C语言实现大大提高了指纹细化的速度。 至此,完成了从matlab算法描述自动到vhdl的实现,最后到嵌入式cpu核调用的实现的一个简单的应用。 http://www.eefocus.com/myspace/blog/show_154691.html
|
文章评论(0条评论)
登录后参与讨论