目录

简介

1 HDL 实例化调试探针流程

2 Hardware Manager 中观察调试信号

3 网表插入调试探针流程


简介

        传统的 FPGA 板级调试是由外接的逻辑分析仪连接到 FPGA 的控制管脚,然后将内部信号引出至引脚IO 上,进行板级调试。这种方法的缺点是首先我们需要一个逻辑分析仪,而逻辑分析仪一般价格都比较昂贵,且对于需要测试几十个引脚的时候,选择使用外接的逻辑分析仪就比较繁琐了。
        在线逻辑分析仪克服了以上所有的缺点,其借用了传统逻辑分析仪的理念以及大部分的功能,并利用 FPGA 中的逻辑资源,将这些功能植入到 FPGA 的设计当中。一般地,在线逻辑分析仪的应用原理框图如下图所示:

在线逻辑分析仪的应用原理框图
        其中,待测设计(Design Under Test,DUT)就是用户逻辑,它和片内的在线逻辑分析仪都位于 FPGA 中。在线逻辑分析仪通过一个或多个探针(Probe)来采集希望观察的信号,然后通过片内的 JTAG 硬核组件,来将捕获到的数据传送给下载器,进而上传到 Vivado IDE 以供用户查看。Vivado IDE 也能够按照上述数据路径,反向地向 FPGA 中的在线逻辑分析仪传送一些控制信息。由此可见,在线逻辑分析仪不需要将待测信号引出至 I/O 上,也不需要电路板走线或者探测点,当然更不需要外部的逻辑分析仪的花费,在Vivado 中就可以将在线逻辑分析仪添加到设计中。但是,在线逻辑分析仪会占用一定数量的内部逻辑资源,如块 RAM、查找表、触发器等等。
        在 Vivado 中,在线逻辑分析仪的功能被称为“集成逻辑分析器(Integrated Logic Analyzer,ILA)”,它以 IP 核的形式来加入到用户设计中。
        Vivado 提供了三种具有不同集成层次的插入 ILA 方法,以满足不同 Vivado 用户群的不同需求:
        第一种方法是直接在 HDL 代码中例化一个 ILA IP 核,也被称为“HDL 实例化调试探针流程”,这是集成层次最高的方法。ILA IP 核可以在 IP Catalog(IP 目录)中找到,并对其进行配置,以符合所需的调试需求。这是最直接的方法,但其灵活性也较差。在调试工作完毕之后,还需要在 HDL 源代码中删除ILA IP 核,然后重新综合并实现,以生成最终的比特流。
        第二种方法是在综合后的网表中,分别标记要进行调试观察的各个信号,然后通过一个简单的“Setup Debug”向导来设置各个探针和 ILA IP 核的工作参数,然后工具会根据用户设置的参数,自动地生成各个ILA IP 核。这个方法也被称为“网表插入调试探针流程”。在此流程中,用户不需要修改 HDL 源代码,并且能够单独控制每个 ILA IP 核以及每个探针,这样就提供了很大的灵活性。用户设置的调试信息会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中,在实现阶段,Vivado 会读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户就可以在综合后的网表中删除 ILA IP 核,或者在 XDC 文件中删除调试命令,然后再对设计进行实现,以生成最终的比特流。
        第三种方法是手动地在 XDC 约束文件中书写对应的 Tcl XDC 调试命令,在实现阶段工具会自动读取这些命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户还需要在 XDC 约束文件中删除这些命令,然后实现最终的设计。这种方法集成层次最低,一般不会使用这种方法

1 HDL 实例化调试探针流程

        “HDL 实例化调试探针流程”需要在 HDL 源代码中实例化 ILA IP 核。

1 IP Catalog按钮

2 IP Catalog窗口

3 搜索 ILA
        双击“ILA (Integrated Logic Analyzer)”

