⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fir_asm.asm

📁 针对SHARC系列DSP的卷积、自相关函数、FFT、FIR源代码
💻 ASM
字号:
/*****************************************************************************
** fir_asm.asm       $TITLE:NOTES.ASM$
** 用于演示FIR滤波的汇编程序
****************************************************************************/
/*--------------------------------------------------------------------------
    INCLUDES
--------------------------------------------------------------------------*/
#include <def21065l.h>
#include <ezkit/mntrmem.h>
#include <ezkit/1819regs.h>
#include <ezkit/uart.h>
#include <signal.h>

/*--------------------------------------------------------------------------
   CONSTANT & MACRO DEFINITIONS
--------------------------------------------------------------------------*/
/* Codec tag word to send out left and right samples */
#define DOUT_TAG         0x9800

/* Codec tag word to send out address and data slots */
#define REGOUT_TAG       0xe000

/* This is the codec register setting for line input on both channels */
#define SOURCE_IS_LINE   0x0404
#define SOURCE_IS_MIC    0

/* Codec addreses */
#define SOURCE_ADDR      0x1a00
#define RECGAIN_ADDR     0x1c00

#define FIR_N  256


/*--------------------------------------------------------------------------
   GLOBAL DECLARATIONS
--------------------------------------------------------------------------*/
.GLOBAL _main;
/*---------------------------------------------------------------------------*/
.SEGMENT/DM     seg_dmda;

.VAR    InputBuf[FIR_N];
   
.ENDSEG;
/////////////////////////////
.SEGMENT/pm seg_pmda;
.var Coefficients[FIR_N]="Coefficient.dat";
.ENDSEG;
/* Now setup a segment that is in exactly the same location as the kernel
   segment so that the demo has access to the kernel buffers and flags */
.SEGMENT/DM     seg_bnk3;
.VAR user_tx_buf[6];  //
.VAR user_tx_ready;   //  Codec isr (set up by the kernel) flags and buffers
.VAR user_rx_buf[6];  //
.VAR user_rx_ready;   //
.ENDSEG;
//////reset中断向量定义/////////
.SEGMENT/PM seg_rth;
			NOP; JUMP _main; RTI; RTI;
.ENDSEG;
/*---------------------------------------------------------------------------*/

.SEGMENT /PM seg_pmco;
/* ---------------------------------------------------------------------------
;
;	主程序:        Notes demo main function.
;;               
----------------------------------------------------------------------------*/
_main:
///////初始化循环缓冲///////////
   BIT CLR MODE1 65536;            /*Set to 40-BIT mode         */
    
    B2=InputBuf;
    I2=InputBuf;
    L2=FIR_N;
    M2=1;
    B8=Coefficients;
    I8=Coefficients;
    L8=FIR_N;
    M8=1;
   
///////////串口1开屏蔽,初始化AD1819A的信号源和增益/////////
   	BIT SET MODE1 IRPTEN;                        /* enable ints & nesting*/
   	BIT SET IMASK SPT1I;//串口1开屏蔽
   	BIT CLR MODE1 NESTM;
//////初始化AD1819信号源////////
    I0=user_tx_buf;
   	Modify(I0,TAG);
   	R0=REGOUT_TAG;
   	DM(I0,0)=R0;
   	
   	I0=user_tx_buf;
   	Modify(I0,ADDR);
   	R0=SOURCE_ADDR;
   	DM(I0,0)=R0;

   	I0=user_tx_buf;
   	Modify(I0,DATA);
   	R0=SOURCE_IS_LINE;
   	DM(I0,0)=R0;
   	
    R0=1;
   	DM(user_tx_ready)=R0;
   	idle;
   	idle;
//////初始化AD1819增益////////
    I0=user_tx_buf;
   	Modify(I0,TAG);
   	R0=REGOUT_TAG;
   	DM(I0,0)=R0;
   	
   	I0=user_tx_buf;
   	Modify(I0,ADDR);
   	R0=RECGAIN_ADDR;
   	DM(I0,0)=R0;

   	I0=user_tx_buf;
   	Modify(I0,DATA);
   	R0=0;
   	DM(I0,0)=R0;
   	
   	R0=1;  	
   	DM(user_tx_ready)=R0;
   	idle;
   	idle;
/////////////////////////////////////////////////
wait:				/* deluxe thumb-twiddling loop */
///////////////接收数据/////////////    
   R0=1;  	
   DM(user_rx_ready)=R0;
   IDLE;
check_rx:   
   R0=DM(user_rx_ready);
   R1=0;
   R0=R0-R1;
   if ne jump check_rx;
check_tx:
   R0=DM(user_tx_ready);
   R1=0;
   R0=R0-R1;
   if ne jump check_tx;
  
    I0=user_rx_buf;
   	Modify(I0,LEFT_CHANL);
   	R0=DM(I0,0);
//////FIR滤波算法//////////
    ////将结果转换为浮点型数据
 //   R3=MODE1;//保护MODE1
//    BIT CLR MODE1 65536;            /*Set to 40-BIT mode         */
    
   F12 = float R0;
    
    R2=R2-R2, DM(I2,M2)=R12;//I2指针同时被修改
    R8=R8-R8;
    R12=R12-R12; //初始化所有的计算用的寄存器

                LCNTR=FIR_N, DO pdconv UNTIL LCE;
pdconv:F8=F2*F4,F12=F8+F12,F4=DM(I2,M2),F2=PM(I8,M8);        
        F8=F2*F4, F12=F8+F12;
///////////////////////
//       MODE1=R3;
//////////将结果转化为带符号整型输出//////
    R2= trunc F12;
    
    
///////发送数据////////////
    I0=user_tx_buf;
   	Modify(I0,TAG);
   	R0=DOUT_TAG;
   	DM(I0,0)=R0;
   	
   	I0=user_tx_buf;
   	Modify(I0,LEFT_CHANL);
//   	R0=DM(filter_input);
   	DM(I0,0)=R2;

   	I0=user_tx_buf;
   	Modify(I0,RIGHT_CHNL);
//   	R0=DM(filter_input);
   	DM(I0,0)=R2;
   	
   	R0=1;
   	DM(user_tx_ready)=R0;
   	
    nop;
    JUMP wait;

_main.end:
.ENDSEG;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -