任意波形发生器基于脉冲计数器的数值实时产生动态波形序列

February 15, 2022 by Fei Liu

介绍

多通道任意波形发生器 HDAWG 具有脉冲计数器升级选件。任意波形发生器模块和脉冲计数器模块可以同时工作。这样 HDAWG 就同时具备了测控信号输出的能力和检测系统响应的能力。HDAWG 的定序器 Sequencer 支持高级定序功能,支持动态跳转。那么,可不可让任意波形发生器的输出序列根据脉冲计数器的数值进行实时动态跳转呢?可以,而且很方便,仅需要在定序程序 sequence 中加入几行代码即可实现。在这篇博文中,我将给大家介绍如何设置仪器和编写定序器程序。

八通道 HDAWG 有 4 个(四通道提供版本的仪器是 2 个)AWG 内核。每个内核可以独立定序,即独立运行一个 sequence 程序。这为我们做测试带来很大方便。在这个示例里,我们用到两个 AWG 内核。第一个内核用来产生测试信号,这些信号将给到脉冲计数器。第二个内核用来根据脉冲计数器的数值来产生波形序列。它的定序程序将访问脉冲计数器的数值,并进行条件分支跳转。

产生测试信号

HDAWG 连接示意图

Figure 1: HDAWG 连接示意图。测试信号的脉冲序列由模拟输出端口 Wave 1 输出,脉冲计数器的门控信号由数字标记信号 Mark 1 输出。脉冲序列经触发输入 Trig 3 端口作为脉冲计数器的输入信号。脉冲计数器的门控信号经 Trig 4 接入。仪器与电脑用更高速的 1 GbE 网口连接,能够更好的传输脉冲计数器的高数据流。

HDAWG 的波形输出设置

Figure 2: HDAWG 的波形输出设置。通道 1 和通道 2 相同,由定序器 Sequencer 1 控制。通道 3 由 Sequencer 2 独立控制。

如 Figure 1 所示,我们将 HDAWG 的各个接口进行连接。为了给脉冲计数器产生测试信号,我们用第一个 AWG 内核产生两个信号: 脉冲信号和门控信号。脉冲信号是一个循环播放的序列,波形序列内有三段,每段分别是 3 个脉冲信号,2 个脉冲信号,1 个脉冲信号。在每一段内,我们把门控信号设为有效,即高电平。在每一个门控内,我们希望脉冲计数器对脉冲进行计数,计数不累计。那么,我们脉冲计数器的数值应该是 3-2-1 循环。

const N = 1024;
wave pulse = rect(N, 1);
while(1){
setTrigger(0b0011);// 门控信号打开。AWG Trigger 经 Marker 通道输出。
//第一段脉冲序列
repeat(3){playWave(1, pulse, 2, pulse);waitWave();wait(10);}
setTrigger(0b0000); //门控信号关闭
wait(N/4);

setTrigger(0b0011);
//第二段脉冲序列
repeat(2){playWave(1, pulse, 2, pulse);waitWave();wait(10);}
setTrigger(0b0000); //门控信号关闭
wait(N/4);

setTrigger(0b0011);
//第三段脉冲序列
repeat(1){playWave(1, pulse, 2, pulse);waitWave();wait(10);}
setTrigger(0b0000);//门控信号关闭
wait(N/2); 
}

下面具体介绍产生测试信号的 sequence 程序。脉冲信号是一个矩形波,通过 playWave 播放,也就是经过模拟输出通道 1 输出。通道 2 上的波形跟通道 1 一样,不是必须的,仅作为通道 2 的伴随信号,方便我们用示波器查看,减少线路切换。我们用 AWG Trigger 作为 Marker 输出的门控信号源。每个 AWG 内核有 AWG Trigger 1/2/3/4。在 sequence 内可以用 setTrigger 命令来设置同设置这些 AWG Trigger 的电平。我们在每一段(repeat 内播放的)脉冲序列播放前把门控信号设为高电平,结束后重置为低电平。其中 setTrigger(0b0011) 是把当前内核的 AWG Trigger 1 和 2 都设为高电平。这里我们其实只需要 AWG Trigger 1。AWG Trigger 2 的设置不是必须的,仅作为 AWG Trigger 1 的伴随信号,方便我们用示波器查看,减少线路切换。 AWG Trigger 经 Marker 输出,如 Figure 3 所示。运行 sequence,我们可以得到脉冲序列和门控信号,如 Figure 4 所示。

HDAWG 的 DIO 选项卡

Figure 3: HDAWG 的 DIO 选项卡。数字标记输出 Marker 1 的信号源设置为 AWG 内核 1 的 AWG Trigger 1。任意波形发生器 Trigger 3 和 4 的触发阈值都设为 200 mV,输入阻抗 50 欧姆为选中。

 HDAWG 产生的测试信号

Figure 4: HDAWG 产生的测试信号。蓝色是模拟输出端口播放的脉冲序列,脉冲计数器将对其进行计数。橙色是数字标记通道输出的信号,作为脉冲计数器的门控信号。门控信号把脉冲序列分为三段。

脉冲计数器设置

仪器内有多个脉冲计数器,它们能够并行工作。我们仅需要一个,这里我们使用脉冲计数器 3。脉冲计数器有四种工作模式。在自由运行 Free Running 模式时,计数器以 Period 设置的时间长度,反复计数。我们需要门控模式。在此模式下,脉冲计数的时间窗口长度取决于门控高电平保持的时间的长短。也就是,计数周期 Period 参数变为无效。脉冲计数器的输入是仪器前面板的 Trig 3,如 Figure 1 所示,它与模拟输出 Wave 1 相连。门控信号是仪器前面板的 Trig 4, 它与仪器前面板的 Mark 1 (即 AWG 内核 1 的 AWG Trigger 1)相连。脉冲计数的阈值和门控信号的阈值可以在 DIO 选项开内调节,如 Figure 3 所示。对于脉冲信号,为了避免阻抗不匹配造成信号失真,我们把 50 欧姆输入阻抗选中。运行 Enable 脉冲计数器 3 后,我们可以用 LabOne 的绘图仪 Plotter 功能查看脉冲计数器的结果,如 Figure 6 所示。