4 Customize IP窗口
        “Component Name”一栏用于设置 ILA IP 核的名称
        IP 核的配置包含两个子页面,分别是“General Options”和“Probe_Ports(0..0)”, “General Options” 页面用于设置 ILA IP 核的总体设置,“Probe_Ports(0..0)”页面用于对每个探针的参数进行设置。
        在“General Options”页面中,“Number of Probes”一栏用于设置所需的探针数量,一般地,一个探针用于连接一个待测信号,例如,我们想要观察“sys_rst_n”、“led”和“cnt”这三个信号,则需要把 “Number of Probes”设置为 3;
        “Sample Data Depth”用于设置采样深度,在每个采样时钟下,ILA 都会将捕获到的探针信号的值送入 RAM 中,由于 RAM 的存储空间是有限的,所以此选项就用于设置 RAM 最大存储多少个探针信号的值,我们保持其默认 1024,其数值越大,消耗的 RAM 资源也越多。其它选项保持默认即可。
        在“Probe_Ports(0..0)”页面中,用于设置每个探针的参数,一般我们只需设置探针宽度“Probe Width[1..4096]”一栏即可,由于“sys_rst_n”、“led”和“cnt”这三个信号的位宽分别是 1 位、2 位和 26 位, 所以我们需要将其分别设置为 1、2 和 26,然后点击“OK”按钮即可,如下图所示:

5 设置探针宽度

6 点击 OK
        接下来就会弹出“Generate Output Products”对话框,我们保持默认设置,直接点击“Generate”即可,此时 Vivado 就开始对该 ILA IP 核进行 OOC 综合了。

7 开始为 ILA IP 核生成输出文件

        在这里,我们简要介绍一下 Vivado 的 OOC(Out-of-Context)综合的概念。对于顶层设计,Vivado 使用自顶向下的全局(Global)综合方式,将顶层之下的所有逻辑模块都进行综合,但是设置为 OOC 方式的模块除外,它们独立于顶层设计而单独综合。通常,在整个设计周期中,顶层设计会被多次修改并综合。但有些子模块在创建完毕之后不会因为顶层设计的修改而被修改,如 IP,它们被设置为 OOC 综合方式。 OOC 模块只会在综合顶层之前被综合一次,这样在顶层的设计迭代过程中,OOC 模块就不必跟随顶层模块,而一次次的产生相同结果的多余综合了。所以OOC 流程减少了设计的周期,并消除了设计迭代,使您可以保存和重用综合结果。
        Out-of-Context(OOC) 综合是一种自底向上的设计流程,默认情况下,Vivado 设计套件使用 OOC 的设计流程来综合 OOC 模块。OOC 模块可以是来自 IP Catalog 的 IP、来自 Vivado IP Integrator 的 block design或者顶层模块下手动设置为 OOC 方式的任何子模块。
        来自 IP Catalog 的 IP 就默认使用 OOC 的综合方式,例如上图中的“Synthesis Options”选项就设置为了“Out of Context Per IP”。这些 IP 会在顶层的全局综合之前,单独地进行 OOC 综合并生成输出产品(Generate Output Products),包括综合后的网表等各种文件。在对顶层进行综合时,OOC 模块会被视为黑盒子,并且不会参与到顶层的综合中来。在综合之后的实现过程中,OOC 模块的黑盒子才会被打开,这时其网表才是可见的,并参与到全局设计的实现过程中来。

8 OOC 综合完毕

这时可以在“Source”窗口中看到已经出现了 ILA IP 核,如下图所示:

添加的 ILA IP 核

由于我们还没有把它例化到顶层的 HDL 代码中,所以在层次结构上它与顶层并排。下面我们将其例化到顶层的 HDL 代码中。在“Source”窗口中的“IP Sources”选项卡中双击 ILA IP 核的例化模板文本文件,找到例化模板的内容,如下图所示:

例化模板
        将图中的红色方框中的模板代码复制并粘贴到 led_twinkle.v 顶层 HDL 代码中,并将 ILA 的时钟和探针信号连接到顶层设计中,例化 ILA IP 核的代码如下:
ila_0 u_ila_0 (
        .clk(sys_clk),                 // input wire clk
        .probe0(sys_rst_n),      // input wire [0:0] probe0
        .probe1(led),                 // input wire [1:0] probe1
        .probe2(cnt)                  // input wire [25:0] probe2
);

我们将 ILA 的时钟连接到了顶层时钟 sys_clk 信号上,probe0 探针连接到了 sys_rst_n,probe1 探针连接到了 led,probe2 探针连接到了 cnt。代码修改完成后如下图所示:

9 例化 ILA IP 核
        保存源文件之后就可以直接综合并实现设计,最后生成比特流。
        至此,我们就成功地使用“HDL 实例化调试探针流程”将 ILA IP 核添加到了设计中。接下来就可以将比特流下载到 FPGA 中,并对信号进行在线观察。

2 Hardware Manager 中观察调试信号

生成比特流之后,我们打开 Hardware Manager,连接到开发板,并下载比特流,如下图所示:

