本发明是关于一信号处理装置中用以计算存有数字滤波器状态变量的读/写存贮器的地址的地址处理器。 信号处理装置中要设置数字滤波器并将此滤波器的输入采样数据存放在一读/写存贮器中,就需要有某种形式的地址处理器来执行对此滤波器状态变量的写入和读出操作。这些滤波器可以是递归式(IIR)和非递归式(FIR)的。滤波器的计算是由该存贮器中读出状态变量并计算输出数据来进行的。然后这些输出数据即成为下一级滤波器的输入数据(亦即状态变量)而被写回到原存贮器中。通常一滤波器系统可能由数个滤波器构成,这些滤波器还可以具有不同的采样频率。
在计算一滤波器值后,滤波器的所有状态数据均在存贮器中位移一个位置。前一最老的状态变量被后一最老状态变量而改写,而新的采样数据即被存入由位移操作所得到的空出的位置。
这一早已知道的方法地一个缺点是,所说存贮器中的位移操作很费时间,因为所有状态变量都必须被读出并再写入新的存贮器位置中。
另外的缺点是这种位移操作还消耗电能。这一点对诸如由电池驱动的电话中的信号处理装置来说是很重要的,因为此时可用的电能很有限。
用于由一信号处理装置和一读/写存贮器所构成的数字滤波器作状态变量寻址和位移的普通方法是采用一容量为2n的环形缓冲寄存器,其中n是一大于0的整数。由一指针指明最老一状态变量在存贮器中的位置,这就是该环形缓存器的页地址。在读出此最老状态变量后,一新的采样值即被写入所指示的存贮器位置,该最老状态变量即被改写。如果现在指针改变指向下一最老状态变量,该指针就将指明一新的页地址。先前作为下一最老状态的变量现在就成为最老的变量,这一过程的结果就等于将一环形缓存器的全部状态变量位移一个存贮位置,而不是真正地挪动它们。仅仅只是指针被更新来指明新的页地址。因此该方法就被称之为虚拟位移。当该指针到达环形缓存的第一存贮位置时,在下一位移之后它就将指向最后的存贮位置。这样即可将这种缓冲存贮器的寻址方式标之为“模2n寻址”。
但是这一早先熟知的方法有一重大缺点,那就是缓存的容量只能是2n,因而滤波器的容量也必须为2n。这就使该方法只能适用于某些特殊的滤波器。
另一先前已知的方法是采用一任意长度的缓存器,并使所用的指针在进行滤波器计算时由该缓存的末尾移到其起始端。当指针到达缓存起点时,该指针立即重新被装载以缓存器的终端地址,这样该过程可重复进行。
这一早先方法的缺点在于它不可能在任意时刻对任一滤波器中的任意一状态变量进行寻址。此法只有在滤波器随着前面的过程顺次进行计算时才适用。这就使得该方法不可能用于通用地址处理器作起始指示。
本发明的目的是提供一种上述类型的地址处理器,此处理器能对至少两个数字滤波器的一个接一个地存贮在至少一个环形缓冲寄存器中的状态变量进行寻址和作虚拟位移,而所说的那些滤波器具有任意数目的延迟元件,或具有任意的长度,但采样频率相同。
按照本发明,上述目的是借助这样一个地址处理器达到的,此地址处理器设有地址计算装置,用来对一至少含有一存放数字滤波器状态变量[X(n),X(n-1)……;Y(n),Y(n-1)……;W(n),W(n-1)……]的环形缓冲寄存器的读/写存贮器进行地址计算,其中至少一个缓冲寄存器包含有至少两个数字滤波器的状态变量,同一缓冲寄存器中的每一滤波器对应于同样的采样频率(采样速率sample_rate),且缓冲寄存器的长度(模数mod_numb)则取决于各个缓冲寄存器的相应滤波器中延迟元件数的总和。该地址计算装置包括:(a)一组用来存放各环形寄存器所用的相对于所述缓存器的绝对起始地址(模头mod_start)的现行页地址(模指针mod_pointer)的寄存器(s),和(b)执行以下步骤的计算单元(+):
(1)将现行页地址(mod_pointer)与一被选择的状态变量(X(n),X(n-1)……;Y(n),Y(n-1)……;W(n),W(n-1)……)相对于对应缓存起始地址(mod_start)的位移量(data_addr,Write_addr)相加;
(2)如果由步骤(1)所得的和(data_addr+mod_pointer,Write_addr+mod_pointer)大于或等于所说的对应缓存器的长度的话,就将该和数中减去所说的缓存长度(mod_numd);和
(3)将缓存起始地址(mod_start)加到步骤(2)所得结果来求得上述所选择状态变量的绝对地址。
下面将参照附图对本发明作详细说明。
所引用附图为:
图1 表示与本发明相关的数据存贮器内的划分;
图2 表示与本发明相关的缓冲寄存器内的划分;
图3 表示图2所示缓冲寄存器中滤波器的一个滤波器的流程图;
图4 说明在连续执行计算步骤时图2所示缓冲寄存器的滤波器的位置和页地址;
图5 表示按照本发明所实现的一地址处理器优选实施方案;
图6 表示图5所示地址处理器的计算时序图;和
图7 表示用于分别具有2、1和N分支的三个滤波器A、B和C的图5所示地址处理器的信号时序图,其中N是任意的正整数。
图1表明RAM(随机存取存贮器)中含有不同滤波器的状态参数的那一部分的存贮器布局。这一情况是假定该存贮器包括有8个通道CH0~CH7的滤波器。每一通道具有缓冲寄存器BUFF0~BUFF2。缓冲寄存器的数量是随意的,但每一通道都有同等数量的相应长度的缓存器。而缓存器本身又包含滤波器FILTER0~FILTER2。缓存器通常具有不同的长度,但每一缓存器中的滤波器则都响应于相同的采样频率。在本发明中,至少一个缓存器包含两个或更多的滤波器。缓存器的长度决定于滤波器长度之和;事实上,缓存器的长度为所包含滤波器的延迟元件数之和加-。
图1表示一被分成8个通道CH0~CH7的数据存贮器。本发明并不限定为8个通道,而可以是任意个数的通道。此外,图1还指出含有512个存贮单元的存贮器。不过这一数量亦是可以改变的。图2详细说明一缓存器的内容。该示例中,一缓存器包括滤波器起始地址为filter_addr(0)、filter_addr(1)、filter_addr(2)的三个滤波器。以mod_start来标示绝对起始地址。第一滤波器中的状态变量被标为X(n),X(n-1),X(n-2),X(n-3)。其中X(n)为最新的一次采样,X(n-1)为下一次最新的采样,等等。
为了方便以下的说明,首先假定图2所示缓存器中的三个滤波器是非递归的。
在这种情况下,当进行FILTER 0计算时,由最老的状态变量X(n-3)开始,一个接一个地从存贮器中取出状态变量,再乘以由RAM或ROM(只读存贮器)中取出的对应的滤波因数。滤波器的计算就是求这些经过乘法运算后的状态变量之和。在此滤波器被计算过之后,将所得的值Y(n)写入存放该最老的状态变量X(n-3)的存贮器单元。在图2中这一点是以该状态变量、亦即采样值X(n-3)与滤波器输出信号Y(n)共享此存贮器单元来表示的。这样计算所得的滤波器值Y(n),Y(n-1)……以此方法构成对FILTER 1的输入信号。FILTER1作相应地计算,计算后的数值被作为FILTER 2的输入信号写入存放最老状态变量Y(n-2)的存贮器单元中。这种从一个滤波器中输出信号的形成下一滤波器的输入信号的过程是可能的,因为缓冲寄存器中的滤波器均响应于同一采样频率。
图3和4进一步说明此计算过程,并特别谈到涉及递归滤波器时的复杂性。
图3表示一用于图2缓存器中滤波器的一更为通用的滤波器流程图。如先前所说,第一滤波器FILTER 0为一仅只具有横贯部分的非递归滤波器。但第二滤波器FILTER1包括有左边的递归部分和向右边横贯的部分。第三滤波器FILTER 2则仅有一递归部分,而无横贯部分。
在图3中,T表示延迟元件。由图2可以看到,FILTER 0包含有3个延迟元件T和4个因数a0~a3。FILTER 1包含2个延迟元件T和递归部分的2个因数b1、b2,以及横贯部分的3个因数C0~C2。FILTER 2包含有2个延迟元件T和两个因数d1、d2。按照上述计算规则,该缓冲寄存器的长度为3+2+2+1=8。
图4表示图3所示三个滤波器的一系列计算。
注意图4中的两种情况是十分重要的。
首先,状态变量值X(n)……,Y(n)……,W(n)……在它们一旦被存入后就总是存在于被指定的存贮器单元中。在每一新的图(a)~(h)中,n都要减1,即X(n)将被标为X(n-1),等等。但是,该状态变量值依然保留在原先的存贮器单元中。最老的状态变量在不再需要时即为新的状态变量值所改写。因此就无须移动状态变量。
其次,缓存器的页地址(即模指针)mod_pionter是不断地更新的。这一指针总是指向环形缓冲寄存器的叠合点,在现在所说的情况中即FILTER 2和FILTER 0之间的边界地点。指针mod_pointer形成一“0基准”,由它可以求得现行状态变量的正确的绝对地址,这在下面将作详细描述。
为了对某一状态变量的地址进行计算,需利用以下这些变量:
mod_start(模头)=缓冲寄存器的绝对起始地址;
data_addr(数据地址)=所选状态变量相对于缓存器起始地址mod_start的位移量;
Write_addr(写地址)=相对于缓存器起始地址mod_start的所选的写地址;
mod_numb(模数)=缓冲寄存器的长度,可任意选取;
mod_pointer(模指针)=缓存器的现行页地址;
rel_addr(相对地址)=所计算得到的相对于缓存器起始地址mod_start的地址。
dmaddr(绝对地址)=最后的寄存器绝对地址。
当对一状态变量作地址计算时,首先算出和data_addr+mod_pointer。然后检验此和数是否小于mod_numb。如果rel_addr设置成等于此所得的和,即:
rel_addr=data_addr+mod_pointer
但如果不满足上述条件,亦即如果所得和大于或等于mod_numb,那么就将rel_addr设置为:
rel_addr=data_addr+mod_pointer-mod_numb
在这两种情况下,得到的是所求的存贮器位置相对于缓冲存贮器起始地址mod_start的位移量。最后的数据存贮器的绝对地址dmaddr由将所得结果加以mod_start来得出,即:
dmaddr=rel_addr+mod_start
一开始将mod_pointer设置为:mod_pointer=mod_numb-1,因而rel_addr=data_addr-1。
写地址亦按同样方法计算,差别只在于将data_addr置换为write_addr。
FILTER 0,FILTER 1,FILTER 2的计算过程如下。
1)将输入信号写进位置X(n)。
2)按如下方式计算FILTER 0。第一将data_addr设置为filter_addr(0)+index,式中index(变址值)=3。按前述方法利用data_addr的这一数值计算出X(n-3)的地址。由所指示的存贮器单元取出X(n-3)并将其乘以因数a3。然后将变址值index因而亦即data_addr减1。取出X(n-2)并乘以因数a2。将所得乘积与前面所得乘积相加。相应的途径将index逐步减小直到0,从而将FILTER 0中的全部变量依次一个接一个地取出,乘以相应的因数,再相加。这样就完成了FILTER 0的计算。
3)FILTER 1按下面过程进行计算。首先将data_addr设置为filter_addr(1)+index来对左边递归部分进行计算,其中index=2。由此来指引出Y(n-2),并乘以b2,然后将index因而亦即data_addr减1。将所得的乘积与从FILTER 0中所得的结果相加。以相应方法,被乘以因数b1的Y(n-1)也与前面所得结果相加。再一次减小index即得到X(n-3)/Y(n)位置的地址。所得结果Y(n)现在将被写在这一存贮器中的早先状态变量X(n-3)的位置上。这样对FILTER 1的右边横贯部分进行计算所需的全部状态变量Y(n),Y(n-1)和Y(n-2)均齐备了。其计算方法与FILTER 0的计算相同,差别仅在于第一步计算data_addr中所应用的是filter_addr(1)和index=2。
4)FILTER 2的计算方法与FILTER 1的递归部分相同,差别是应用filter_addr(2)来计算data_addr,同时以d1、d2用作因数。在起始步骤中index被设置为等于2。在当index达到0时,其结果W(n)将Y(n-2)值改写。
所有这些计算均是在图4(a)所示这一级进行的。在向图4(b)过渡中,mod_pointer减1而n加1,这样就使得X(n)被称之为X(n-1),等等。下一输入信号值被写入标示X(n)的位置,而后即重复上述的计算周期。
这样,图4(a)~(h)中每一级都使mod_pointer减少一级。当滤波器计算已进行过图4(h)这一级而mod_pointer要被更新时,就执行叠合回到图4(a)所示的位置的操作,此后再重复整个过程。
由上述可清楚看到,缓冲寄存器的存贮区得到相当充分的利用。尤其是此缓冲寄存器可以作模n寻址,这里n为一任意正整数。已经证明这种方法对于实现许多短滤波器特别有利。
下面将参照图5~7来讨论此地址处理器的一个优选实施例。
根据图5所示,地址处理器可在逻辑上被分为三个不同部分。最上面的第一部分中存放缓冲寄存器常数。中间的第二部分执行地址计算。最下面的第三部分存放在适当时刻访问存贮器所需的地址。
对于每一采样频率,sample_rate(采样速率),均存贮有一指针mod_pointer(模指针)。在本优选实施例中,地址处理器具有一包含存放四个不同mod_pointer值的四个寄存器的寄存器组S,每一个mod_pointer相当于一采样频率因而亦即相当于一缓冲寄存器。在此优选实施例中,这些寄存器均为5位长。减量电路DEC(例如由一半减法器组成)使一被选指针在作如上所述应用后减1并将其存入对应的寄存器。当此指针到达0时,也就是说该缓冲寄存器适于进行叠合时,就将一常数装入寄存器。这一常数可以是采用硬件连接线接到寄存器的输入端的。此常数值等于mod_numb-1,其中mod_numb为缓冲寄存器的长度。只有在信号dec_mod_count为高时才执行mod_pointer的减操作。被选择的指针在其被减或装载进计算部分之前被装载入一寄存器mod_reg。有关缓存容量和在存贮器中的缓存地点的常数也可以被硬线连接到寄存器的输入端。信号sample_rate选取对应于一定采样频率的常数存入各不同的寄存器。在本优选实施例中每一寄存器包括4个输入端D1~D4,每一个适用于一种采样频率。关于缓存容量的常数mod_numb是以补码值装载的,即一mod_numb。此常数被载于一长度为5位的寄存器mod_num_reg中。关于存贮器中缓存位置的常数以mod_start值被装载于一6位字长的寄存器mod_sta_reg中。
计算部分包含有两个寄存器,长度为6位的A_reg寄存器和长度为5位的B_reg寄存器,还有一个6位的加法器,例如所谓的进位辅助加法器(carry boost adder),其中该加法器的最高位为一半加单元。
开始计算地址时,根据欲进行的是读操作还是写操作将data_addr或write_addr装载进B_reg。A_reg则或者是在输入端D2由mod_reg装入mod_pointer,或者在输入端D1装入0。寄存器A_reg的装载操作由模无效信号mod_dis根据所选的寻址方式是模寻址还是绝对寻址加以控制。
在绝对寻址方式时(mod_dis为高),将0送入寄存器A_reg,以使输入的地址data_addr或write_addr被加以0。这就使计算单元可直接进行绝对寻址。
在模寻址方式,装进A_reg的mod_pointer被加以装入B_reg的地址:data_addr或write_addr。其结果送回到寄存器B_reg的输入端D3。
存放在寄存器mod_num_reg中的mod_numb的补码值(即-mod_numb)被传送到寄存器A_reg,并与寄存器B_reg的内容相加。其结果假如是非负数的话就被存进B_reg。如果结果为负,则将老的数值存进寄存器B_reg以作下一操作之用。由于寄存器mod_num_reg装入的是mod_numb的补码(即-mod_numb),这就使得上述测试操作简化,因为加运算所得的结果的符号可直接由该结果中的最高位读出。这一位在连线+/-上协同图7中的信号CHSST和IXZ控制对寄存器B_reg的装载操作。
在下一步由寄存器mod_sta_reg传送到寄存器A_reg的常数mod_start与寄存器B_reg的内容相加,其结果在作读操作时存入寄存器RREG,或者在作写操作时被存入寄存器WREG中。这一结果就是进行读或写的最终存贮器地址。
读出因数时要采用绝对寻址,此时因数地址coe_addr被直接送到寄存器CAREG。
地址处理器的下面一部分用来存放地址和进行对存贮器进行访问,它由5个6位寄存器组成。寄存器RREG和WREG前面已经提到过,它们只有一个输入端D1。寄存器DAREG和CAREG分别与数据存贮器总线DMADDRSST和因数存贮器数据总线CMADDRSST相连接。第5个寄存器FBREG以循环的方式存放读和写地址。这些地址分别由输出总线CMADDRSST和DMADDRSST送回到对应输入端D1和D2。这一反馈操作由图7中的信号PDMWSST和PCMWSST控制。
这一反馈寻址方式仅仅只是在地址处理器交替地给出写和读地址时才应用。这种情况的发生是在当一滤波器计算完成后将其结果写入一存贮器单元的同时,开始为下一滤波器进行滤波器计算并为此计算由存贮器中读出数据。当CHSST为偶数时执行写操作,而当CHSST为奇数时执行读操作,见图6(在图6和7中,R代表读,W代表写)。
在本发明的优选实施例中,一个循环读/写过程处理8个通道。两个通道同时处理,以使得最后的读/写操作在周期6和7中进行。
为详细叙述按照本发明的地址处理器优选实施例的运行过程。为地址处理器引用了下列的信号定义,以及下列采用德克萨斯仪器公司的模拟语言RTL所进行的地址处理器的模拟。
地址处理器的信号定义
地址处理器的输入信号
以“sst”结尾的信号和变量表明这些值在“子(slave)”时钟相位内是“稳定的(stable)”,并均处于“真(True)”状态。
BUS 8 chsst; #通道选择。
SIGNAL iz1sst; #对变址起点(index
SIGNAL iz6sst; Zero)和chsst加以门
SIGNAL iz7sst; 控。在由存贮器中读
出最后采样值时IXZ
成为高电平。
SIGNAL pdmwsst; #数据存贮器准备写。
SIGNAL pcmwsst; #因数存贮器准备写。
对将数据和因数写地址装进输出寄存器DAREG,CAREG和FBREG的控制。
SIGNAL cwsst #因数写方式
将地址处理器设定为绝对地址计算方式。当这一信号成为高电平时即开始对因数存贮器的写地址的计算。“apcsst”为控制装置所产生的指令字的一组成部分。
BUS 23 apcsst #地址处理器控制。
coe_addr=apcsst[5∶0]; #6位的因数地址。
data_addr=apcsst[10∶6]; #5位的数据地址。
write_addr=apcsst[15∶11]; #5位的写地址。
每次当变址计数器减量时,数据和写地址均减1。变址计数器被装载以滤波器长度“number_of_taps”。这全部在控制单元中完成。
dec_mod_count=apcsst[16]; #用于模计数器减量的
1位的控制信号。
mod_en_r=apcsst[17]; #读方式下,模地址计
算的1位使能信号。
sample_rate_r=apcsst[19∶18];#读方式下,选择环形
缓冲寄存器的2位选
择信号。
mod_en_w=apcsst[20]; #写方式下,模地址计
算的1位使能信号。
sample_rate_w=apcsst[22∶21];#写方式下,选择环形
缓冲存贮器的2位选
择信号。
时钟和测试信号
SIGNAL 1st; #本机子时钟为真。
SIGNAL 1mt; #本机主时钟为真。
SIGNAL 1tt; #本机测试时钟为真。
SIGNAL 1gsr11tt; #为全程扫描链的本机
测试时钟。
SIGNAL 1scanisst; #测试扫描本机输入。
SIGNAL 9scanisst; #测试扫描全程输入。
SIGNAL 1scanosst; #测试扫描本机输出。
SIGNAL 9scanosst; #测试扫描全程输出。
地址处理器的输出信号
BUS 6 dmaddrsst; #数据存贮器地址。
BUS 6 cmaddrsst; #因数存贮器地址。
本机变量
REG 6 d_a_reg #数据地址寄存器DAREG。
REG 6 c_a_reg #因数地址寄存器CAREG。
REG 6 w_del_reg_m; #写主延迟寄存器WREG。
REG 6 w_del_reg_s; #写从延迟寄存器。
REG 6 r_del_reg_m; #读主延迟寄存器RREG。
REG 6 r_del_reg_s; #读从延迟寄存器。
REG 6 feedback_reg_m; #主反馈寄存器FBREG。
REG 6 feedback_reg_s; #从反馈寄存器。
REG 6 a_reg; #至加法器的输入寄存器。
REG 6 b_reg; #至加法器的输入寄存器。
REG 5 mod_reg_m; #主模指针寄存器。
REG 5 mod_reg_s; #从模指针寄存器。
REG 6 mod_numb_reg_m; #主模数寄存器;
REG 6 mod_numb_reg_s; #从模数寄存器;
REG 6 mod_start_reg_m; #主模头寄存器;
REG 6 mod_start_reg_s; #从模头寄存器;
以通道选择时隙7作为门限的变址起点
FF iz7_de11_m; #主变址零延迟的触发器。
FF iz7_de11; #从变址零延迟的触发器。
FF iz7_de12_m; #主变址零延迟的触发器。
FF iz7_de12; #从变址零延迟的触发器。
REG 5 mod_a_reg_m(4); #主模指针寄存器堆栈
(mod_numb-1)。
REG 5 mod_a_reg_s(4); #从模指针寄存器堆栈。
REG 6 sum; #加法器的输出总线。
SIGNAL mod_dis; #模禁止,在其为真时作
绝对寻址。
BUS 2 sample_rate; #采样速率。根据取决于
采样频率的采样缓冲寄
存器选择环形缓冲寄存
器。
ROM 5 mod_numb(4); #4个5位的模数常系数
(-mod_numb)。
ROM 6 mod_start(4); #4个6位的模头常系数。
用RTL语言的地址处理器的模拟
BLOCK addrpr(
INPUT BUS 8 chsst; #通道选择。
INPUT SIGNAL iz1sst; #变址起点。
INPUT SIGNAL iz6sst;
INPUT SIGNAL iz7sst;
INPUT SIGNAL pdmwsst; #准备写数据存贮器。
INPUT SIGNAL pcmwsst; #准备写因数存贮器。
INPUT SIGNAL cwsst; #写因数。
INPUT BUS 23 apcsst; #地址处理器控制。
coe_addr=apcsst[5∶0]; #6位因数地址
data_addr=apcsst[10∶6]; #5位数据地址
write_addr=apcsst[15∶11]; #5位写地址
dec_mod_count=apcsst[16]; #1位控制信号
mod_en_r=apcsst[17]; #1位读使能
sample_rate_r=apcsst[19∶18]#2位读选择
mod_en_w=apcsst[20]; #1位写使能
sample_rate_w=apcsst[22∶21]#2位写选择
INPUT SIGNAL 1st; #从时钟
INPUT SIGNAL 1mt; #主时钟
INPUT SIGNAL 1tt; #本机测试时钟
INPUT SIGNAL 1gsr11tt; #全程测试时钟
INPUT SIGNAL 1scanisst; #测试扫描本机输入
INPUT SIGNAL gscanisst; #测试扫描全程输入
OUTPUT SIGNAL 1scanosst; #测试扫描本机输出
OUTPUT SIGNAL gscanosst; #测试扫描全程输出
OUTPUT BUS 6 dmaddrsst; #数据存贮器地址
OUTPUT BUS 6 cmaddrsst; #因数存贮器地址
LOCAL REG 6 d_a_reg #数据地址寄存器
LOCAL REG 6 c_a_reg #因数地址寄存器
LOCAL REG 6 w_del_reg_m; #写主延迟寄存器
LOCAL REG 6 w_del_reg_s; #写从延迟寄存器
LOCAL REG 6 r_del_reg_m; #读主延迟寄存器
LOCAL REG 6 r_del_reg_s; #读从延迟寄存器
LOCAL REG 6 feedback_reg_m; #主反馈寄存器
LOCAL REG 6 feedback_reg_s; #从反馈寄存器
LOCAL REG 6 a_reg; #加法器输入寄存器
LOCAL REG 6 b_reg; #加法器输入寄存器
LOCAL REG 5 mod_reg_m; #主模寄存器
LOCAL REG 5 mod_reg_s; #从模寄存器
LOCAL REG 6 mod_numb_reg_m; #主模数寄存器
LOCAL REG 6 mod_numb_reg_s; #从模数寄存器
LOCAL REG 6 mod_start_reg_m; #主模头寄存器
LOCAL REG 6 mod_start_reg_s; #从模头寄存器
LOCAL FF iz7_de11_m; #主变址零延迟触发器
LOCAL FF iz7_de11; #从变址零延迟触发器
LOCAL FF iz7_de12_m; #主变址零延迟触发器
LOCAL FF iz7_de12; #从变址零延迟触发器
LOCAL REG 5 mod_a_reg_m(4); #主模寄存器堆栈
LOCAL REG 5 mod_a_reg_s(4); #从模寄存器堆栈
LOCAL REG 6 sum; #加法器输出寄存器
LOCAL SIGNAL mod_dis; #模禁止
LOCAL BUS 2 sample_rate; #采样速率
ROM 5 mod_numb(4); #模数常系数
ROM 6 mod_start(4); #模头常系数
#=
运行过程
#循环缓冲寄存器常数,采样频率
#-
mod_numb(0):=15; #32KHz,缓存器容量
mod_numb(1):=16; #16KHz
mod_numb(2):=9; #8KHz
mod_numb(3):=5; #500Hz
mod_start(0):=49; #32KHz,存贮器中的
起始地址
mod_start(1):=33; #16KHz
mod_start(2):=24; #8KHz
mod_start(3):=20; #500Hz
#=
#如果为真,即为绝对寻址方式
#-
mod_dis:=(^mod_en_w+cwsst)*(iz6sst+iz7sst+iz7_de11),
+^mod_en_r*(chsst[3]+chsst[4]+chsst[5]);
#=
#***模计数器***
sample_rate:=SELECT(chsst[5]:sample_rate_w;
Else sample_rate_r);
#选择环形缓冲存贮器
#检测1mt边界,“变址起点1”时隙中的“减量模计数器”
#-
1F 1mt*^\1mt*dec_mod_count*iz1sst
1F mod_reg_s=0 #缓存器指针初始化
mod_a_reg_m(sample_rate):=mod_numb(sample_rate)-1;
#缓存器指针减1
ELSE
mod_a_reg_m(sample_rate):=mod_reg_s-1;
END
END
1F 1st #主到从
mod_a_reg_s(sample_rate):=mod_a_reg_m(sample_rate);
END
#=
1F 1mt #主时钟相位
iz7_de11_m:=iz7sst;
iz7_de12_m:=iz7_de11; #分别循环延迟“7”
变址起点1和2周期
#由堆栈装载模寄存器
mod_reg_m:=mod_a_reg_s(sample_rate);
1F(chsst[2]+chsst[5]) #装载缓存器容量
mod_numb_reg_m:=(-mod_numb(sample_rate));
#装载缓存器起始地址
mod_start_reg_m:=mod_start(sample_rate);
END
#数据装入寄存器A和B
#-
a_reg:=SELECT
(
(chsst[5]+chsst[0])*^mod_dis:
mod_start_reg_s;
(chsst[4]+chsst[7])*^mod_dis:
mod_numb_reg_s;
(chsst[3]+chsst[6])*^mod_dis:
mod_reg_s;
mod_dis:oxoo; #绝对寻址方式
ELSE\a_reg #保持寄存器A中的老数据
);
b_reg:=SELECT
(
chsst[3]:data_addr;
iz6sst:write_addr;
^sum[5]*(chsst[4]+chsst[5]+iz7sst+iz7_de11):sum;
ELSE\b_reg
#保持寄存器中的老数据
);
IF chsst[6]
r_del_reg_m:=sum; #以计算得的地址装载“读
延迟寄存器”RREG
END
IF iz7_de12
w_de1_reg_m:=sum; #以计算得的地址装载“写
延迟寄存器”WREG
END
#-
#***装载因数地址CAREG***
c_a_reg:=SELECT
(
iz7sst*pcmwsst:w_de1_reg_s;
#WREG
chsst[0]:coe_addr; #外部地址
^iz7sst*^chsst[0]*pcmwsst:feedback_reg_s;
ELSE\c_a_reg
);
#-
#***装载数据地址DAREG***
d_a_reg:=SELECT
(
iz7sst*pdmwsst:w_de1_reg_s;
#WREG
chsst[0]:r_de1_reg_s;#RREG
^iz7sst*^chsst[0]*pdmwsst:feedback_reg_s;
ELSE\d_a_reg
);
#-
#****装载反馈地址FBREG****
feedback_reg_m:=SELECT
(
pdmwsst:dmaddrsst; #数据存贮器地址
pcmwsst:cmaddrsst; #因数存贮器地址
ELSE\feedback_reg_m
);
END #1mt
#=
#从主到从转换
#-
1F 1st
mod_reg_s:=mod_reg_m;
mod_numb_reg_s:=mod_numb_reg_m;
mod_start_reg_s:=mod_start_reg_m;
sum:=a_reg+b_reg #计算
r_del_reg_s:=r_del_reg_m;
w_del_reg_s:=w_del_reg_m;
feedback_reg_s:=feedback_reg_m;
dmaddrsst:=d_a_reg; #将数据地址送到总线上
cmaddrsst:=c_a_reg; #将因数地址送到总线上
iz7_de11:=iz7_de11_m;
iz7_de12:=iz7_de12_m;
END #1st
END #运行过程
应理解的是,本发明并不限于此专门描述的实施方案,熟悉本技术领域的人可实现许多改型。例如说,如果将最后一个采样值X(n)另外存放在一附加的寄存器中,就可以将缓冲寄存器的长度减1,从而使其等于该缓冲寄存器所包含的滤波器中延迟元件数的总和。此外,通道数,每一通道中的缓冲寄存器数,不同寄存器的字长,以及在各不同寄存器中装载常数的方法,均可加以改变而不背离所附专利权利要求中所定义的发明思想。