使用Digital Discovery查看Zynq启动顺序

介绍

在开发新的FPGA板时,了解板上硬件的规格和信号的时序是很重要的。数字发现提供了一个高速逻辑分析仪,允许您可视化和分析通过板的信号。在开发新的Zynq Board的过程中,QSPI交易在引导序列中的速度并不是一个明显的规范。本项目使用数字发现可视化启动顺序以确定时间。

库存

  • 数字发现
  • Zynq董事会与闪光灯
  • 如果有SOIC夹
  • 电线

图1所示。SOIC夹。

当决定如何解决这个问题时,有两个更小的仪器设备,具有逻辑分析仪,模拟发现2和数字发现。使用数字发现而不是模拟发现2有两个原因。第一个原因是QSPI事务可以以更高的时钟速度发生,超过100兆赫,所以有一个足够的抽样率是非常重要的。另一个原因是512MB数字发现的DDR存储器,它可以执行非常大的收购。

第一步:连接数字发现

连接方式如下:

QSPI信号 QSPI /夹销 数字发现销
cs 7 DIO0
clk 16 DIO1
d0 15 DIO2
d1 8 DIO3
d2 9 DIO4
d3 1 DIO5
接地 10 接地

图2。连接

当使用像这样的电缆时,一定要检查信号的完整性/串扰。在某些情况下,用接地需要连线(在本例中是蓝色的cs连线)。

步骤2:QSPI脚本

使用自定义解释器将QSPI信号转换为数据。这是通过添加一个“自定义”通道从逻辑仪器在波形。下面是解释QSPI信号的js代码。

// rgData: input, raw digital sample array // rgValue: output, decoded data array // rgFlag: output, decoded flag array var c = rgData. rgValue: output, decoded flag arraylength // c =原始样本数量var pClock = false;//之前的公鸡信号电平var iStart = 0;//用于跟踪单词开始索引var cByte = 0;//每个传输的字节计数var cBits = 0;//比特计数器var bValue = 0;// value变量var fCmd = true;For (var I = 0;我< c;i++){//每个样本var s = rgData[i];//当前样本var fSelect = 1&(s>>0); // pin0 is the select signal var fClock = 1&(s>>1); // pin1 is the clock signal var fData = 1&(s>>2); // pin2 is the data signal var fData4 = 0xF&(s>>2); // DIN 2-5 DQ 0-3 if(fSelect != 0){ // select active low // while select inactive reset our counters/variables iStart = i+1; // select might become active with next sample cByte = 0; cBits = 0; bValue = 0; pClock = false; fCmd = true; continue; } if(pClock == 0 && fClock != 0){ // sample on clock rising edge bValue <<= 4; // serial data bit, MSBit first bValue |= fData4; cBits++; if(cBits==2){ // when got the 8th bit of the word store it cByte++; // store rgValue/Flag from word start index to current sample position for(var j = iStart; j < i; j++){ // Flag change will be visible on plot even when data remains constant. // This is useful in case we get more consecutive equal values. rgFlag[j] = cByte; rgValue[j] = bValue; } iStart = i+1; // next word might start after this sample cBits = 0; // reset bit count for the next byte bValue = 0; // reset value variable } } pClock = fClock; // previous clock level }

与此解释器并行,我们还可以使用标准SPI来查看不是通过QSPI发送的指令,例如第一个读指令。

步骤3:触发和获取

虽然最大QSPI时钟频率大约是100兆赫,启动时,最大频率为25兆赫使用。而且,整个引导传输大约需要700毫秒。正因为如此,大量的样本和适当的样本率都是需要的,这就是数字发现派上用场的地方。2.68亿样本,200兆赫将转换为约1.3秒的帧。

收购本身是相当高的要求,使用大量的个人电脑的内存(16GB),处理数据也需要很长时间。

触发器设置在下降的边缘CS信号。

下面是Waveforms捕获的整个QSPI事务。

图3。完整的事务。

注意在采集的左端附近的短暂停顿,也就是时钟频率从5.4改变的地方兆赫到25兆赫

步骤4:引导传输

为了理解数据传输所代表的含义,需要读取两个文档。一个是Zynq TRM另一个是闪存的数据表

从Zynq发送到闪存的指令总是通过使用D0的SPI发送。发送的第一个指令是0x03 0x00 0x00 0x20,这意味着SPI从地址0x20读取,并且也通过SPI使用D1, 0x66 0x55 0x99 0xaa接收回复。闪存读取指令在数据表的第85页有解释。

图4。第一次转移。

在Zynq TRM的第170和179页解释了这个回复的意思。简而言之,这组字节告诉Zynq内存是QSPI能力。同样重要的是注意到,此时SPI时钟频率是5.405兆赫,这是一个相对较低的速度。

从这一点开始,由于已经确定内存支持QSPI,所有事务将在所有4条数据线上完成。例如,下一条指令将是0x6b,后面跟着一个3字节的地址。0x6b表示一个四读指令,QSPI解释器将在8个时钟周期后看到响应,这是“哑”字节。

图5。第二次转移。

在这种情况下,地址是0x1d,读取7个字节。这些字节来自地址0x1d, 0x1e, 0x1f,它们是中断表的一部分,然后它从地址0x20读取4个字节,这是在第一次SPI读取时读取的相同字节。

Zynq将继续读取字节,不断增加地址,直到到达0x45,这是bootROM头的结束。

不幸的是,由于我们不能访问BootROM代码,引导序列的其余部分就不是那么透明了。在某个点上,FSBL(第一阶段引导加载程序)将开始运行,最可能的情况是SPI时钟频率更改为25兆赫如下所示,启动过程开始后的84毫秒。

图6。FSBL开始。

然后FSBL将读取引导映像并分析它包含的不同分区,包括配置Zynq的PL的.bit文件和将在ARM中运行的.elf文件。

关于引导映像和引导过程的更多细节可以在本用户指南