10 下载比特流
在弹出的窗口中,Vivado 会自动识别比特流文件和具有调试探针信息的.ltx 文件,如下图所示:

11 下载比特流和调试文件
        .ltx 文件存储了调试探针的信息,用来传递给 Vivado IDE,它是从我们的设计中被提取出来的。通常,调试探测文件是在实现过程中自动创建的,并位于和比特流文件相同的目录下。若实现后的设计中包含了 ILA IP 核,则在下载比特流时,Vivado 会自动识别出.ltx 文件。这里我们不必太多地关注此文件,只要按照 Vivado 自动的设定来下载设计即可。
        直接点击“Program”,此时 Vivado 会自动打开 ILA 的调试窗口,如下图所示: 

ILA 的调试窗口

如果 Waveform 窗口中显示的信号不全,可以点击“Waveform – hw_ila_1”窗口中的加号,来将所有的探针信号添加到波形窗口中(如果默认已经显示所有待观察的信号,不用重复添加),如下图所示:

向波形窗口中添加探针信号

点击运行触发的图标

采集到的信号

采集到信号后,可以点击上图中的放大和缩小的图标,来对波形数据进行放大和缩小。

波形默认以十六进制显示的,可以右击 cnt 计数器,选择“Radix”→“Unsigned Decimal”,即可切换到无符号的十进制显示,如下图所示:

更改成无符号十进制显示

下面开始触发条件的设置,在这里简要介绍一个触发的概念。前面我们介绍过,ILA 会将所采集到的探针数据存放在 RAM 中,然后通过 JTAG 和下载器上传到 Vivado。那么触发就是决定 ILA 会在什么时候将 RAM 中的探针值数据上传到 Vivado,当 ILA 检测到触发条件得到满足时,就会把 RAM 中的探针值数据上载到 Vivado,然后 Vivado 将探针数据的波形显示出来。

        我们在“Trigger Setup”窗口中添加触发条件,点击“+”号,将 cnt 信号添加进来,如下图所示:

添加 counter 信号到“Trigger Setup 窗口中来
        之前我们在 HDL 代码中设置为了 cnt 计数器每计数到 25'd25_000_000 和 25'd50_000_000 时就改变两个 led 的状态,为了方便 led 翻转状态的查看,我们可以将触发条件设置为“cnt 等于十进制数 25_000_000”,即,当 ILA 检测到 cnt 计数器的值等于 25'd25_000_000 时,就会将 RAM 中的数据上传到 Vivado,如下图所示:

设置触发条件

然后我们就可以开始进行触发动作了。在波形窗口中有 4 个触发动作,如下图所示:

触发动作
        从左至右依次是:(1)自动触发开关、(2)开始触发、(3)立即触发、(4)停止触发。下面对他们分别进行介绍:
        (1)自动触发开关,它和“开始触发”按钮联合在一起使用。若打开了此选项,则在 ILA 开始运行触发(即点击了“开始触发”按钮)后,会不断地对触发条件进行检测,每次触发条件被满足时(即 cnt 计数到了 25_000_000),都会将 RAM 中存储的所有的探针值数据上传到 Vivado,Vivado 上显示的波形也会随之不断更新,直到用户点击了“停止触发”按钮。若没有点击此选项,则在 ILA 开始运行触发(即点 击了“开始触发”按钮)后,在检测到触发条件得到满足并完成了上传数据之后,就会停止触发,等待用户下一步的指令。
        (2)开始触发,它和“自动触发开关”按钮联合在一起使用。点击之后 ILA 就会开始进行触发操作。
        (3)立即触发,立即将当前 ILA RAM 中的数据上传到 Vivado,而不管触发条件是否得到满足。
        (4)停止触发,停止当前正在进行的触发活动。
        这里直接点击“开始触发”按钮,而不打开“自动触发”开关。然后由于 cnt 计数器每隔 500ms
就会计数到 25_000_000,所以我们几乎马上就可以看到波形窗口中出现了波形,如下图所示:

更新的波形

将波形放大之后就可以看到 counter 的具体值,如下图所示:

将波形放大

此时就可以看到,在当 cnt 计数到 25_000_000 时,led 的状态就会发生跳变。读者也可以尝试再次点击“开始触发”按钮或打开“自动触发”按钮,来观察波形。

如果调试工作完毕之后,可以在 led_twinkle.v 源代码中删除对 ILA IP 核的例化,或者通过添加“/*” 和“*/”注释掉这段代码。然后重新综合并实现,以生成最终的比特流。

