使用Digital Discovery查看Zynq的启动顺序

介绍

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

库存

  • 数字发现
  • Zynq board with flash
  • SOIC夹(如有)
  • 电线

图1所示。SOIC夹。

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

步骤1:连接数字发现

需要进行以下连接:

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代码。

// rgValue:输出,解码数据数组// rgFlag:输出,解码标志数组var c = rgData。length // c = number of raw samples var pClock = false;//之前的cock信号电平var iStart = 0;//用于跟踪单词开始索引var cByte = 0;//每个传输的字节计数var cBits = 0;// bitcounter 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发送的指令,例如第一个读取指令。

第三步:触发和获取

尽管最大的QSPI时钟频率大约是100兆赫,启动时,最大频率为25次兆赫使用。另外,整个引导传输过程大约需要700毫秒。正因为如此,我们需要大量的样本和相当高的采样率,而这正是数字发现派上用场的地方。2.68亿个样本,200兆赫将转换为约1.3秒的帧。

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

扳机就在下落的边缘CS信号。

下面是波形捕捉的整个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表示一个四步读指令,在8个时钟周期之后,响应将在QSPI解释器上看到,这是“虚拟”字节。

图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文件。

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