在之前的设计开发时,利用modelsim得出中间某单元的数据,并且输入也是设计者在testbench中自己给出的。但是,实际应用时,外部输入的信号不一定和我们在testbench中所描述输入的信号相同,就有可能导致RTL仿真成功,但是下板测试失败。
signal tap logic analyzer 采集并显示FPGA设计中的实时信号行为,从而无需额外的I/O管脚或者外部实验室设备即可检查正常器件操作期间内部信号的行为。
在数据获取期间,器件中的存储器模块存储采集的数据,然后通过JTAG通信电缆将数据传输到逻辑分析仪。
下图为signal tap logic analyzer的任务流程。
设计要求
利用逻辑分析仪测量出电脑发送UART(波特率为115200时)是每bit时间宽度。
设计分析
在UART协议中规定了每bit的时间宽度应该是1秒钟除以波特率,但是在实际电路中相同标号的两个晶振也会有一定的误差。我们可以利用逻辑分析仪(也就是利用FPGA的时钟)去测量一下PC发送UART时的bit时间宽度。
由于波特率为115200,在采样时,一般采用16倍频采样。此时采样频率比较高,由基础的50MHz的时钟不能够做出精确的16倍频,由此也会带来一定的误差。
利用逻辑分析仪就可以看到在上述两个都有误差的情况,真实采样的偏差,以及偏差对我们的设计是否有影响。
设计实现
将_9_uart_drive 复制一份,命名为_10_uart_drive_signal_tap。然后打开此工程,将波特率修改为115200。
点击tools -> signal tap logic analyzer。
在右侧窗口signal configuration中,首先需要指定一个采样时钟信号。
逻辑分析仪在采样时钟的每个上升沿进行数据采样。逻辑分析仪不支持在采样时钟的下降沿进行数据采样。设计中的任何信号都可以用作采样时钟。但是,为了获得最佳的数据采样结果,请使用与被测信号同步的全局时钟。
在本设计中,所有的信号都是由外部的clk信号进行驱动的,所以此采样时钟,选择为clk。点击clock对话框后面的三个点。将filter选择为pin:all,点击list,在matching nodes中选择clk,点击“大于”,在nodes found中出现clk,然后点击ok。
配置完采样时钟信号后,需要配置采样深度。
针对被采样的数据中的每个信号,采样深度指定了采样和存储的样本的数量。在器件存储器资源有限的情况下,由于所选的深度太大,设计可能无法编译。此时需要降低采样深度以减少资源使用。
采样深度乘以采样的间隔就确定了采样的时间宽度。现在我们要做的是采样一个UART的协议帧,一个协议帧共有12个bit。按照115200的波特率,采样的时间宽度应该是104166ns,所以采样深度应该是5208,在此选择采样深度为8K。
当确定好采样深度后,可以指定逻辑分析仪在触发事件之前和之后 采样的数据量。
逻辑分析仪提供三种选择。Pre表示12%的存储深度用作触发事件之前,88%的存储深度用作触发事件之后;Center表示50%的存储深度用作触发事件之前,50%的存储深度用作触发事件之后;Post表示88%的存储深度用作触发事件之前,12%的存储深度用作触发事件之后。
在此选择Pre。
配置好这些信息后,开始添加需要观测的信号。
在setup界面,在空白界面双击,添加想要观测的信号。
需要观测的信号有uart_txd、uart_rxd、cap_cnt。
uart_txd和uart_rxd为端口信号,选择filter时,选择PIN:all即可,cap_cnt为内部信号,选择filter时,选择signal tap :pre-synthesis。
将uart_rxd的下降沿设置为触发条件。
在uart_rxd的trigger conditions的位置,右击,选择falling edge。
点击保存,保存到qprj,命名为stp1.stp。
使能逻辑分析仪。点击Yes。
回到quartus界面,进行综合分析并形成配置文件。
在工程向导的结构界面,可以看到在结构中出现了两个未知的组件。这两个就是逻辑分析仪。
在报告中,可以看到使用的逻辑资源和存储器资源增多。
回到signal tap界面,并且连接PC和开发板。
在hardware中,选择USB – blaster。
点击sof manager后面的三个小点,选择生成的sof文件,然后点击下载。
点击运行分析。
此时逻辑分析仪就在等待被触发。
触发条件为uart_rxd的下降沿,打开串口助手,配置好后,发送一个数据11。
发送之后,逻辑分析仪中出现了波形。因为发送为11,发送数据从低位开始,故而第一个数据应该为1。所以第一端低电平为起始位,可以通过采样的数字标号,确定它的时间宽度。
左键是放大,右键是缩小。
左侧为0,因为利用下降沿作为触发条件。放大左侧数字为434。
所以起始位的时间宽度为434x20ns,即8680ns。按照波特率为115200计算,每一个bit的时间宽度应该是8680.5556ns。这就证明PC发过来的bit的时间宽度和我们所预想的是一致的。
可以用此方法测量其他的bit的宽度,有的bit的宽度要比8680ns要少,有的bit的宽度要比8680ns要多,但是偏差不多。
由于真正的宽度和我们认为的宽度有一定的区别。但是设计是按照每个bit的宽度都是20ns的整数倍,所以在采样时,就会有偏差。通过cap_cnt可以看出来,并且随着采样的越长,误差累计就会越大。
在数据的第一个bit时,cap_cnt等于7,马上要变为8。按照cap_cnt的计数规律是波特率的16倍频设计,所以后面所有的bit起始时,都应该是16 *N + 7,并且马上要变为16 * N + 8。但是真实的时间宽度和预想的时间宽度有一定的偏差。
在最后的校验位的起始时,cap_cnt的数据按照16倍频采样来说,应该是135,然后快变为136才对。但是此时已经等于136,并且马上变137。
我们是按照cap_cnt去进行采样的(在cap_cnt变化的位置采样)。
因为有误差,所以规定UART的协议帧的长度不能够过长。即中间的数据位的个数不能随意增加。
上述分析步骤的数字只是笔者的测验结果,不同的PC和开发板测试时,可能会得到不同的结果。
逻辑分析仪总结
利用逻辑分析仪可以直接查看到开发板内部运行的波形。所以在很多时候,都是利用逻辑分析仪进行板级测试作为最终结果。
如果不需要工程中的逻辑分析仪,可以打开assignments -> settings –> signal tap logic analyzer,将使能的对勾去掉,然后重新编译就可以了。
审核编辑:刘清
评论
查看更多