3 网表插入调试探针流程

网表插入调试探针流程需要在综合后的网表中,将要进行调试观察的各个信号标记“mark_debug”属性,然后通过“Setup Debug”向导来设置 ILA IP 核的参数,最后工具会根据参数来自动创建 ILA IP 核。

可以在综合之后的网表中手动选择网络并点击“mark_debug”按钮;也可以在综合之前在 HDL 代码中为想要观察的 reg 或 wire 信号添加“Mark Debug”综合属性,例如:

(* mark_debug = “true” *)reg [25:0] cnt ;

        其中“(* mark_debug = “true” *)”必须紧挨在变量声明的前面。这样,在综合完成之后并打开综合后的设计时,cnt 信号就自动被标记了“Mark Debug”属性。此外,被添加了(* mark_debug = “true” *)属性的reg 或 wire 信号不会被工具优化掉。
这里我们选择第二个方法,即在 HDL 代码中添加(* mark_debug = “true” *)综合属性,如下图所示:

1 在 HDL 代码中添加“Mark Debug”综合属性
        添加“Make Debug”属性之后,点击“Run Synthesis”进行综合,综合完之后我们点击“Flow Navigator”窗口中的“Open Synthesized Design”按钮,如下图所示:

2 点击“Open Synthesized Design”按钮
        在综合后设计的窗口布局选择器中,我们选择“Debug”窗口布局,如下图所示:

切换到“Debug”窗口布局

此时,Vivado 打开了“Netlist”子窗口、“Schematic”子窗口以及“Debug”子窗口。其中, “Netlist”子窗口和“Schematic”子窗口都可以用于标记要进行观察的信号,“Debug”子窗口用于显示并设置 ILA IP 核的各个参数。如下图所示:

“Debug”窗口布局

在“Debug”子窗口中,又包含两个选项卡“Debug Cores”和“Debug Nets”。这两个选项卡都用于显示所有的已标记为“Mark_Debug”的信号。

不同之处在于,“Debug Cores”选项卡是一个更加以 ILA IP 核为中心的视图,所有已标记为“Mark_Debug”的信号并且已经被分配到 ILA 探针的信号都会被显示在各个 ILA IP 核的视图树下,已标记为“Mark_Debug”的信号但是还没有被分配到 ILA 探针的信号被显示在“Unassigned Debug Nets”下,当然也可以在其中查看和设置 ILA IP 核的各种属性和参数。

“Debug Nets”选项卡仅显示已标记为“Mark_Debug”的信号,但不显示 ILA IP 核,所有已标记为 “Mark_Debug”的信号并且已经被分配到 ILA 探针的信号都会被显示在“Assigned Debug Nets”下,已标记为“Mark_Debug”的信号但是还没有被分配到 ILA 探针的信号被显示在“Unassigned Debug Nets”下。

(1)在综合后的网表中手动为信号添加 mark_debug 属性

如果未在 HDL 代码中书写(* mark_debug = “true” *)综合属性,则需要首先标记要进行观察的信号。在综合后的网表中,信号的名称可能会发生一定的变化,以 led 信号为例,在“Netlist”子窗口中的“Nets” 目录下,找到“led_OBUF[0]”网络,右击该网络(此时右边的“Schematic”子窗口也会自动地高亮选择此网络,因为“Netlist”子窗口中的对象和“Schematic”子窗口中的对象,两者之间是交叉选择的),在弹出的菜单中心选择“Mark Debug”命令,如下图所示:

在“Netlist”子窗口中点击“Mark debug”命令
        也可以在“Schematic”子窗口中选择网络,然后右键选择“Mark Debug”命令,如下图所示:

在“Schematic”子窗口中点击“Mark debug”命令

此时在“Debug”子窗口的“Debug Nets”选项卡的“Unassigned Debug Nets”目录下就会出现我们刚刚标记的“led_OBUF[0]”网络。,如下图所示:

“Unassigned Debug Nets”目录下的“led_OBUF[0]”网络
(2)HDL 代码中已经具有 mark_debug 属性的信号

在 HDL 代码中已经添加了“Mark Debug”综合属性的信号会被自动出现在“Debug Nets”选项卡的 “Unassigned Debug Nets”目录下,如下图所示:

Unassigned Debug Nets 信号
        为网络标记了“Mark Debug”之后,我们就可以进行 ILA IP 核的配置了。点击“Debug”子窗口中的 “Setup Debug”按钮,如下图所示:

