数字信号处理中的时间控制

光有控制,没有数据,不像一个电路。

只有数据,没有控制,数据没有办法在合适的时机出现在合适的点。

控制,比较集中于对时间的掌握。

数据,则在于运算,在于用多个数据生成一个新的数据。

数据的生成者主要在于运算。

生成之后,就要提供,提供的角色就换到了控制那里。

控制,在于时间的控制,时间何以控制?芯片里面,时间是可以倒退的,可以完全复现若干时间以前的现场,现场主要指的就是数据。

利用内存,进行倒退,是控制时间的一种,但更多是时间的安排。

怎么理解数据处理代码中的时间控制部分?这里会以一个DCOC+DAGC模块为例子看时间控制。

这个模块不涉及向量处理,只有一般的数据处理。

一般这样的处理都可以以MAC作为基本单元,一次乘法,和一次加法。

乘法可以是两笔数据,也可以是一笔数据的点1和点2。

加法可以是对两个数据,也可以是一笔数据的前一结果和后一结果。

第一步还是先了解代码的骨架。不同类型的代码,骨架有不同的样子。

对于数据处理类的IP,核心是运算单元,乘法,加法,移位等。

从代码量看,DAGC占了最主要的部分。

DCOC,使用DAGC计算出来的DC值,将其从输入中减去,得到了输出。这里只有减法(也就是加法)。

输入,一般指明数据何时有效,包括何时有效,持续多长时间,是否有空隙等。

上图说的是这个模块的数据连续有效,且持续多个时钟周期。

运算过程即DIN-DC。

输出过程,其以Counter作为输出的使能,counter是一个每隔一拍有效一次的信号。

所以,输出进行了2倍的降采样。

接下来是DAGC模块。

输入是两个时钟周期一个数据,并且是I, q通路同时的。

I,q两路数据是否是同时计算的呢?不是。

I路是在上半个周期来做的,q路是在下半周期来做的。

这里data buf用于在cal的过程中使用, data direct则是校准完毕后使用。可以看到,校准过程中,数据率降采样了4倍,而校准完毕后降采样了2倍。

它的输出是下面这样的:

可以看到,每隔一个时钟周期,输出i,q两路数据。

接下来看一下中间的过程:

 上图是计算rssi的数据流和结构图。

其计算rssi,并将其减去dc。

Dc计算过程可以用下面的式子进行表达

Dc=((phase.init*c1)^2 + c2)*SUM(x(n)*phase(n))

图中每一根虚线是两级流水线或者流水线和输入/输出端口的边界,数据在此处,当前级输出被记录,下一级输入被更新。

每一级流水内对数据进行去饱和(sat),取位(round),以及乘法,加减,取绝对值,数据选择(MUX),移位(averaging)等操作。

不同的流水线,代表了不同的时间。

时间是以时钟的周期作为单位的,因为数据更新的周期即是一个时钟周期。

在代码上,即表现为,

next_pipe <= pre_pipe。

这生成了一个寄存器。天然具有一个时钟周期更新一次数据的属性。

除此之外,计数器和状态机可以影响控制。

具体体现在级间(寄存器)的数据更新会使用计数器和状态机,级内的数据运算也会使用计数器和状态机。

细看第一级流水

这里输出仅有一个,而输入有6个之多,并且运算也不是单一的,而是多次运算组合起来的。有乘法,有取补码,还有选择器(MUX)。

先看一下输出级的控制,这里没有特别的控制,因此它每一个时钟周期都会更新。

再看运算中计数器逻辑,这里用在了MUX上。

看一下第二个用作factor选择的MUX。

其由gain_cal_done,counter,以及factor_sel三个信号控制。

其中factor_sel是静态的。与流水无关。

Gain_cal_done是基于counter与sample_cnt产生的。

因此从源头来讲,控制MUX的是counter和sample_cnt两个计数器。

counter实际是一个从0到3计数的计数器。

为什么要有这个计数器呢?

因为时钟是320M的,而数据呢,实际是80M的有效速率的。因此,在一个数据周期内,将有4个时钟周期,而这个计数器就是用来区分这4个时钟周期。

当为2,3,0,1的时候分别是第一,第二,三,四个时钟周期。

而sample_cnt就是这个数据的计数,为0的时候,它是第一个数据,为1的时候它是第二个数据,…,可以最多计数到255。

我们看一下这个counter以及sample_cnt对数据运算有何影响。

当gain_cal_done时,将会使用gain_cal得到的值。

当非gail_cal_done时,将会使用依据相位偏移值(phase_inc_rot)决定的值,也就是ocosval和osinval。

具体所选的值依据counter决定。

当counter为2时,选用osinval,

counter为3,0时选用ocosval,

counter为1时,选用osinval的补码。

再细看第二级

第二级的输出有两个,一个是phase_inc_rot,而这却是第一级的输入,当然不是严格的第一级的输入,不管如何,第一级是需要phase_inc_rot的,而第二级才产生phase_inc_rot,看过去存在一点问题。

这个图,是从后往前倒推而成,最前面的一级被命名成了第一级。这不能说明第二级一定比第一级晚。

如果从前往后推,那么Phase_inc_rot应该都处于第一级的前面,这是排布上的问题。

但不可能总要求从前往后推,那怎么避免碰到现在这种让人疑惑的现象?

问题的症结在于时间的前后逻辑关系,而非在图表上的排布先后,图表上的排布先后能够反应物理层面的先后关系,但是逻辑层面的关系还需要看输入,运算和输出的利用counter,状态机等的使能情况。

猜你喜欢

转载自blog.csdn.net/reekyli/article/details/121843341