基于DSP的IS95正向业务信道模块设计
**定时20ms循环处理话音数据包***
*伪指令不占空间不影响执行速度,只是定义和描述但对汇编链接有重要指示作用
*********************************
.title "IS95前向信道设计" ;源程序名
.global _c_int00 ;全局起始标号
.mmregs ;定义所有存储器映像寄存器为全局型 定义存储器为全局符号
.copy "walsh.inc" ;从"walsh.inc" 文件中复制walsh表
STACK .usect "stack",10H ;自定义未初始化堆栈的设置(调用子程序,中断时将当期执行位置自动压栈)
.bss pn1,2048 ;在未初始化段中保留空间,2048个字(一个字16位,一个字节8位,这里是字)
.bss pn2,2048
.bss w,1536
.bss wa,1536
.bss iq,32 ;依次存储4组8个样点波形
;SIN0+COS0;SIN0+COS180;SIN180+COS0;SIN180+COS180
.bss p,4 ;P用于42级缓存三个,用于Wlash地址是4个
.bss q,4 ;P用于42级掩码三个,用于Wlash地址是4个
.bss v,1 ;用于记录pn码循环的位置0-2047
.bss k,1 ;k为偏置系数
.bss x,1
.bss y,1
.bss z,1
.data ;为数据开辟存储空间
cos: .word 07fffH,05a82H,00000H,0a57fH,08002H,0a57fH,00000H,05A82H ;Q15格式 一个或多个16位整型变量
sin: .word 00000H,05A82H,07fffH,05a82H,00000H,0a57fH,08002H,0a57fH
PA0 .set 0 ;符号常数赋给寄存器
PA1 .set 1 ;从此端口传速率标志1,2,4,8
PA2 .set 2
PA3 .set 3
PA4 .set 4
PA5 .set 5
PA6 .set 6
PA7 .set 7
PA8 .set 8
PA9 .set 9 ;此端口输出调制波形
.sect ".vectors" ;中断向量表(自定义已初始化段)
rst: B _c_int00 ;(0号复位中断)无条件转移2个字
NOP
NOP ;两个NOP占2个字,加在一起0号中断共四个字
.space 15*4*16 ;预留1-15号中断地址空间,每个占四个字
int0: B clock ;16号GPS外部中断
NOP
NOP
.space 2*4*16 ;预留17,18号中断地址空间,每个占四个字
tint: B timeout ;19号定时中断向量(20ms(ttt3))
NOP
NOP
.space 12*4*16
.text ;主程序
_c_int00
STM #STACK+10H,SP ;堆栈指针 指向栈底 ************************************************************
*初始化,产生四种SIN与COS相加的波形
*cos+sin, cos-sin, sin-cos, -cos-sin
************************************************************
SSBX SXM ;=1符号扩展,进行算数运算,数据进入ALU中符号位扩展(SSBX 对状态寄存器ST0/1特定位置置1)
STM #w,AR2 ;w AR2存放cos的样点
STM #wa,AR3 ;wa AR3存放sin的样点
STM #7, BRC ;块循环8
RPTB lop1
LD #cos,A
;RPT #7
READA *AR2+ ;cos w(AR2)中存8个cos样点, 按累加器A寻址读程序存储器并存入数据存储器
lop1: ADD #1, A
RPTB lop2
LD #sin,A
;RPT #7
STM #7, BRC
READA *AR3+ ;sin wa(AR3)中存8个sin样点
lop2: ADD #1, A
;;存采样点
STM #iq,AR4 ;iq数据单元存放四种波形 cos+sin, cos-sin, sin-cos, -sin-cos
STM #w,AR2 ;指向 cos起始位置
STM #wa,AR3 ;指向 sin起始位置
STM #7,BRC
RPTB ttt-1
LD *AR2+,A
ADD *AR3+,A
STL A,*AR4+ ;AR4 *(iq)=cos0+sin0 ttt: STM #w,AR2
STM #wa,AR3
STM #7,BRC
RPTB ttt1-1
LD *AR2+,A
SUB *AR3+,A
STL A,*AR4+ ;AR4 *(iq+8)=cos0+sin180 ttt1: STM #w,AR2
STM #wa,AR3
STM #7,BRC
RPTB ttt2-1
LD *AR3+,A
SUB *AR2+,A ;AR4 *(iq+16)=cos180+sin0
STL A,*AR4+ ttt2: STM #w,AR2
STM #wa,AR3
STM #7,BRC
RPTB ttt3-1
LD *AR2+,A
NEG A ;计数累加器反值
SUB *AR3+,A
STL A,*AR4+ ;AR4 *(iq+24)=cos180+sin180
;;存4种合成波形
************************************************************
**初始化PN1和PN2,准正交15级M序列
**先产生好引导序列,最后15个零,初始状态14个零,1个一
**序列周期2^15-1=32768-1=32767
**每两秒75个PN序列周期,1.2288Mc(M chip, 长码工作频率)/S*2S = 75*32768, 32768/16 = 2048个字
**I(X) = x15+x13+x9+x8+x7+x5+1
**Q(x) = x15+x12+x11+x10+x6+x5+x4+x3+1
************************************************************
STM #32767,BRC ;循环次数 PN1
LD #0x0001,A ;初始状态14个零1个一,移存器初态,1为x位
STM #15,AR4 ;计数器,一个字16位
STM #pn1,AR3 ;放置序列地址
ST #0X0001,*AR3 ;先输出1(存进pn1段内存空间中)
RPTB PP-1
LD #0,B ;B为M序列反馈位
XOR A,-4,B ;x5与B异或
XOR A,-6,B
XOR A,-7,B
XOR A,-8,B
XOR A,-12,B
XOR A,-14,B
AND #0x0001,B
SFTL A,1 ;左移一位
OR B,A ;反馈位或到最低位
BANZ PP1,*AR4- ;未积满一个字后转移(AR4的内容为0不跳转)
STL B,*+AR3 ;更新输出地址
STM #15,AR4
B PP2
PP1: ADD *AR3,1,B
STL B,*AR3
PP2: NOP
PP: LD *AR3,A ;周期性,AR3又重新指向了pn1的开头
AND #0XFFFE,A ;提前输出的1强制变为0
STL A,*AR3
************************************************************
STM #32767,BRC ;PN2
LD #0x0001,A ;初始状态14个零,1个一
STM #15,AR4 ;计数器,一个字16位
STM #pn2,AR3 ;放置序列地址
ST #0X0001,*AR3 ;先输出1
RPTB PPPP-1
LD #0,B ;B为M序列反馈位
XOR A,-2,B ;x3与B异或
XOR A,-3,B
XOR A,-4,B
XOR A,-5,B
XOR A,-9,B
XOR A,-10,B
XOR A,-11,B
XOR A,-14,B
AND #0x0001,B
SFTL A,1 ;左移一位
OR B,A ;反馈位或到最低位
BANZ PPPP1,*AR4- ;未积满一个字后转移
STL B,*+AR3 ;更新输出地址
STM #15,AR4
B PP2
PPPP1: ADD *AR3,1,B
STL B,*AR3
PPPP2: NOP
PPPP: LD *AR3,A ;提前输出的1强制变为0
AND #0XFFFE,A
STL A,*AR3
*************************************************************
ttt3: SSBX INTM ;=1,关闭所有可屏蔽中断
RSBX SXM ;=0,禁止符号位扩展
ST #0,*(x) ;初始化x=0,x为十次定时记数
STM #0,SWWSR ;插入0等待周期
STM #0xffa8,PMST ;改变中断向量映射到0xff80,IPTR取PMST高九位9个1
STM #9007h,CLKMD ;CLKMD倍频设置 PLLMUL=9,CLKIN=10M,CLKOUT=CLKIN X (PLLMUL+1)=100M
STM #19999,PRD ;该为PRD=20000-1;TDDR=10-1 主频100M 则定时2ms
STM #0039h,TCR ;T = t*(TDDR+1)*(PRD+1)
;TDDR=9,TSS=1停止 *************************************************************
**主程序和码元重复
**速率标志1,2,4,8
**测试标志的0123位
*************************************************************
susp STM #y,AR4 ;添加帧质量指示,速率标志
PORTR PA1,*AR4 ;速率标志1,2,4,8
BIT *AR4,15-0 ;速率1, 检测第0位,15-0最右面一位
BC bbb1,NTC ;TC=0转移
CALL crc12 ;12位CRC校验子程序,8.6*20=172+12=184
LD #183,A ;卷积输入184码元 172+12
CALL juanji ;卷积加尾比特 184+8=192*2=384
STM #wa,AR5 ;码元重复1次,wa输出 w输入
STM #w,AR3
RPT #383 ;卷积输出384个码元,作为码元重复的输入
MVDD *AR3+,*AR5+ ;每个码元重复1次
CALL jiaozhi
CALL raoluan ;42级扰乱加密子程序
CALL kuopin ;沃尔什码扩频子程序
CALL pianzhi1
CALL pianzhi2
CALL qpsk
B bbb bbb1: BIT *AR4,15-1 ;速率2(速率1/2)
BC bbb2,NTC ;TC = 0跳移
CALL crc8 ;8位CRC校验子程序,4.0*20 = 80+8 = 88
LD #87,A ;卷积输入88码元
CALL juanji ;卷积加尾比特 88+8 = 96*2 = 192
STM #wa,AR5 ;码元重复2次,wa输出
STM #w,AR3 ;w输入
STM #191,BRC ;卷积输出192个码元,作为码元重复的输入
RPTB ccb1-1
MVDD *AR3,*AR5+ ;每个码元重复2次
MVDD *AR3+,*AR5+
ccb1 CALL jiaozhi
CALL raoluan
CALL kuopin
CALL pianzhi1
CALL pianzhi2
CALL qpsk
B bbb bbb2: BIT *AR4,15-2 ;速率4(速率1/4),检测第2位
BC bbb3,NTC ;TC = 0 转移
STM #w,AR3
STM #wa,AR4
RPT #39 ;2.0*20 = 40
MVDD *AR3+,*AR4+ ;统一接口 等效于CRC校验 wa AR3->w AR4
LD #39,A ;卷积输入 40码元
CALL juanji ;卷积加尾比特 40+8 = 48*2 = 96
STM #wa,AR5 ;码元重复4次,wa输出w输入
STM #w,AR3
STM #95,BRC ;卷积输出96个码元,作为码元重复的输入
RPTB ccb2-1
MVDD *AR3,*AR5+ ;每个码元重复4次
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3+,*AR5+
ccb2 CALL jiaozhi
CALL raoluan
CALL kuopin
CALL pianzhi1
CALL pianzhi2
CALL qpsk
B bbb bbb3 STM #w,AR3 ;速率8(速率1/8), 检测第3位
STM #wa,AR4
RPT #15 ;0.8*20 = 16
MVDD *AR3+,*AR4+
LD #15,A
CALL juanji ;卷积加尾比特 16+8 = 24*2 = 48
STM #wa,AR5 ;码元重复8次,wa输出w输入
STM #w,AR3
STM #47,BRC
RPTB ccc-1
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3+,*AR5+
ccc CALL jiaozhi
CALL raoluan
CALL kuopin
CALL pianzhi1
CALL pianzhi2
CALL qpsk
nop
bbb nop
*********************************************************************
**用x定时, 初始化于171行
*********************************************************************
susp1 LD *(x),A ;保证程序每次间隔20ms
SUB #10,A
BC susp,AEQ ; x = 10时,说明20ms完成, 跳到susp, 即从上面的码元重复开始从头开始执行. 判断是否到20ms,取第二个数据包处理
B susp1 ;否则x < 10,没记满,时间没到,死循环等待,时间记满进行下个程序周期
*********************************************************************
timeout ADDM #1,*(x) ;x++ 定时中断子程序1加到十即20ms
LD #10,A
SUB *(x),A
BC secout,ALEQ ;x >= 10,跳,说明10次记满,x清零,
B exit ;否则直接退出中断
secout ST #0,*(x)
exit NOP
RETE
*********************************************************************
*外部GPS时钟2秒钟复位一次
*根据偏置系数K确定引导pn序列的起始位置v
*********************************************************************
clock: PORTR PA0,*(k) ;读偏置系数
LD *(k),2,A ;4个字,相邻偏执系数相差64位
AND #0x7fc,A ;0111,1111,1100只有中间9位有效,屏蔽低2位
STL A,*(v) ;V = k*4(即k左移两位),周期序列起始位置
STM #0FFFFh,IFR ;所有中断标志置1
STM #0008h,IMR ;TINT0=1定时中断开放
RSBX INTM ;=0,开放所有可屏蔽中断
LDM TCR,A
AND #0FFEFH,A
STLM A,TCR ;TSS=0,定时器启动工作
RETE ********************************************************************
*循环冗余编码编程
*CRC效验子程序
*12位帧质量指示码产生器
*w存储172位要效验的信息
*wa存储184位输出信息
*f(x)=x12+x11+x10+x9+x8+x4+x+1
*********************************************************************
crc12 STM #w,AR3 ;输入输入数据间接寻址
STM #wa,AR4 ;输出
LD #0XFFF,B ;B为12位移存器初始化,左为刚入X12,右为最早入X
STM #171,BRC ;计算172位CRC效验
RPTB next-1 ;块循环
SFTL B,-11,A ;B中存储12位移存器值,取最高延迟位至A中
MVDD *AR3,*AR4+ ;数据由w->wa,输入还没产生反馈为,
XOR *AR3+,A ;最高延迟位与输入模2加产生反馈输入
AND #0X0001,A ;确保只要一位
SFTL B,1 ;12位移存器左移一位,图右移
AND #0X0FFE,B ;x位清空,放反馈位
XOR A,11,B ;产生移存器的X12,有抽头
XOR A,10,B ;产生移存器的X11
XOR A,9,B ;产生移存器的X10
XOR A,8,B ;产生移存器的X9
XOR A,7,B ;产生移存器的X8
XOR A,3,B ;产生移存器的X4
XOR A,B ;产生移存器的X
next: NOP ;将存在累加器A中的校验12位码传递到信息位的最后12个字
SFTL B,-11,A ;12位校验位存在B中
AND #0X0001,A ;取校验最高位输出
STL A,*AR4+ ;AR4为输出数据地址
SFTL B,-10,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-9,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-8,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-7,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-6,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-5,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-4,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-3,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
AND #0X0001,B
STL B,*AR4+
RET
***********************************************************************************
*crc效验:F(X)=X8+X7+X4+X3+X+1
*8位帧质量指示码产生器
*w存储80位要效验的信息
*wa存储88位输出信息
***********************************************************************************
crc8 STM #w,AR3 ;输入
STM #wa,AR4 ;输出
LD #0XFF,B ;B为8位移存器初始化,右为刚入,左为最早入
STM #79,BRC ;计算80位CRC效验
RPTB nex-1
SFTL B,-7,A ;取最高延迟位
MVDD *AR3,*AR4+ ;数据由w->wa
XOR *AR3+,A ;最高延迟位与输入模2加产生反馈输入
AND #0X0001,A
SFTL B,1 ;移存器移位,x8在左
AND #0X0FE,B
XOR A,7,B ;产生移存器的X8
XOR A,6,B ;产生移存器的X7
XOR A,3,B ;产生移存器的X4
XOR A,2,B ;产生移存器的X3
XOR A,B ;产生移存器的X
nex: NOP ;将存在累加器A中的校验8位码传递到信息位的最后8个字
SFTL B,-7,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-6,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-5,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-4,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-3,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
AND #0X0001,B
STL B,*AR4+
RET
**********************************************************************************
*卷积编码g0=111101011 1 X X1 ... X8 ,B中相反
* g1=101110001
*wa为输入数据,w为编码输出
*包括8位尾比特处理
**********************************************************************************
juanji: STLM A,BRC ;BRC值与速率有关,A=183,87,39,15
STM #wa,AR2 ;输入
STM #w,AR3 ;输出
LD #0,B ;B中存储8位移存器,初始化0
RPTB ddd-1 ;循环
LD *AR2,A ;当前输入送输出
XOR B,A ;g0 = 111101011
XOR B,-1,A ;B移存器有抽头位异或存于A中
XOR B,-2,A
XOR B,-4,A
XOR B,-6,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;编码后输出
LD *AR2,A ;g1 = 101110001
XOR B,-1,A ;B移存器有抽头位异或存于A中
XOR B,-2,A
XOR B,-3,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;编码后输出
SFTL B,1
AND #0XFE,B
OR *AR2+,B
ddd: NOP
STM #7,BRC ;加尾比特8个0
RPTB eee-1
LD #0,A ;无输入信息
XOR B,A
XOR B,-1,A
XOR B,-2,A
XOR B,-4,A
XOR B,-6,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;将编码后比特输出
LD #0,A ;无输入信息
XOR B,-1,A
XOR B,-2,A
XOR B,-3,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;将编码后比特输出
SFTL B,1 ;移存器移位
eee: NOP
RET
*************************************************************************
*交织器 打乱,把突发错误变为随机错误
*将384码元横向输入一个6*64矩阵,先对64列数据进行进行比特反转寻址方式交织,再纵向依次输出。
*输入数据在wa中,中间倒序寻址数据在w中,最后数据仍在wa中
*************************************************************************
jiaozhi: STM #wa,AR2 ;输入,输出
STM #w,AR3 ;中间倒序寻址数据
STM #32,AR0 ;64比特反转寻址方式:AR0=64/2=32 长度一半
STM #64-1,BRC ;一行64个都要打乱
RPTB #jj1-1
MVDD *AR2,*AR3+ ;
MAR *AR2+0B ;不支持双操作数寻址 所以分两步实现位倒序 完成第一行64比特反转寻址交织
jj1: STM #wa+64,AR2 ;第二行首地址
RPTB #jj2-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第二行64比特反转寻址交织
jj2: STM #wa+2*64,AR2
RPTB #jj3-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第三行64比特反转寻址交织 jj3: STM #wa+3*64,AR2
RPTB #jj4-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第四行64比特反转寻址交织
jj4: STM #wa+4*64,AR2
RPTB #jj5-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第五行64比特反转寻址交织
jj5: STM #wa+5*64,AR2
RPTB #jj6-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第六行64比特反转寻址交织
jj6: STM #wa,AR2
STM #w,AR3
STM #64-1,BRC
STM #64,AR0 ;按列输出,上下相隔64
RPTB jjj1-1
MVDD *AR3,*AR2+
MAR *AR3+0 ;同样不支持双操作数寻址,所以分两步
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
LDM AR3,A
SUB #5*64-1,A ;输出下一列,更新地址,相差-(5*64+1)
STLM A,AR3 ;AR3=A
jjj1: RET ;返回指令,返回到调用或发生中断的位置
*************************************************************************
*扰乱加密P(x)=x42+x35+x33+x31
* +x27+x26+x25+x22+x21+x19+x18+x17+x16
* +x10+x7+x6+x5+x3+x2+x+1
*加扰之前的数据在wa中,加扰后数据在w中,p,p+1与p+2中分别放移存器低14位中14位和高14位
*q,q+1与q+2中分别放掩码标志码低14位中14位和高14位
*数据掩我渤莆萑怕遥淠康氖俏耸莸陌踩? *为了保密安全起见,42级移位寄存器的各级输出与用户的42比特长码掩码相与,再进行模二相加,
*产生一种长码输出。长码的时钟工作频率是1.2288MHz,相应的长码俾适?.2288Mc/s,经64分频器,
*输出速率为19.2kb/s的的长码比特流,再与经卷积、交织处理后的调制码元进行模加,完成数据掩蔽工作.
*************************************************************************
raoluan: STM #wa,AR4 ;输入存储器映象寄存器寻址
STM #w,AR5 ;out
STM #384-1,AR3 ;384个要加密,循环384次,因为已用过块循环,块循环不能嵌套
PORTR PA2,*(p) ;获得移存器初态低14位 ,42=14*3 端口分三次读入 绝对寻址
LD *(p),A
AND #0X3fff,A ;确保低14
STL A,*(p)
PORTR PA3,*(p+1) ;获得移存器初态中14位
LD *(p+1),A
AND #0X3fff,A
STL A,*(p+1)
PORTR PA4,*(p+2) ;获得移存器初态高14位
LD *(p+2),A
AND #0X3fff,A
STL A,*(p+2)
PORTR PA5,*(q) ;获得掩码标志码低14位
LD *(q),A
AND #0X3fff,A
STL A,*(q)
PORTR PA6,*(q+1) ;获得掩码标志码中14位
LD *(q+1),A
AND #0X3fff,A
STL A,*(q+1)
PORTR PA7,*(q+2) ;获得掩码标志码高14位
LD *(q+2),A
AND #0X3fff,A
STL A,*(q+2)
bbc: STM #63,BRC ;42级m序列产生器同时64分频 64次掩码才输出
RPTB bbc1-1
LD #0,B ;B反馈位 初始化 P移存器初始状态 左X14
LD *(p),A ;*(p)存储m序列低14位 有抽头加一起产生反馈位
XOR A,B ;X 最右X
XOR A,-1,B ;X2 右移1位
XOR A,-2,B ;X3
XOR A,-4,B ;X5
XOR A,-5,B ;X6
XOR A,-6,B ;X7
XOR A,-9,B ;X10
; AND #0X0001,B
LD *(p+1),A ;*(p+1)存储m序列中14位 X15
XOR A,-1,B ;X16
XOR A,-2,B ;X17
XOR A,-3,B ;X18
XOR A,-4,B ;X19
XOR A,-6,B ;X21
XOR A,-7,B ;X22
XOR A,-10,B ;X25
XOR A,-11,B ;X26
XOR A,-12,B ;X27
; AND #0X0001,B
LD *(p+2),A ;*(p+2)存储m序列高14位 X30
XOR A,-2,B ;X31
XOR A,-4,B ;X33
XOR A,-6,B ;X35
XOR A,-13,B ;X42
AND #0X0001,B ;新产生的1BIT将存入B中
LD *(p+1),-13,A ;42级移位 取中14位最高位填到高14位最低位
AND #0X0001,A
ADD *(p+2),1,A
AND #0X03FF,A
STL A,*(p+2) ;完成高14位移位
LD *(p),-13,A
AND #0X0001,A
ADD *(p+1),1,A
AND #0X03FF,A
STL A,*(p+1) ;完成中14位移位
LD *(p),1,A
XOR B,A ;反馈比特移入第一级
AND #0X03FF,A
STL A,*(p) ;完成低14位移位
bbc1: NOP
LD #0,B ;掩码与移存器状态相与模二加产生1BIT输出 秘钥 B长码输出
LD *(p),A
AND *(q),A
STM #13,BRC
RPTB bbc2-1
XOR A,B
SFTL A,-1
bbc2: LD *(p+1),A
AND *(q+1),A
STM #13,BRC
RPTB bbc3-1
XOR A,B
SFTL A,-1
bbc3: LD *(p+2),A
AND *(q+2),A
STM #13,BRC
RPTB bbc4-1
XOR A,B
SFTL A,-1
bbc4: AND #0X0001,B ;B中是输出的m序列比特 可以不判断直接模2加
BC bbc5,BNEQ ; B不等于0跳转 取反
MVDD *AR4+,*AR5+ ;m序列输出为0直接输出信息比特
B bbc6
bbc5: LD *AR4+,A
XOR #0X0001,A ; 取反
STL A,*AR5+ ;m序列输出不为0输出信息反比特
bbc6: BANZ bbc,*AR3- ;循环384 判断AR3是否为0,不为0跳回去
RET
*********************************************************************************
*扩频:正向CDMA信道使用64进制的沃尔什函数扩展频谱和区分信道。
*经过长码掩蔽的调制码元速率19.kb/s与1.2288Mc/s的沃尔什函数进行模2加,即进行扩频 *输入是加扰后的19.2b/s的数据存在W中384比特
*WALSH码表存在文件table.inc中,4个字一个64位W码,存在程序区
*PA8口输入W地址号
*扩频后数据存在wa中,384*4=1536 ,每个调制符号包含子码数为:64
*********************************************************************************
kuopin: STM #p,AR4 ;*(p)中是4个64位Wals地址正码 q wals地址反码
PORTR PA8,*(z) ;获得W地址号,Z为地址编号
LD *(z),2,A ;地址号*4 (4个字一个地址),形成偏移地址 一个wals占4个字
AND #0xfc,A ;1111 1100 保证偏移地址不超过64*4
STL A,*(z)
ADD #table_a,A ;table 在程序区,基址+偏移地址 形成 地址号对应的地址
RPT #3 ;将4个字的walsh码读进来,存在AR4中
READA *AR4+ ;累加器寻址
STM #p,AR4 ;p中是64位正码
STM #q,AR5 ;q中是64位反码
LD *AR4+,A ;取反码
CMPL A ;取反
STL A,*AR5+
LD *AR4+,A
CMPL A
STL A,*AR5+
LD *AR4+,A
CMPL A
STL A,*AR5+
LD *AR4+,A
CMPL A
STL A,*AR5+ ;执行4次,完成walsh码4个字的取反工作
STM #wa,AR3 ;wa输出
STM #w,AR7 ;w输入
STM #383,BRC ;1个码元对应4个字的walsh码,384个码元重复384次
RPTB LOOP-1
LD *AR7+,A
STM #p,AR4 ;定位到正码,反码起始位置,;正极性沃尔什码
STM #q,AR5 ;反极性沃尔什码
BC LOOP1,ANEQ ;=0, 输出正码
MVDD *AR4+,*AR3+ ;输出正码
MVDD *AR4+,*AR3+
MVDD *AR4+,*AR3+
MVDD *AR4+,*AR3+
B LOOP-1
LOOP1: MVDD *AR5+,*AR3+ ;=1 输出反码
MVDD *AR5+,*AR3+ ;输出反码
MVDD *AR5+,*AR3+
MVDD *AR5+,*AR3+
NOP
LOOP: NOP
RET
**********************************************************************************
*I信道引导序列
*P1(x)=x15+x13+x9+x8+x7+x5+1
*v中记录上一个数据包结束PN1所在周期中的比特位置
*输入数据在wa中1536个字,输出在w中1536个字
*周期为2048个字
**********************************************************************************
pianzhi1: STM #wa,AR3 ;输入数据
STM #w,AR5 ;输出数据
LD #pn1,A ;引导序列起始地址
ADD *(v),A ;引导序列地址,绝对寻址
STLM A,AR4 ;AR4->引导序列地址
LD *(v),A
SUB #512,A ;PN序列,周期2048字,数据长1536字
BC ppp,AGQ ;若V大于512,数据需分两段序列(跨PN周期)模2加 V>512跳到ppp
STM #1535,BRC ;若起点V小于等于512,直接序列模2加
RPTB ppp1-1 ;循环1536次 序列周期均为215(32768),
LD *AR3+,A ;AR3输入
XOR *AR4+,A ;AR4 PN序列
STL A,*AR5+
ppp1: B ppp2
ppp: LD #2047,A ;V>512时,前半部分
SUB *(v),A
STLM A,BRC ;循环次数为2048-V BRC=2048-V-1
RPTB ppp3-1
LD *AR3+,A
XOR *AR4+,A ;PN序列 AR4开始时,指向V
STL A,*AR5+
ppp3: LD *(v),A ;后半部分
SUB #513,A ;循环次数为1536-(2048-V) = V-512 BRC=V-512-1
STLM A,BRC
STM #pn1,AR4 ;第二段数据与PN序列的起始相异或 因为PN序列是周期的
RPTB ppp2-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
ppp2: RET
**********************************************************************************
*Q信道引导序列
*PQ(x)=x15+x12+x11+x10+x6+x5+x4+x3+1
*v中记录上一个数据包结束PN1所在周期中的比特位置
*输入数据在wa中1536个字,输出在wa中1536个字
*周期2048个字
*对V地址进行更新
**********************************************************************************
pianzhi2: STM #wa,AR3 ;输入数据 输入和输出都是wa
STM #wa,AR5 ;输入数据
LD #pn2,A ;引导序列地址
ADD *(v),A ;引导序列起始地址
STLM A,AR4 ;引导序列
LD *(v),A
SUB #512,A
BC qqq,AGQ ;若V大于512,分两段序列模2加
STM #1535,BRC ;若起点V小于等于512,直接序列模2加
RPTB qqq1-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
qqq1: LD *(v),A ;更新V地址, 为下一数据包
ADD #1536,A
STL A,*(v)
B qqq2
qqq: LD #2047,A
SUB *(v),A
STLM A,BRC ;循环次数为2048-V BRC=2048-V-1
RPTB qqq3-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
qqq3: LD *(v),A
SUB #513,A ;循环次数为V-512 BRC=V-512-1
STLM A,BRC
STM #pn2,AR4
RPTB qqq2-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
qqq2: LD *(v),A ;更新V地址
SUB #512,A
STL A,*(v)
RET
*******************************************************************
*QPSK调制器
*I信道数据在W中1536*16比特,Q信道数据在WA中1536*16比特
*IQ分别为00,01,10,11四种刺涑鏊闹衷ご娴牟ㄐ?每种波形8个样点
*cos+sin;cos-sin;sin-cos;-cos-sin四种波形
*对应位置为*iq,*iq+8,iq+16,iq+24
*******************************************************************
qpsk: STM #w,AR2 ;输入I信道
STM #wa,AR3 ;输入Q信道
STM #1535,BRC ;1536个字,调制 扩频结束1536字 左先来
RPTB kkk-1 ;每次循环完成一个字
LD #iq,A ;iq 合成波数据
BIT *AR2,15-0 ;输出0位
BC kkk1,NTC ;TC = 0时,地址不变
ADD #16,A ;TC = 1时,地址加16
kkk1: BIT *AR3,15-0 ;测试Q支路最低位
BC kkk2,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk2: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7 ;8个样点,每个样点存在一个数据单元
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-1 ;输出1位
BC kkk3,NTC
ADD #16,A
kkk3: BIT *AR3,15-1
BC kkk4,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk4: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-2 ;输出2位
BC kkk5,NTC
ADD #16,A
kkk5: BIT *AR3,15-2
BC kkk6,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk6: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-3 ;输出3位
BC kkk7,NTC
ADD #16,A
kkk7: BIT *AR3,15-3
BC kkk8,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk8: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-4 ;输出4位
BC kkk9,NTC
ADD #16,A
kkk9: BIT *AR3,15-4
BC kkk10,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk10: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-5 ;输出5位
BC kkk11,NTC
ADD #16,A
kkk11: BIT *AR3,15-5
BC kkk12,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk12: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-6 ;输出6位
BC kkk13,NTC
ADD #16,A
kkk13: BIT *AR3,15-6
BC kkk14,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk14: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-7 ;输出7位
BC kkk15,NTC
ADD #16,A
kkk15: BIT *AR3,15-7
BC kkk16,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk16: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-8 ;输出8位
BC kkk17,NTC
ADD #16,A
kkk17: BIT *AR3,15-8
BC kkk18,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk18: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波?个样点
LD #iq,A
BIT *AR2,15-9 ;输出9位
BC kkk19,NTC
ADD #16,A
kkk19: BIT *AR3,15-9
BC kkk20,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk20: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-10 ;输出10位
BC kkk21,NTC
ADD #16,A
kkk21: BIT *AR3,15-10
BC kkk22,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk22: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-11 ;输出11位
BC kkk23,NTC
ADD #16,A
kkk23: BIT *AR3,15-11
BC kkk24,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk24: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-12 ;输出12位
BC kkk25,NTC
ADD #16,A
kkk25: BIT *AR3,15-12
BC kkk26,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk26: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-13 ;输出13位
BC kkk27,NTC
ADD #16,A
kkk27: BIT *AR3,15-13
BC kkk28,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk28: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-14 ;输出14位
BC kkk29,NTC
ADD #16,A
kkk29: BIT *AR3,15-14
BC kkk30,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk30: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2+,15-15 ;输出15位处理下一个字
BC kkk31,NTC
ADD #16,A
kkk31: BIT *AR3+,15-15 ;输出15位处理下一个字
BC kkk32,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk32: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
kkk: RET
*********************************************************************
.end ;结束汇编
table_a: .sect "table_a"
.word 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xffff,0xffff ;0-1
.word 0x0000,0xffff,0xffff,0x0000, 0x0000,0xffff,0x0000,0xffff ;2-3
.word 0x00ff,0xff00,0x00ff,0xff00, 0x00ff,0x00ff,0x00ff,0x00ff ;4-5
.word 0x00ff,0x00ff,0xff00,0xff00, 0x00ff,0x00ff,0x00ff,0x00ff ;6-7
.word 0x0ff0,0x0ff0,0x0ff0,0x0ff0, 0x0ff0,0x0ff0,0xf00f,0xf00f ;8-9
.word 0x0ff0,0xf00f,0xf00f,0x0ff0, 0x0ff0,0xf00f,0x0ff0,0xf00f ;10-11
.word 0x0f0f,0xf0f0,0x0f0f,0xf0f0, 0x0f0f,0xf0f0,0xf0f0,0x0f0f ;12-13
.word 0x0f0f,0x0f0f,0xf0f0,0xf0f0, 0x0f0f,0x0f0f,0x0f0f,0x0f0f ;14-15
.word 0x3c3c,0x3c3c,0x3c3c,0x3c3c, 0x3c3c,0x3c3c,0xc3c3,0xc3c3 ;16-17
.word 0x3c3c,0xc3c3,0xc3c3,0x3c3c, 0x3c3c,0xc3c3,0x3c3c,0xc3c3 ;18-19
.word 0x3cc3,0xc33c,0x3cc3,0xc33c, 0x3cc3,0xc33c,0xc33c,0x3cc3 ;20-21
.word 0x3cc3,0x3cc3,0xc33c,0xc33c, 0x3cc3,0x3cc3,0x3cc3,0x3cc3 ;22-23
.word 0x33cc,0x33cc,0x33cc,0x33cc, 0x33cc,0x33cc,0xcc33,0xcc33 ;24-25
.word 0x33cc,0xcc33,0xcc33,0x33cc, 0x33cc,0xcc33,0x33cc,0xcc33 ;26-27
.word 0x3333,0xcccc,0x3333,0xcccc, 0x3333,0xcccc,0xcccc,0x3333 ;28-29
.word 0x3333,0x3333,0xcccc,0xcccc, 0x3333,0x3333,0x3333,0x3333 ;30-31
.word 0x6666,0x6666,0x6666,0x6666, 0x6666,0x6666,0x9999,0x9999 ;32-33
.word 0x6666,0x9999,0x9999,0x6666, 0x6666,0x9999,0x6666,0x9999 ;34-35
.word 0x6699,0x9966,0x6699,0x9966, 0x6699,0x9966,0x9966,0x6699 ;36-37
.word 0x6699,0x6699,0x9966,0x9966, 0x6699,0x6699,0x6699,0x6699 ;38-39
.word 0x6996,0x6996,0x6996,0x6996, 0x6996,0x6996,0x9669,0x9669 ;40-41
.word 0x6996,0x9669,0x9669,0x6996, 0x6996,0x9669,0x6996,0x9669 ;42-43
.word 0x6969,0x9696,0x6969,0x9696, 0x6969,0x9696,0x9696,0x6969 ;44-45
.word 0x6969,0x6969,0x9696,0x9696, 0x6969,0x6969,0x6969,0x6969 ;46-47
.word 0x5a5a,0x5a5a,0x5a5a,0x5a5a, 0x5a5a,0x5a5a,0xa5a5,0xa5a5 ;48-49
.word 0x5a5a,0xa5a5,0xa5a5,0x5a5a, 0x5a5a,0xa5a5,0x5a5a,0xa5a5 ;50-51
.word 0x5aa5,0xa55a,0x5aa5,0xa55a, 0x5aa5,0xa55a,0xa55a,0x5aa5 ;52-53
.word 0x5aa5,0x5aa5,0xa55a,0xa55a, 0x5aa5,0x5aa5,0x5aa5,0x5aa5 ;54-55
.word 0x55aa,0x55aa,0x55aa,0x55aa, 0x55aa,0x55aa,0xaa55,0xaa55 ;56-57
.word 0x55aa,0xaa55,0xaa55,0x55aa, 0x55aa,0xaa55,0x55aa,0xaa55 ;58-59
.word 0x5555,0xaaaa,0x5555,0xaaaa, 0x5555,0xaaaa,0xaaaa,0x5555 ;60-61
.word 0x5555,0x5555,0xaaaa,0xaaaa, 0x5555,0x5555,0x5555,0x5555 ;62-63
TSIZE: .set $-table_a
MEMORY
{
PAGE 0: VECS: origin = 0xff80, length = 0x80
PROG: origin = 0x2400, length = 0x1a00 PAGE 1: SPRAM: origin = 0x200, length = 0x2200
STACK: origin = 0x0080, length = 0x100
} SECTIONS
{
.vectors: {} > VECS PAGE 0
.text: {} > PROG PAGE 0
table_a: > PROG PAGE 0
.data > PROG PAGE 0
.bss: > SPRAM PAGE 1
.stack: {} > STACK PAGE 1
}
基于DSP的IS95正向业务信道模块设计的更多相关文章
- 基于 SOA 的组件化业务基础平台
业务基础平台是业务逻辑应用和基础架构平台之间的一个中间层,解决 “应用软件的业务描述和操作系统平台.软件基础架构平台之间的交互与管理问题”.操作系统平台解决了“应用软件系统与硬件之间的交互与管理问题” ...
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)
原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...
- OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能
OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...
- 基于SOA的组件化业务基础平台[转]
转自https://www.ibm.com/developerworks/cn/webservices/1111_xiaojg_soa/index.html 业务基础平台是业务逻辑和基础架构平台之间的 ...
- [开源]OSharpNS 步步为营系列 - 1. 业务模块设计
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- [转载] 使用C/C++语言编写基于DSP程序的注意事项
原文地址:『转』使用C/C++语言编写基于DSP程序的注意事项作者:skysmile 1.不影响执行速度的情况下,可以使用c或c/c++语言提供的函数库,也可以自己设计函数,这样更易于使用“裁缝师 ...
- 解析大型.NET ERP系统 权限模块设计与实现
权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...
- 基于UML的毕业设计管理系统的分析与设计
基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:“我们要写一个关于UML的专著”,一句话:“一个完整的系统贯穿整个UML的知识”:我:“ ...
- 文献综述七:基于SSM的网上商城的开发与设计
一.基本信息 标题:基于SSM的网上商城的开发与设计 时间:2018 出版源:Computer Knowledge and Technology 文件分类:对框架的研究 二.研究背景 为了解决现在电商 ...
随机推荐
- cobbler无人值守自动安装
无人值守安装(自动按定制的需求来批量安装linux系统) kickstart cobbler linux安装系统的方法: 1,光盘 把iso镜像刻录(windows下有类似nero这类软件)到光盘 ...
- 20165223《Java程序设计》第八周Java学习总结
教材学习内容总结 第12章-JAVA多线程机制 要点 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 教材学习中的问题和解决过 ...
- 牛客小白月赛6C-桃花(DFS/BFS求树的直径)
链接:https://www.nowcoder.com/acm/contest/136/C 来源:牛客网 桃花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- 【CF1154】题解
A 直接模拟即可. B 对数组中的值进行排序去重.发现若去重之后的数组中有大于 3 个数时无解,因为无法找到一个点到数轴上四个点的距离均相等.若去重之后的数组中只有三个值,则判断中间的值是否到两边的值 ...
- 【译】6. Java反射——Getter和Setter
原文地址:http://tutorials.jenkov.com/java-reflection/getters-setters.html ============================== ...
- 2019阿里校招测评题,光明小学完全图最短路径问题(python实现)
题目:光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么?光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连.光 ...
- argparse模块的应用
主要参照博客https://www.cnblogs.com/lindaxin/p/7975697.html http://wiki.jikexueyuan.com/project/explore-py ...
- DB9 ------ 接口定义
下图是母座和公座的接口定义: 特别提醒:以上是公座和母座的接口定义,如果是串口线,RXD就变成TXD,以此类推.
- 3.django学习
##另外一种url配置方法 首先要导入include 要包含blog目录下的urls.py(新建)的文件 从views连接到index
- pxc5.7配置安装
pxc5.7配置安装 一.准备工作 # Centos6. 最小化安装操作系统 ########################---- Centos最小化安装推荐常用依赖包---- ######### ...