“Setup Debug”按钮
        弹出“Setup Debug”向导,我们直接点击“Next”按钮,如下图所示:

“Setup Debug”向导

接下来的页面是选择用于采样待测信号的时钟域,Vivado 会自动识别出各个待测信号所属的时钟域并将其自动设定为其采样时钟,本次添加的三个信号属于系统时钟(sys_clk)的时钟域,Vivado 也已经自动将“sys_clk_IBUF”时钟设置为了这两个信号的采样时钟,如下图所示:

        当然,用户也可以手动指定各个用于采样待测信号的时钟域,右击待测信号,选择“Select Clock Domain”,弹出“Select Clock Domain”窗口:

手动指定待测信号的时钟域 1

手动指定待测信号的时钟域 2
        在“Select Clock Domain”窗口中就可以选择用于采样待测信号的时钟了。“Setup Debug”向导会为每个采样时钟生成一个单独的 ILA IP 核,由于本例程中只有一个时钟,所以这里最后只会生成一个 ILA IP 核。

设置完采样时钟后,我们点击 next,接下来的页面用于设置 ILA IP 核的全局设置,如下图所示:

ILA IP 核的全局设置
        其中“Sample of data depth”用于设置采样深度,“Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于 2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。
        我们点击 next,就进入了最后的概览页面,确认无误后直接点击“Finish”按钮即可,如下图所示:

完成“Setup Debug”向导
        在“Debug”子窗口中的“Debug Cores”选项卡中,可以看到 Vivado 已经添加了 ILA IP 核,并且 “Unassigned Debug Nets”目录下已经没有未被分配的信号了,如下图所示:

添加了 ILA IP 核的“Debug”子窗口

网表中被标记为 Mark Debug 的信号也变为了虚线,以表示其完成了ILA IP 核的分配,如下图所示:

网表中完成 Setup Debug 的信号
        前面我们提到过,在“网表插入调试探针流程”中,用户设置的调试信息最终会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中。在实现阶段,Vivado 会从 XDC 约束文件中读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。此时,我们所做出的所有的更改和设置,都还只是停留在电脑内存中,我们需要将其保存在硬盘的 XDC 约束文件中,以供 Vivado 在实现阶段读取。点击工具栏中的保存按钮,如下图所示:

保存按钮

在出现的消息框中直接点击 OK,如下图所示:

点击 OK
        如果弹出“Save Constraints”对话框,询问用户将约束保存在哪个 XDC 约束文件中,本例的工程中只有一个 XDC 约束文件,选择“Select an existing file”,位于 led_twinkle.xdc 文件下,然后点击“OK”按钮即可(有时候也有可能没有弹出这个对话框)。

此时,我们打开 my_test.xdc 文件,就会看到在用户约束的下面,Vivado 自动写入了用于 debug 的约束命令,如下图所示:

Vivado 自动写入的用于 debug 的约束
        在实现阶段,Vivado 会读取这些约束,并按照这些命令的参数来自动地加入 ILA IP 核。
        至此,我们就成功地使用“网表插入调试探针流程”将 ILA IP 核添加到了设计中。接下来就可以实现设计并生成比特流,最后将比特流下载到 FPGA 中,以对信号进行在线观察。

        对信号在线观察的方法请参考“ Hardware Manager 中观察调试信号”一节,操作方法和“HDL实例化调试探针”的观察波形信号一样,没有任何区别。
        如果调试工作完毕之后,可以删除 led_twinkle.v 源代码信号中的“Make Debug”属性和删除 XDC 文件中的包含调试信息的 Tcl 文件,然后重新综合并实现,以生成最终的比特流。

