FPGA如何进行片上调试?

简介: FPGA如何进行片上调试?

0.FPGA也能片上调试吗?


FPGA与STM32等嵌入式开发最大的一个优点就是,可以在时序仿真阶段验证超过90%的功能,发现90%的问题。当所有的仿真没问题了,才能进行最后一步:板级调试。如果仿真都不对,那就没必要下载到芯片里了。


STM32等单片机,使用J-Link或ST-Link等调试器,可以进行在线调试,由于C代码是顺序执行的,我们可以插入断点,让程序停在我们需要的位置,或者是实时查看一些变量的数值,大大提高了我们Debug的速度,提高产品的开发效率。

640.jpg


对于FPGA来说,仿真毕竟是仿真,可以理解为理想条件,而最终我们的代码是需要运行在实际的FPGA芯片硬件上的。


所以也会遇到仿真正常,实际下载到板子里不正常的情况。这种现象有两种原因:1.程序有BUG,2.硬件有问题。比如实际程序中复位信号是低电平复位,而实际电路中设计的复位按键按下才是高电平,这样按键未按下就会导致程序一直处于复位状态。


当然,这只是一种最简单的问题点,实际开发过程中,仿真与实际运行不匹配的情况还有很多。那么如何才能以最快的速度找到问题点呢?


早期的FPGA调试方法通常使用逻辑分析仪,连接到FPGA芯片的外部管脚上,如果想查看内部信号,还需要把这些信号定义成Output引出到外部管脚进行了测量,如果是多位数据,这样就会占用大量的管脚,但是此类工具有个优点就是支持多种协议解析,可以非常方便的查看协议的报文数据。

640.jpg

DSLogic IIC解析


如果有一种工具能像单片机开发那样,通过调试器JTAG接口实时获取运行过程中寄存器的数值就好了。有需求就有市场,FPGA厂商也考虑到了开发者的这种需求,都在自家产品上加上了这个功能,那就是片上逻辑分析仪,就像在芯片内装了一个逻辑分析仪ELA(Embedded Logic Analyzer),可以实时监测数据的变化,还可以设置触发条件等!


FPGA领域几大厂家提供嵌入式逻辑分析仪:

  • Intel(原Altera)的SignalTap工具
  • AMD(原Xilinx)的ChipScope工具
  • Microchip(原Microsemi)的Identify工具
  • Lattice的Reveal工具


这些工具都是嵌入式逻辑分析仪,大大提高了Debug速度。这类工具的原理通常是以预先设定的时钟速率实时采样FPGA的内部信号,并暂存于FPGA的内部RAM中,当满足预设的触发条件后,通过JTAG将存储在片内RAM中的数据传输至PC上,PC接收到数据后,通过上位机把数据展现出来。


以下是使用ChipScope工具抓取的铁电存储器FM25V05的SPI写时序:

640.jpg

FM25V05写时序


从FPGA学习流程来看,当了解了流水灯、按键、UART等基本例程后,再学习I2C,SPI之前,就需要掌握片上逻辑分析仪的使用,非常有利于代码的调试。

640.jpg

ChipScopePro


我个人使用过Xilinx和Microsemi的工具,还是挺好用的。


Microsemi的identify使用方法可以到CSDN文章查看:


https://blog.csdn.net/whik1194/article/details/107074187


本文主要介绍Xilinx ISE开发环境下ChipScope工具的使用。


1.Xilinx ChipScope简介

Xilinx的FPGA片内逻辑分析仪被称为ChipScope,通过插入IP核的方式实现,主要包括3大IP核。


  • ICON

ICON(integrated controller),主要负责与JTAG口的通讯,最大支持连接15个Core,这里的Core可以是ILA或VIO。


  • ILA

ILA(integrated logic analyzer),嵌入式逻辑分析仪,可以抓取内部的任何信号,通过设置触发条件的方式,抓取一段时间的波形,时间长度取决于FPGA RAM资源大小。


  • VIO

VIO(virtual input/output),即输入输出,可以实时监控FPGA内部信号,并提供驱动信号给FPGA模块,类似于单片机调试中的变量值查看。


  • ATC2

ATC2(Agilent trace core),是属于特殊定制的调试IP核,需要配合新一代的Agilent逻辑分析仪一起使用,这个很少使用。


下面这张图是来自Xilinx官方文档:chipscope_pro_sw_cores_ug029.pdf的一张图片,关于ChipScope官方的使用指南可以查看这篇文档,介绍了ChipScope工具的整体框图。

640.jpg

ChipScope系统框图


既然是逻辑分析仪,就要涉及到逻辑分析仪最重要的两个参数:采样频率和采样深度,ILA的采样频率取决于输入时钟信号的频率,采样深度取决于FPGA的RAM大小。


2.示例工程创建

