精华内容
下载资源
问答
  • 你可以采用现成的标准微处理器来构建模糊逻辑系统。传统的微处理器对于大多数应用来说是足够的,即使是模糊逻辑,但对于需要可预测且非常快速响应...本文将阐述模糊逻辑系统的组成部分,并给出如何采用DSP实现的
  • 众所周知,汇编语言具有更高的性能优势,而用C语言编码则能更容易和快速地实现DSP处理器功能的不断增强以及编译器优化技术的提高,使得传统的用汇编语言编写DSP应用程序的做法逐渐被淘汰。现在的DSP应用程序几乎都...
  • 众所周知,汇编语言具有更高的性能优势,而用C语言编码则能更容易和快速地实现DSP处理器功能的不断增强以及编译器优化技术的提高,使得传统的用汇编语言编写DSP应用程序的做法逐渐被淘汰。现在的DSP应用程序几乎都...
  • 如何通过网络接口实现 DSP 片外 Flash 在线系统编程 摘要文章针对传统设计采用 RS232 作为数据传输手段而造成的速度过慢的问题设计 了一种通过 网络 接口使用一种特殊的 UDP 包对 BF531 片外 Flash 在线系统编程的...
  • 一共分为四部分,CCS 编程入门,实现 FFT(Fast Fourier Transformation),实现 DMA 和 Interrupt,实现 Host 和 DSP 通信,作为一个ccs入门课程是个不错的选择。
  • 前者是指数字信号处理的理论和方法,后者则是指用于数字信号处理的可编程微处理器。TMS320F240 系列是在TMS320F2000TM 平台下的一种定点DSP 芯片,是专为数字电机控制和其他控制应用系统而设计的16位定点运算的DSP。...
  • 想用遗传算法实现函数最大极值的求取,如何DSP28335编程实现
  • 摘要:主要介绍在TMS320C54X DSP如何实现扩展精度的乘法、IIR滤波器的基本原理和算法实现,以及二阶级联IIR滤波器应用于均衡器的具体编程实现。  关键词:TMS320C54X 扩展精度 IIR滤波器 TMS320C54X(以下简称...
  • DSP的混合编程

    千次阅读 2011-03-30 20:48:00
    1 存储空间的分配 对TM S320LF240x DSP 混合编程设计而言, 首先必须对其存储空间组成及如何分配有深入地了解。TM S320LF240x DSP 的存储空间分为程序存储空间、数据存储空间和I/O存储空间,并在各个存储...

    一,混合编程的基本环境

    在进行混合编程控制之前, 首先要为其创造一个运行的基本环境。这个基本环境包括存储空间的分配、DSP寄存器映射地址的定义以及中断向量的定义等方面。

    1 存储空间的分配

    对TM S320LF240x DSP 混合编程设计而言, 首先必须对其存储空间组成及如何分配有深入地了解。TM S320LF240x DSP 的存储空间分为程序存储空间、数据存储空间和I/O存储空间,并在各个存储空间中存储着相应的变量或指令。后缀名为.CMD 的命令文件实现了对程序存储器空间和数据存储器空间的分配, 该文件中常使用的伪指令有MEMORY和SECTIONS。MEMORY 伪指令用来标示实际存在目标系统中且可以被使用的存储器范围; SECTIONS 伪指令的作用则是: 描述输入段怎样被组合到输出段内;在可执行程序内定义输出段; 规定在存储器内何处放置输出段; 允许重命名输出段。下面给出了命令文件的示例。

    MEMORY (存储器的分配)

    {

    PAGE 0: vector: origin= 0, length=0x50

    (第0 页为中断向量区, 起始地址= 0, 长度= 50h)

    PAGE 0: PROG: origin= 0x1000, length= 0x0F000

    ( 第0 页为外部程序存储器, 起始地址= 1000h, 长度=F000h)

    PAGE1: DATA: origin= 0x8000, length= 0x8000

    ( 第1 页为外部数据存储器, 起始地址= 8000h, 长度=8000h)

    }

    SECTION S

    {

    . vectors: {}> vector PAGE 0 (中断向量在第0 页)

    . text: {}> PROG PAGE 0 (程序区段在第0 页)

    . data: {}> PROG PAGE 0 (. data 数据区在第0 页)

    . cinit: {}> PROG PAGE 0 (复位定义在第0 页)

    . bss: {}> DATA PAGE 1 (. bss 数据区段在第1 页)

    }

    2 DSP 寄存器映射地址的定义

    TM S320LF240x DSP 的各个模块中都有相应功能的寄存器, 虽然各个寄存器的地址已经指定, 但其所需空间并没有分配, 因此需要在后缀名为.H 的头文件中, 按照各寄存器给定地址严格分配空间。寄存器位于不同的存储空间, 其地址声明方法以及写控制字的操作也是不同的。例如定时器1 比较寄存器(T1CMPR) 是处于数据存储器空间的寄存器, 其地址为7402h。在头文件中的定义如下:

      “# define T1CMPR (volatile unsigned int* ) 0x7402”

    如果要将控制字“0x4000”放入T 1CM PR 中时, 在C 语言程序中只需写入“*T1CMPR =0x4000”即可。而处于I/O空间FFFFh 的等待状态发生器控制寄存器(WSGR) , 其定义方式如下:

      “# define WSGR portFFFF

        ioport unsigned portFFFF; ”

    对于这种类型的寄存器, 只需使用语句“WSGR= 0x0000”将控制字写入即可对其进行控制。

    3 中断向量的定义

    在TM S320LF240x DSP 的各个模块中, 提供了许多相应的中断功能。利用这些中断, 可以更好更有效地控制DSP, 令程序的运行效率更高。复位中断向量(c_int0) 是在实时运行支持库(rts2xx.lib)中定义的一种特殊的中断, 它的作用是先进行软件堆栈, 然后初始化全局变量, 最后调用主程序main()。所以当程序复位(Reset) 时, 应跳转到c_int0 进行相应的处理。中断向量表则是将主程序中用到的中断子程序和相应中断级别类型连接起来的一个简单的跳转指令表。它是后缀名为ASM 的汇编语言文件, 需要在命令文件中将其声明到程序存储地址空间0000h~0040h

     

    二, 混合编程的关键环节

    对TM S320LF240x DSP 采用混合编程, 关键的问题在于如何在程序中将C 语言和汇编语言结合起来。主要使用两种方法: 直接内嵌式和调用子程序式。

    1 直接内嵌式

    在C 程序中直接内嵌汇编语句是一种最为简单的结合方式。DSP 当中有一些C 语言无法操作的控制位, 需采用这种方式来实现, 例如清中断标志位“CLRC INTM ”。要嵌入汇编, 只需在汇编语句两边加上双引号并用小括号括起来, 前面再加上asm 关键字, 即“ asm (" 汇编语句" ) ; ”。注意汇编语句不能顶着前一个双引号写, 它们之间必须用空格、tab 或标号开头。这种方式虽然操作简单, 但是破坏了C 语言的完整性, 因此只提倡在程序开始的系统初始化部分少量使用, 而在C 语言中嵌入实现某一完整功能的多句汇编语言时,不提倡采用这种方式。

    2 调用子程序式

    在C 语言中调用汇编子程序是另一种混合编程的方式。与内嵌式相比, 这种方式虽然复杂,但是其应用范围更为广泛。在C语言中调用子程序有一定的规范性, 其主要内容如下。

    2. 1 主程序操作

    主程序调用另外一个子程序时需要进行如下的操作(特别注意ARP 已经由编译器自动设置为AR1)。

    1) 主程序把需要向子程序传递的参数按反序压入堆栈, 即最右边的参数最先被压入堆栈, 最左边的参数最后被压入堆栈。

    2) 主程序调用子程序。

    3) 在子程序返回前, ARP 已经被设置为AR1。

    4) 当子程序调用完毕后, 主程序要弹出先前压入堆栈的传递参数。这个操作通过下面的命令语句实现:SBRK n,n 是主程序向子程序传递的参数的个数。

    2. 2 子程序操作

    一个子程序被调用时, 需要进行下面的一些操作(在子程序的入口处, 假设ARP已经被设置为AR1, 这是由C编译器自动完成的)。

    1) 从硬件堆栈中弹出返回地址, 然后把它压入软件堆栈。

    2) 把主程序的数据结构指针FP压入堆栈。

    3) 如果子程序改变了AR6或AR7, 也需要把它们压入堆栈。

    4) 分配局部数据结构。

    5) 执行子程序的实际任务代码。

    6) 如果子程序有返回值, 则把这个返回值放入累加器中。

    7) 设置ARP为AR1。

    8) 解除分配的局部数据结构。

    9) 如果AR6 和AR7 曾经被保存过, 则从软件堆栈恢复它们的值。

    10) 从软件堆栈恢复FP。

    11) 把软件堆栈中存储的返回地址压入硬件堆栈。

    12) 返回。

    如果是C 语言主程序调用C 语言子程序, 则上面所述的调用规范是C 编译器在生成汇编语言代码时自动完成的。但如果是C 语言主程序调用汇编语言子程序时, 汇编子程序中必须遵循前面所述“子程序需要进行的操作”规范进行编写,而“主函数需要进行的操作”则由C 编译器自动完成。

     

    三,混合编程中经常出现的问题及解决方法

     由于混合编程存在一定的难度, 在其过程中经常会出现一系列的问题, 这些问题涉及到编程规范等各方面。本文将从以下几个方面进行介绍。

    1 头文件定义

    头文件的定义有两种方式。第一种是以指针变量的形式定义了各种寄存器, 即采用如下形式:

      “volatile unsigned int T1CMPR (volatile unsigned int * )0x7402”;

    第二种则是用宏定义的方式定义各种寄存器的名称为

      “# define T1CMPR (volatile unsigned int* ) 0x7402”。

    第一种方式采用的是变量的形式, 如果使用这种方式来定义头文件的话, 则会在数据存储器中为这些寄存器重复分配空间, 这样就浪费很多的存储空间, 所以一般不使用这种方法。而第二种方法是宏定义方式, 不会给寄存器重复分配空间,因此常采用这种方法来定义头文件。此外, 需要注意的是, 在定义处于I鯫 地址空间的寄存器时, 如:

      “# define WSGR portFFFF

        ioport unsigned portFFFF; ”

    第二行结尾处的分号是不可缺少的, 否则系统编译时不通过。

    2 字母大小写问题

    在C 语言中, 对于字母大小写的区分是很严格的, 因此在混合编程的过程中也应该严格遵守这一点。例如, 在写命令文件时, 误将“.bss”写成“.bSS”, 此时系统将无法给变量分配存储空间,导致程序错误, 无法执行。

    3 C 语言库函数应用

    在T I 的C 编译器中内置了很多的函数, 包含于rts2xx.lib 的函数库中。库函数并不是C 语言的一部分, 它是由人们根据需要编制并提供用户可直接使用的。每一种C 编译系统都提供了一批库函数, 不同的编译系统所提供的库函数的数目和函数名及函数功能是不完全相同的。关于库函数的使用, 则只需在源文件中添加语句“#include“函数名.h””, 就可使用相应的库函数了。

    4 变量定义

    在定义变量类型的时候, 要注意所定义的变量的长度及其类型是否相符合。如果不符合, 则数据的赋值内容将会被改变。另外, 定义变量的语句要在程序一开始就给出。如果是全局变量或静态变量, 则在主程序之前定义; 如果是局部变量, 需在子程序开始处定义。否则系统将不能正确定义变量。

    5 汇编子程序调用

    在C 语言主程序中调用汇编子程序时有许多需要注意的地方。首先, 在C 语言主程序中要定义子程序外部模块的变量格式, 例如:

      “extern int PID ( int, int) ; ”

      在汇编子程序的开始需采用以下方式定义:

      “. def_ PID

          . text

         _  PID: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

        ret”

      C 语言程序调用汇编模块, 则该汇编模块的名称必须要声明成. global 或. def, 且模块的名称必须要用下划线“_ ”为起始字。如果遇到在汇编中要使用C 语言中定义的变量时, 则在汇编语言中需要将变量用“. ref”声明为外部定义的变量,并在使用的变量名前加下划线“_ ”。然后进行编译连接时, 将汇编子程序也包含到工程中去就可以了。另外, 在汇编程序中, 需要在开头和结尾处编写程序进行现场保护和现场恢复。这段语句的编写是根据不同的程序需要而改变的。

    6 堆栈长度问题

    在C 语言中, 子程序的编写也需要考虑一些问题。例如要注意定义的局部变量的个数。因为在调用子程序的时候, 局部变量是暂时放在堆栈中的, 所以如果变量过多, 超过堆栈的长度, 则程序不能通过。例如, 用子程序算正弦表时

    void scaculate ()

    {

     double Q [ 1025 ];

     for ( i= 0; i< 1025; i+ + )

     {

      Q [ i]= 0. 00613592315154253 i;

      stable[ i]= sin (n) ;

      }

    }

    这样Q [1025]数组太长, 变量太多, 超过堆栈的长度, 应改为

    void scaculate ()

    {

     double n;

     for ( i= 0; i< 1025; i+ + )

     {

      n= 0. 00613592315154253 i;

      stable[ i]= sin (n) ;

      }

    }

    7 计算简化

    在编写程序的时候, 应该将计算次数降到最低并对其尽量简化。这样在将C 语言程序编译成汇编语句时, 可以减少汇编语句的条数, 以此来减少程序运行的时间, 提高执行效率.

    展开全文
  • 主要介绍在TMS320C54X DSP如何实现扩展精度的乘法、IIR滤波器的基本原理和算法实现,以及二阶级联IIR滤波器应用于均衡器的具体编程实现。
  • 摘要:介绍了在TI公司TMS320VC33 DSP应用系统中,通过JTAG口对DSP外部FLASH存储器实现在线编程的...下面介绍SST29LE020型FLASH存储器的烧写方法,以及如何实现TMS320VC33上电后用户程序的自举引导(Bootload)。 1 S
  • 第7章 TMS320C6000 C/C++语言实现 7.1 TMS320C6000 C语言的特征 7.2 TMS320C6000 C++语言的特点 7.3数据类型 7.4关键字 7.5寄存器变量和参数 7.6 asm语句 7.7 pragma伪指令 7.8连接名(linkname)的生成 7.9静态变量...
  • 编程软件例如CCS中编程时,代码...这种功能是如何实现的呢?在编译器的前端是一个语义解析器,它负责把源程序中的token找出来,然后解析器parser(也有的地方叫分析器)就可以解析这些token,并产生树状表······
  • 关于DSP/BIOS的编程的两个问题

    千次阅读 2011-11-06 15:51:08
    我们在进行基于DSP/BIOS的编程中,往往需要加入自己定义的数据段,或者代码段,那么在DSP/BIOS下如何实现呢?以下是解决方法: 1.把系统自动生成的CMD文件排除出CCS工程中,注意,不要删除文件 2.在上述CMD文件相同...
     
    

    一。我们在进行基于DSP/BIOS的编程中,往往需要加入自己定义的数据段,或者代码段,那么在DSP/BIOS下如何实现呢?以下是解决方法:

    1.把系统自动生成的CMD文件排除出CCS工程中,注意,不要删除文件

    2.在上述CMD文件相同目录下,创建一个自定义的CMD文件,并加入工程中

    3.按如下格式书写自自定义的文件:

    -l c6457cfg.cmd

    SECTIONS {
     
      .DDR2_ram:   {} > DDR2
      .SRC_Ram:               {}>  IRAM
      .DST_L1D:               {}>  CACHE_L1D
      }

    其中第一项是把系统生成的CMD,链接到当前CMD中,然后就可以在SECTIONS中自定义自己想要的代码段,同时可以把自定义的代码定位在DSP/BIOS设置的内存空间中

    展开全文
  • DSP SPWM编程方法,教你如何实现斩波发出PWM波编程。有较大用处
  • 摘要:介绍了TMS320C6x DSP的几种FLASH引导方法,比较了引导过程中基于软件流水的数据搬移方法和QDMA方式的数据搬移方法,并介绍了如何利用在系统编程(ISP)对上电引导程序进行FLASH编程。通过对实际的TMS32C6711 ...
  • 我们在进行基于DSP/BIOS的编程中,往往需要加入自己定义的数据段,或者代码段,那么在DSP/BIOS下如何实现呢?以下是解决方法: 1.把系统自动生成的CMD文件排除出CCS工程中,注意,不要删除文件 2.在上述CMD文件相同...

    一。我们在进行基于DSP/BIOS的编程中,往往需要加入自己定义的数据段,或者代码段,那么在DSP/BIOS下如何实现呢?以下是解决方法:

    1.把系统自动生成的CMD文件排除出CCS工程中,注意,不要删除文件

    2.在上述CMD文件相同目录下,创建一个自定义的CMD文件,并加入工程中

    3.按如下格式书写自自定义的文件:

    -l c6457cfg.cmd

    SECTIONS {
     
      .DDR2_ram:   {} > DDR2
      .SRC_Ram:               {}>  IRAM
      .DST_L1D:               {}>  CACHE_L1D
      }

    其中第一项是把系统生成的CMD,链接到当前CMD中,然后就可以在SECTIONS中自定义自己想要的代码段,同时可以把自定义的代码定位在DSP/BIOS设置的内存空间中

    展开全文
  • INTEL FPGA具有高性能,可编程,低功耗等特点,为AI应用加速提供了一种灵活、确定的低延迟、高通量、节能的解决方案。Arria10是INTELFPGA第一代集成IEEE754标准单精度硬浮点DSP block,可以为...

    更多精彩内容,请微信搜索“FPGAer俱乐部”关注我们。

    概述

    随着深度学习的发展,为了解决更加抽象,更加复杂的学习问题,深度学习的网络规模在不断的增加,计算和数据的复杂也随之剧增。INTEL FPGA具有高性能,可编程,低功耗等特点,为AI应用加速提供了一种灵活、确定的低延迟、高通量、节能的解决方案。Arria10INTELFPGA第一代集成IEEE754标准单精度硬浮点DSP block,可以为高复杂度的深度学习算法提供高精度,高能效的乘法运算。

    深度学习算法复杂度高,需要进行大量的乘法运算,如实现一个卷积核为5*5的特征提取,需要进行25*25次乘法运算,而随着特征提取量的增加,乘法运算也将成倍的增长。因此乘法器资源是实现深度学习算法的重要评估资源,本主要介绍如何基于Arria10的一个18*18的乘法器实现两个11*11的浮点mini-fp运算,从而4倍提高DSP block资源。

    原理分析

    Arria10可变精度的DSP Block支持配置为两个18*18或者18*19定点乘法器,进行18*18乘法运算时,如图1所示,将输入拆分为低6位,中6位,高6位,进行运算分析。

                

    图1 18*18乘法器运算

    则对应的运算结果如下表所示:

    乘法器输入

    乘法器输入

    结果

    6

    6

    0-11

    6

    6

    6-17

    6

    6

    12-23

    6

    6

    6-17

    6

    6

    12-23

    6

    6

    18-29

    6

    6

    12-23

    6

    6

    18-29

    6

    6

    23-35

    将中6位输入全设为0,则可以得到对应的输出结果如下表所示:

    乘法器输入

    乘法器输入

    结果

    6

    6

    0-11

    6

    6

    0

    6

    6

    12-23

    6

    6

    0

    6

    6

    0

    6

    6

    0

    6

    6

    12-23

    6

    6

    0

    6

    6

    23-35

    当高6位及低6位为带符号位的输入数据时,进行符号位提取,则剩余的实际数据有效位为5位,因此低6*6位及高6*6位的乘法结果最高有效位均为10位,进行两个结果的加法运算,可以保证结果在12-23位以内,不会对高6*6位乘法结果造成影响。因此Arria1018*18的乘法器支持进行符号位提取后的两个6*6的乘法运算,图2是对应的仿真结果,乘法结果对应延时2个时钟周期。

    2 modelsim 仿真结果

    浮点型数据如图3所示,包含符号位S,指数位E及尾数位M

                                       

    3 浮点型数据组合

    进行浮点型数据乘法运算,如图4所示。


    图4 浮点型数据乘法

    需要进行指数相加,尾数相乘,乘法结果取整及指数的调整。11位的浮点型数据尾数及指数各占5位,因此进行乘法运算仅需要进行包含符号位6位的数据相乘及对应的处理即可。Arria10DSPblock可支持配置为218*18乘法器,而一个18*18的乘法器可以实现两个6*6的乘法运算,因此一个DSPblock可以实现411位浮点型数据mini-FP的乘法运算。

    本文转载自骏龙科技优先公司公众号,如涉及侵权,请私信小编删除。

    ============华 丽 的 分 割 线============

    想加入我们FPGA学习交流群吗?可以长按或扫描以下二维码,审核通过后我们邀请您加入

    这些微信群旨在打造一个提供给FPGA工程开发人员及兴趣爱好者(统称“FPGAer”)进行技术交流、答疑解惑和学习的平台。而且我们也将会通过网络举办FPGA技术讲座,分享相关研究文献 


    了解更多FPGA知识可以长按或扫描以下二维码关注FPGAer俱乐部

    
    展开全文
  • DSP软件向桌面和嵌入式系统挑战 单个数字信号处理(DSP)芯片曾经作为协处理器来实现滤波器算法。现在DSP技术的发展已实现了多个复杂算法的并行。但是,这种功能的扩展也产生了新的问题,开发人员发现,在DSP处理...
  • 1、引 言 所谓可移植性是指系统或电路不改动或者通过跳线、可编程器件的擦写等简单改动就可以适应不同的外部系统的能力。可移植性有两方面的含义:一是系统或电路可调;二是系统或电路可以适应不同的外部系统。 ...
  • 同时通过一个数据传输程序的例子来详细阐述如何使用VB6.0专业版作为开发工具,并利用DSP中的SCI(Serial Communication Interface)模块来实现DSP与微机间的数据传递方法。 关键词:DSP;串口通信接口;PC机;TMS320C...
  • DSP作为高速信号处理芯片可以实现高实时性的信号处理功能,通过充分利用芯片资源来实现运算效率最大化是多核编程的核心,本文介绍最简单方便的DSP核控制方式。 CSL_chipReadReg函数 CSL_chipReadReg函数是CCS自带...
  • 因此如何DSP进行优化编程,解决算法的复杂性和硬件存储容量及速度之间的矛盾,成为实现系统性能的关键。本文基于TMS320C6713设计并实现了高速实时语音识别系统,在固定文本的说话人辨识的应用中效果显著。 1 语音...
  • 首先为了降低系统成本,就要求将许多以前用硬件实现的功能软件化,原来由多个DSP完成的工作由一块DSP完成,DSP要能够同时完成多个相同或不同的任务而相互之间没有影响。其次为了产品的维护和升级,要求软件尽可能地...
  • 为此,如何实现高速、可靠及低成本的数据传输是作为前级机或发送级的8051单片机迫切需要解决的新技术。据此,我们采用由Dallas Semiconductor公司产的芯片DSl075Econ oscillator(高效型振荡器)为8051系列的DS87C520...
  • 详细论述了系统的各个组成部分以及指纹识别算法的实现流程,结合VC5402的指令集和自身结构特点,讨论了如何高效的设计应用程序的方法。文章对如何DSP的主机接口(HPI)改造成通用输入输出口(GPIO)、将多通道缓冲...
  • USB总线具有传输速度高,以及即插即用等特点,得到越来越广泛的应用,利用USB总线实现DSP和PC机的通信,从而解决图像信号的实时传输问题。Cypress公司生产的CY7C68001通用USB 2.0接口控制器是基于应用层编程的接口...
  • 如何将程序烧写进Flash,并在上电时加载到DSP内部的RAM是Flash在DSP系统中应用的两个基本技术问题。本文以基于TI公司的TMS320VC5509A和Atmel公司的AT49LV1024 Flash开发的系统为背景,详细介绍了系统引导相关的硬件...
  • 本节主要向大家讲述用DSP如何编程实现移相控制,如下图所示为移相全桥变换器的移相控制示意图,其中EPWM1A和EPWM1B为占空比50%的互补信号,EPWM2A和EPWM2B也为占空比50%的互补信号。通过控制EPWM1A和EPWM2B的移相角...

空空如也

空空如也

1 2 3 4 5
收藏数 92
精华内容 36
关键字:

dsp编程如何实现的