在线逻辑分析仪的使用相关推荐

  1. Vivado入门使用指南之----按键消抖(仿真与在线逻辑分析仪仿真-不使用ip)

    本博文参考米联客提供的教程,不太适合一点基础都没有的小白,不会讲解代码思路,只是编译工具的使用 1,概述 本实验对前文没有进行的仿真进行测试以及在线逻辑分析使用的尝试(不使用IP).本文通过(*mar ...

  2. 高云软件的在线逻辑分析仪使用教程

    高云软件的在线逻辑分析仪使用教程 最近Altera和Xilinx的芯片涨价太严重,经过寻找国内替代型号,发现广东高云半导体的FPGA基本可以满足项目需求(非广告,实际项目使用):所以就切换使用高云的G ...

  3. ChipScope在线逻辑分析仪的使用方法

    一.抓取信号 1.mark_dubug方式 1.将(*mark_debug = "true"*) 添加到需要观察的信号前面.         (*mark_debug = &quo ...

  4. Vivado使用指南之:二、如何使用VIVADO 在线逻辑分析仪

    一.在想要抓取的信号之前添加(* mark_debug = "true" *).保存.编译.如: 二.编译完成之后点击set up debug. 点击下一步..... 直至出现如下 ...

  5. 使用在线路线逻辑分析仪ILA调试模块的小技巧

    在CSDN这个BLOG中我详细给出了如何在VIVADO中插入在线逻辑分析仪进行信号获取.这里再记录一下自己用的一个小技巧: 实例化一个统一的多款口大位宽的ILA,在多处使用. 我们在一个模块内插入IL ...

  6. [渝粤教育] 西南科技大学 现代数字系统设计 在线考试复习资料2021版

    现代数字系统设计--在线考试复习资料2021版 一.单选题 1. SOPC的中文意思是(    ). A.电子设计自动化 B.硬件描述语言 C.片上可编程系统 D.片上系统 答案:看左边查询 2.XP ...

  7. [渝粤教育] 西南科技大学 现代数字系统设计 在线考试复习资料2021版(1)

    现代数字系统设计--在线考试复习资料2021版 一.单选题 1. SOPC的中文意思是(    ). A.电子设计自动化 B.硬件描述语言 C.片上可编程系统 D.片上系统 答案:看左边查询 2.XP ...

  8. FPGA设计开发软件ISE使用技巧之:片上逻辑分析仪(ChipScope Pro)使用技巧

    URL: http://www.icbuy.com/info/news_show/info_id/182769.html 6.7  片上逻辑分析仪(ChipScope Pro)使用技巧 在FPGA的调 ...

  9. Vivado逻辑分析仪使用教程

    Vivado 逻辑分析仪使用教程 作者:李西锐  校对:陆辉 传统的逻辑分析仪在使用时,我们需要将所要观察的信号连接到FPGA的IO管脚上,然后观察信号.当信号比较多时,我们操作起来会比较繁琐.在线逻 ...

  10. vivado ILA在线逻辑仪使用

    目录: 1.在线逻辑分析仪简介 2.HDL 实例化调试探针流程(实验-闪烁灯) 3.Hardware Manager中观察调试信号 4.网表插入调试探针流程(实验-闪烁灯) 1.在线逻辑分析仪简介 在 ...

最新文章

  1. ***小程序wx.getUserInfo不能弹出授权窗口后的解决方案
  2. python常用命令汇总-Python爬虫框架Scrapy常用命令总结
  3. java 导出excel二维表,如何轻松将EXCEL二维统计表转为数据清单?
  4. sklearn自学指南(part61)--调整估计器的超参数
  5. js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现
  6. 三、安装cmake,安装resin ,tars服务,mysql 安装介绍,安装jdk,安装maven,c++ 开发环境安装...
  7. 尘埃落定!熊猫互娱近20亿元投资纠纷已解决
  8. 21 个必须知道的机器学习开源工具!
  9. 关于python最大递归深度 - 998
  10. Redis与Django中配置使用Redis
  11. uva1673(后缀自动机)
  12. 【问题解决】Ubuntu无法进入图形页面,全屏出现OK,而且屏幕不停闪烁
  13. IT行业的6大热门岗位,薪酬都有多高?
  14. 【无人机摄影测量技术必备知识】地面像控点布设经验整理-大比例尺
  15. (Python)sum函数的用法
  16. Mysql数据恢复---闪回恢复
  17. 3、用手机模拟器上的Autojs连接电脑vscode
  18. spring cloud contract的应用实现与概念理解-服务提供者一侧的落地
  19. 为什么特征数据要做对数变换?
  20. ~《概率论》~概率的性质条件概率与事件的独立性

热门文章

  1. oppo小布机器人_OPPO小布助手建立GUI+VUI协作机制,创新快应用融合能力
  2. N个字符或数字的全排列
  3. MacOS Catalina 10.15.1 (19B88) — 苹果操作系统
  4. 计算机二级WPS Office考试大纲2021年
  5. Nginx定义域名访问方式
  6. HR最不认同的5大跳槽理由排行榜
  7. 美国市场数据分析初创公司Simon Data获2000万美元融资
  8. 再见2018,你好2019!
  9. protobuf 中 repeated fields 细节
  10. linux中reboot函数在哪,reboot()函数 Unix/Linux