HDAWG 的脉冲计数器的设置

Figure 5: HDAWG 的脉冲计数器的设置。脉冲计数器工作在门控 Gated 模式。脉冲信号是 Trigger 3,门控输入是 Trigger 4。脉冲计数器的结果不累计,即 Integrate 设为无效。

LabOne 的绘图 Plotter 工具显示脉冲计数器的数值

Figure 6: LabOne 的绘图 Plotter 工具显示脉冲计数器的数值。数值按照 3-2-1 循环。

动态定序

 定序程序 1:if-else 

while (1) {
waitCntTrigger(0); wait(4);
if (getCnt(0) == 3) {playWave(1, ones(1024));} 
else {
if (getCnt(0) == 2) {playWave(1, 0.5*ones(1024));} 
else { if(getCnt(0) == 1) {playWave(1, 0.25*ones(1024));} }
          }
}

 定序程序 2:switch-case 

while(1){
waitCntTrigger(0); wait(4);
switch (getCnt(0) ) {
  case 3: playWave(ones(1024));
  case 2: playWave(0.5*ones(1024));
  case 1: playWave(0.25*ones(1024));
  default: playWave(zeros(1024));
		   }
}

HDAWG 支持多种高级定序功能。这里我们演示 if-else 和 switch-case 两种方式实现动态跳转。我们希望这样的程序:获取计数器的数值,判断大小,根据判断结果播放不同的波形,这样无限循环。如果计数器的数值越大,播放的脉冲幅度越大。我们使用第二个 AWG 内核 Core。定序程序 sequence 内使用 getCnt 来得到当前脉冲计数器的数值。我们写 getCnt(0),这里的 0 指代当前 AWG 内核的 0 号计数器,是整个仪器内第三个脉冲计数器,如 Figure 5 中 LabOne 界面所示。如果 sequence 在 AWG 内核 0 上运行,那么 getCnt(0) 得到是整个仪器内第一个计数器的数值。注意,在使用 getCnt 前,我们调用了 waitCntTrigger(0) 命令,这个命令是等待脉冲计数器“一段”计数结束后——在门控模式下是门控信号的下降沿之后——sequence 才运行下一条命令。如果去除 waitCntTrigger 命令,可能造成同一个脉冲计数结果被多次用于判断,进而多次播放波形。这里 wait(4) 命令是给机器获得最新的脉冲计数的数值的时间。

实验结果

在 Figure 7 中,我们有 if-else 程序输出的波形序列,Figure 8 是 switch-case。动态跳转如预计那样运行:先播放幅度大的脉冲,然后减弱,这样循环。大脉冲对应测试信号有连续 3 个脉冲的部分,即脉冲计数器的数值是 3;小脉冲对应测试信号中 1 个脉冲的部分,即脉冲计数器的数值是 1。

两种方式都很好地实现了功能。现在我们来看看动态跳转的延时。以门控信号的下降沿进入仪器作为时间参考点,响应脉冲的第一个波形点从仪器前面板输出的延迟都很低。但是 if-else 与 switch-case 延迟两者不同。定序程序 sequence 内 if-else 嵌套语句因为是顺次执行,所以嵌套在深层的条件对应的波形输出延迟更长。如 Figure 7 所示,延时分别约为 248 ns(最外层)、288 ns、321 ns(最内层)。类似地, switch-case 延迟随 case 在 sequence 中的先后次序增长,分别约为 258、268、275 ns。

 门控信号和用 if-else 语句实现的动态序列

Figure 7: 门控信号和用 if-else 语句实现的动态序列。蓝色是动态序列。橙色是脉冲计数器的门控信号。门控高电平部分对应有测试脉冲的时间窗口,窗口越长,测试脉冲数量越多。响应的脉冲序列的幅度从高到低循环变化。

 门控信号和用 switch-case 语句实现的动态序列

Figure 8: 门控信号和用 switch-case 语句实现的动态序列。蓝色是动态序列。橙色是脉冲计数器的门控信号。门控高电平部分对应有测试脉冲的时间窗口,窗口越长,测试脉冲数量越多。响应的脉冲序列的幅度从高到低循环变化。

总结

HDAWG 内集成的脉冲计数器功能可以与定序功能无缝集成。任意波形发生器的定序程序可以直接实时得到脉冲计数器的数值,可以依据数值进行条件分支跳转,播放不同的序列。

  • 仪器硬件接口丰富,配置灵活。脉冲计数器可以采用触发输入接口或者 DIO 作为输入信号。门控信号同样也可以利用这些接口。
  • 脉冲计数器有四种工作模式。这里我们用到门控模式,它可以方便我们选择脉冲计数器工作的时间窗口,仅在我们感兴趣的时段工作。
  • 定序器访问计数器的数值非常简便,仅需 getCnt 命令即可。每个定序器可以访问两个脉冲计数器,可满足系统中需要多个脉冲计数器的需求,实现更加复杂的定序和动态跳转。
  • 动态跳转延时极低。从脉冲计数器的门控信号结束到跳转响应波形输出最低小于 250 ns。
  • 仪器内置绘图仪 Plotter 功能,可显示脉冲器的数值的时间序列,方便调试。

如果您对这个功能感兴趣,欢迎联系我们 info.cn@zhinst.com