下面以Xilinx Spartan-6 XC6SLX9为例,演示ChipScope的使用,ILA抓取cnt实时数据。VIO实现在上位机控制LED亮灭,或选择闪烁频率。led1通过VIO来选择4档闪烁频率,led2通过VIO给的触发信号上升沿进行翻转,led3与VIO输出高低保持一致。


首先创建一个基于XC6SLX9的ISE基本工程,并新建源文件。


以下代码还未添加ChipScope:

module top(
    //Inputs
    input clk,          //50MHz
    input rst_n,
    //Outputs
    output reg led1,        //通过VIO来选择4种闪烁频率
    output reg led2,        //通过VIO来控制
    output led3         //通过VIO来控制
);
wire [1:0] level;       //来自VIO
wire trig;              //来自VIO, 按键产生高脉冲信号
wire trig_rise = (trig_reg == 2'b01);
reg [1:0] trig_reg;
reg [26:0] cnt;         //在ILA中查看数据变化
always @ (posedge clk) begin
    if(!rst_n)
        trig_reg <= 'h0;
    else 
        trig_reg <= {trig_reg[0], trig};
end
always @ (posedge clk) begin
    if(!rst_n) 
        cnt <= 'd0;
    else 
        cnt <= cnt + 1;
end
always @ (posedge clk) begin
    if(!rst_n)
        led1 <= 'd0;
    else begin
        //level来自VIO
        case (level)
            0:  led1 <= cnt[26];
            1:  led1 <= cnt[25];
            2:  led1 <= cnt[24];
            3:  led1 <= cnt[23];
        endcase
    end
end
always @ (posedge clk) begin
    if(!rst_n)
        led2 <= 0;
    else if(trig_rise)      //trig上升沿翻转
        led2 <= !led2;
end
endmodule


3.添加ChipScope ICON IP核

添加一个IP核源文件,保存在chipscope文件夹下。

640.jpg

添加ICON


选择ICON IP核,以下添加VIO和ILA核是一样的操作。

640.jpg

选择ICON


添加之后进入配置界面,因为我们连接了ILA和VIO两个IP核,这里控制端口需要两个:

640.jpg

配置端口


查看例化模板:

icon YourInstanceName (
    .CONTROL0(CONTROL0), // INOUT BUS [35:0]
    .CONTROL1(CONTROL1) // INOUT BUS [35:0]
);


4.添加ChipScope ILA IP核

640.jpg

添加ILA


选择采样深度,数值越大,占用FPGA RAM资源越多,采样时间越长。

640.jpg

设置采样深度


选择采集通道,这里选择32个通道。

640.jpg

选择触发通道


等待生成完成,查看例化模板:

ila YourInstanceName (
    .CONTROL(CONTROL), // INOUT BUS [35:0]
    .CLK(CLK), // IN
    .TRIG0(TRIG0) // IN BUS [31:0]
);


5.添加ChipScope VIO IP核

同样的方式添加VIO核:

640.jpg

添加VIO


选择32路输入,用于监测cnt的值,4路输出,用于控制LED。

640.jpg

配置输入输出通道


设置为异步输入32位,输出4位。


6.将ChipScope的3个IP核添加到顶层模块

module top(
    //Inputs
    input clk,          //50MHz
    input rst_n,
    //Outputs
    output reg led1,        //通过VIO来选择4种闪烁频率
    output reg led2,        //通过VIO来控制
    output led3         //通过VIO来控制
);
wire [1:0] level;       //来自VIO
wire trig;              //来自VIO, 按键产生高脉冲信号
wire trig_rise = (trig_reg == 2'b01);
reg [1:0] trig_reg;
reg [26:0] cnt;         //在ILA中查看数据变化
always @ (posedge clk) begin
    if(!rst_n)
        trig_reg <= 'h0;
    else 
        trig_reg <= {trig_reg[0], trig};
end
always @ (posedge clk) begin
    if(!rst_n) 
        cnt <= 'd0;
    else 
        cnt <= cnt + 1;
end
always @ (posedge clk) begin
    if(!rst_n)
        led1 <= 'd0;
    else begin
        //level来自VIO
        case (level)
            0:  led1 <= cnt[26];
            1:  led1 <= cnt[25];
            2:  led1 <= cnt[24];
            3:  led1 <= cnt[23];
        endcase
    end
end
always @ (posedge clk) begin
    if(!rst_n)
        led2 <= 0;
    else if(trig_rise)      //trig上升沿翻转
        led2 <= !led2;
end
/* Xilinx ChipScope Config */
wire [35:0] CONTROL0;
wire [35:0] CONTROL1;
wire [31:0] TRIG0;
wire [31:0] ASYNC_IN;
wire [3:0] ASYNC_OUT;
assign ASYNC_IN[26:0] = cnt[26:0];
assign level = ASYNC_OUT[1:0];
assign trig  = ASYNC_OUT[2];
assign led3  = ASYNC_OUT[3];
assign TRIG0[26:0] = cnt[26:0];
assign TRIG0[28:27] = level[1:0];
assign TRIG0[29] = led1;
assign TRIG0[30] = led2;
assign TRIG0[31] = led3;
icon icon_ut0(
    .CONTROL0(CONTROL0[35:0]),
    .CONTROL1(CONTROL1[35:0])
);
ila ila_ut0(
    .CONTROL(CONTROL0[35:0]), 
    .CLK(clk), 
    .TRIG0(TRIG0[31:0])
);
vio vio_ut0(
    .CONTROL(CONTROL1[35:0]),
    .ASYNC_IN(ASYNC_IN[31:0]),
    .ASYNC_OUT(ASYNC_OUT[3:0])
);
endmodule


7.编译下载

管脚分配,编译通过,生成bit文件,打开ChipScope,下载bit文件。

640.jpg

ChipScope

下载Bit文件

640.jpg

选择bit文件


对信号进行重新命名,设置触发信号,或者控制VIO输出状态。

640.jpg

设置触发方式


trig设置成PushButton类型,并设置为高脉冲。


led3设置成ToggleButton类型,即按一下状态翻转一次。

640.jpg

VIO配置


8.总结

单片机在线调试可以设置断点,让程序停下,FPGA只要时钟信号存在,就会一直运行下去,所以无法人为的设置断点,中止代码的运行。


任何事物都不可能达到十全十美,使用管脚外接的逻辑分析仪不会占用任何的逻辑资源,可以通过逻辑分析仪解析协议的报文,缺点是不能查看内部信号;使用片内逻辑分析仪的优点是可以实时查看内部信号,设置触发条件,缺点是会占用FPGA的逻辑资源,比如RAM等。


Xilinx新一代的集成开发工具Vivado最低支持Spartan-7系列的FPGA芯片,由于手头只有Spartan-6系列的开发板,所以无法演示在Vivado环境下的ChipScope使用,基本上都大同小异,使用方法类似,毕竟是同一家的调试工具。

目录
相关文章
|
芯片 异构计算
FPGA-基于chipscope的超声波测距调试
FPGA-基于chipscope的超声波测距调试
241 0
FPGA-基于chipscope的超声波测距调试
|
存储 内存技术
FPGA-RAM核的使用及调试
FPGA-RAM核的使用及调试
295 0
|
异构计算
【黑金原创教程】 FPGA那些事儿 SignalTap II 调试技巧
简介工具篇系列的第三本教程,讲述各种与SignalTap II 有关的调试技巧。目录[黑金原创教程] FPGA那些事儿《工具篇III》:File01 - 上线调试与下线调试[黑金原创教程] FPGA那些事儿《工具篇III》:File02 - SignalTap 扫盲[黑金原创教程] F...
1816 0
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
123 74
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
159 69
|
2月前
|
移动开发 算法 数据安全/隐私保护
基于FPGA的QPSK调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的QPSK调制解调系统,通过Vivado 2019.2进行仿真,展示了在不同信噪比(SNR=1dB, 5dB, 10dB)下的仿真效果。与普通QPSK系统相比,该系统的软解调技术显著降低了误码率。文章还详细阐述了QPSK调制的基本原理、信号采样、判决、解调及软解调的实现过程,并提供了Verilog核心程序代码。
82 26
|
1月前
|
存储 编解码 算法
基于FPGA的直接数字频率合成器verilog实现,包含testbench
本项目基于Vivado 2019.2实现DDS算法,提供完整无水印运行效果预览。DDS(直接数字频率合成器)通过数字信号处理技术生成特定频率和相位的正弦波,核心组件包括相位累加器、正弦查找表和DAC。相位累加器在每个时钟周期累加频率控制字,正弦查找表根据相位值输出幅度,DAC将数字信号转换为模拟电压。项目代码包含详细中文注释及操作视频。
|
3月前
|
算法 异构计算
基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4-ASK调制解调系统的算法仿真效果、理论基础及Verilog核心程序。仿真在Vivado2019.2环境下进行,分别测试了SNR为20dB、15dB、10dB时的性能。理论部分概述了4-ASK的工作原理,包括调制、解调过程及其数学模型。Verilog代码实现了4-ASK调制器、加性高斯白噪声(AWGN)信道模拟、解调器及误码率计算模块。
88 8
|
3月前
|
算法 物联网 异构计算
基于FPGA的4FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4FSK调制解调系统的Verilog实现,包括高斯信道模块和误码率统计模块,支持不同SNR设置。系统在Vivado 2019.2上开发,展示了在不同SNR条件下的仿真结果。4FSK调制通过将输入数据转换为四个不同频率的信号来提高频带利用率和抗干扰能力,适用于无线通信和数据传输领域。文中还提供了核心Verilog代码,详细描述了调制、加噪声、解调及误码率计算的过程。
108 11
|
3月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
76 1

热门文章

最新文章