当前位置: 首页 > news >正文

跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验

硬件平台:征战Pro开发板
软件平台:Vivado2018.3
仿真软件:Modelsim10.6d
文本编译器:Notepad++

征战Pro开发板资料
链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwd=x3u8
提取码:x3u8

1 知识背景

LED,又名发光二极管。 LED 灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点, LED 灯被广泛用在仪器仪表中作指示灯、 液晶屏背光源等诸多领域。
不同材料的发光二极管可以发出红、 橙、 黄、 绿、 青、蓝、 紫、白这八种颜色的光。 图 6-1-1 左边是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的一端是阴极。 图 6-1-1 右边是开发板上用的贴片二极管实物图。 贴片二极管的正面一般都有颜色标记,有标记的那端就是阴极。
在这里插入图片描述
图6-1- 1发光二极管实物图
发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过 5mA 左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在 3~20mA 之间,否则电流过大就会烧坏二极管。

2 实验任务

本节实验任务是征战 Pro 开发版上的 LED3以固定的频率闪烁。

3 硬件设计

扩展知识点:
位号就是元器件的“身份证”,我们可以通过 PCB 板上的丝印找到对应的器件。
网络名是一种连线,相同的网络名就表示连接在一起。当原理图比较简单的时候我们可以通过画线将管脚与管脚连接起来,那如果我们的原理图非常复杂时,用画线这种方式就不现实了,满屏的连线根本无法保证设计的准确性,所以用网络名来表示就非常方便了,这个知识大家在学习原理图和 PCB 设计时会涉及到,此处我们一笔带过。

3.1 原理图分析

板载了 8 个用户 LED 灯,LED 灯的正极接的 FPGA 管脚,负极接地。当 FPGA 管脚输出高电平时,发光二极管的正负极有电压差,便会产生电流流过发光二极管,从而点亮 LED 灯;当 FPGA 管脚输出低电平时,发光二极管正负极没有电压差,也不会产生电流,LED 灯熄灭。我们选用位号为 LED3 的 LED 来做为本实验的外设 LED 灯。通过图 6-1-2,图 6-1-3 我们可以看到灯 LED3 的管脚与 FPGA 的管脚 M22 连接在一起。
复位按键我们用开发板上的 SW1,通过图 6-1-4 可知,当按键按下时, SW1 的管脚 1 和管脚 2 导通,信号KEY0就为低电平;当松开按键时,KEY0 被上拉到 VCCIO (VCCIO 默认等于3.3V),即为高电平。至于 KEY0 与 FPGA 哪个管脚连接在一起,读者可以尝试自已在原理图上去找,会看原理图是 FPGA 工程师最基本的技能噢!
在这里插入图片描述
图6-1- 2 LED灯原理图
在这里插入图片描述
图6-1- 3 FPGA管脚图
在这里插入图片描述
图6-1- 4 按键原理图

3.2 管脚映射表

本实验中,系统时钟、按键复位以及 LED 端口的管脚分配如下表所示:
表6-1- 1管脚映射表
在这里插入图片描述

同学们可能会好奇,为什么原理图中的网络名不和程序中的信号名一致呢?这是因为一般有两个原因:
1. 在公司里面,设计硬件的工程师和设计软件的工程师并不是同一个人,每个人的命名习惯不同,所以就会命名不一样的情况,
2. 硬件上的器件功能和软件上的功能并不一样。比如我们的按键 SW1,在硬件上它就是一个按键,但是在软件设计中,我们可以认为它是复位管脚,也可以认为它是控制管脚,所以原理图中的网络名和程序中的信号名没办法统一。
这种情况是很常见的,只要同学们掌握了原理,这个命名随便怎么变我们都知道如何去约束 FPGA 管脚。

3.3 编写XDC 约束文件

在这里插入图片描述
下面我们以 clk 时钟引脚为例, 简要介绍 xdc 文件的语法。第一行以“#”号开头,表示这是一条注释语句。第二行是有效的约束命令。每一个约束命令单独占用一行,命令的结尾没有如 verilog 中的分号“;”一样的语句结束符号。每一条注释也单独占用一行。命令的第一个关键字代表该命令的名称,其后的所有字段都是该命令的参数列表。例如,在第二行的时钟周期约束命令中,“create_clock”是该命令的名称,它会创建一个时钟;其后的“-name clk”、“ -period 20”、“[get_ports clk ]”都是该命令的各个参数,分别表示所创见的时钟的的名称是“clk”、时钟周期是 20ns、时钟源是 clk 引脚。
第 4 行至第 6 行是对 IO 管脚的引脚位置约束和电平标准约束。例如,在第 4 行中,“set_property”是命令的名称;“PACKAGE_PIN Y18”是引脚位置参数,代表引脚位置是 Y18; “IOSTANDARD LVCMOS33”代表该引脚所使用的电平标准是LVCMOS33。
其他 IO 引脚的约束命令的语法与 clk 引脚是相同的,这里就不再重复了。但是要注意, create_clock 约束命令只能在 clk 时钟引脚上使用,其他普通 IO 上不能使用 create_clock 约束命令。
在 Notpepad++ 中编辑好之后,一定要记得保存!!!

扩展知识点:
时序约束(Timing Constraints) 用来描述设计人员对时序的要求,比如时钟频率,输入输出的延时等,以满足设计的时序要求。那么为什么工程中需要添加时序约束呢? 对于这个原因,首先给大家说明下,如果有些设计工程不加时序约束,可能会出现功能错误,这个地方加了“可能” 两个字,也就是说不一定会出错,有可能某一次编译功能没有问题,下一次编译就出现功能问题。
对时钟的约束最简单的理解就是,设计者需要告诉 EDA 工具设计中所使用的时钟的频率是多少;然后工具才能按照所要求的时钟频率去优化布局布线,使设计能够在要求的时钟频率下正常工作。 本次实验 clk 的时钟频率为 50MHz,周期为 20ns,在做约束时可以等于这个值或者略低于这个值,不建议周期设置的太小,否则软件在布局布线时很难满足这个要求。
其实对于比较简单的设计,即使不对工程做时序约束,可能也不影响最终的功能。但是当设计变得复杂起来,或者输入的时钟频率比较高的时候,如果不添加时序约束,那么就有可能在验证设计结果的时候出现一些意料之外的情况。所以这里推荐大家无论简单或者复杂的实验,都对工程做时序约束。时序约束的内容非常多,这里不再展开介绍,这里只对输入时钟做周期约束,约束的方法是在 XDC 文件中添加如下语句:
create_clock -period 20.000 -name clk [get_ports clk]
“create_clock”是该命令的名称,它会创建一个时钟;其后的“-name sys_clk” 、 “ -period 20”、“ [get_ports clk ]”都是该命令的各个参数,分别表示所创建时钟的名称是“clk”、时钟周期是20ns、时钟源是 clk 端口,一般只对输入的时钟做周期约束。

4 程序设计

由于发光二极管的阳极与 FPGA 的管脚相连,只需要改变与 LED 灯相连的 FPGA 管脚的电平, LED 灯的亮灭状态就会发生变化。当 FPGA 管脚为高电平时, LED 灯点亮; 为低电平时, LED 灯熄灭。
其中,计数器对 50MHz 时钟进行计数,从而达到计时的目的。计数器在每次计时到 0.5秒之后清零,然后重新开始计数,计数的值用于控制 LED 的显示状态。当计数器的值等于 0 时,就把 LED 信号取反。代码如下所示:
在这里插入图片描述
本程序中输入时钟为 50MHz,所以一个时钟周期为 20ns(1 / 50MHz)。因此计数器 cnt 通过对 50MHz 系统时钟计数, 计时到 0.5S, 需要累加 0.5s / 20ns=2500_0000 次。 在代码第 27行,每当计时到 0.5s 计数器清零一次。同时,在代码的第 37 行,根据计数器的计数值来赋值 LED 的状态。当计数值等于 0 时,led 进行取反操作,这样就实现了每 0.5s,led 信号翻转一次,以此实现 LED 灯闪烁功能。
疑问 :代码第 16 行, cnt 寄存器位宽为什么要设置成[24:0]呢?这是因为 cnt 最大计数值是 24999999,我们用计算器将其转成十六进制,如下图:
在这里插入图片描述
图6-1- 5 windows计算器界面

从上图右边我们可以看到总共是 25 位。
注 :代码 8 行,我们可以看到都在寄存器后面赋了初值,这不是必须的,但是建议同学们加上,因为一些央企研究所等单位的代码需要做评测,测评单位会要求给寄存器赋初值,笔者曾经经历过。

5 仿真验证

对 RTL 代码进行仿真之前,我们首先需要编写实验对应的仿真文件(TestBench)。 TestBench 是用于验证功能模块的设计是否符合预期,其内容主要分为以下三个步骤:
1、 向被测功能模块的输入接口添加激励
2、 对被测功能模块的顶层接口进行信号例化
3、 判断被测功能模块的输出是否满足设计预期

5.1 led灯闪烁模块(led_shark)仿真

5.1.1 仿真激励代码编写

接下来在Sim 中新建一个 tb_led_shark.v仿真测试文件,接下来右击“tb_led_shark.v”文件使用“ Notepad++”工具打开“tb_led_shark.v”文件,就可以开始编写仿真代码了。
在这里插入图片描述
为了节约仿真时间,更快地看到仿真现象,我们在仿真激励文件的第 23 行将 led_shark模块中的 TIME_0S5 进行重新定义赋值。
TB 模块编写完成后就可以使用仿真软件对我们编写的 RTL 代码进行仿真了,本次实验我们用Modelsim 软件来进行仿真。

5.1.2 批处理仿真

Modelsim仿真一般有两种方法,第一种是图形化界面仿真,即所有的操作都是在 Modelsim软件界面上来完成,其它友商都是用的这种方式。做为一个工作了十多年的工程师来说,实在不想使用图形化界面一步一步的去操作软件,不仅步骤繁琐而且没有任何技术含量。那有没有一种一键仿真的方式呢?读者朋友别急,我们即将为大家安排批处理仿真(全网首家使用该方式),更快捷,更贴近实际工程。相信读者学会了这种仿真方式,其它的仿真都不香了!接下来,我将手把手的教大家使用批处理仿真。
先来看看我们仿真文件夹的构成,如下图:
在这里插入图片描述
图6-1- 6 仿真文件夹Sim构成
tb_led_shark.v 就是我们的仿真测试代码
do 文件夹里面存放的就是我们的批处理文件,如下图:
在这里插入图片描述
图6-1- 7 do文件夹构成

我们打开 modelsim.bat 文件,选中 modelsim.bat,鼠标右键用 notepad++ 打开,打开后如下图:
在这里插入图片描述
图6-1- 8 modelsim.bat文件
第 2 行中,指定了 modelsim 的 vsim.exe 文件路径,读者只用将路径改为自己电脑存放vsim.exe 的位置(vsim.exe 文件在 modelsim 的安装路径下),改好以后,保存即可。
接着我们打开 sim.do 文件,同样用 notepad++ 打开,如下图所示:
在这里插入图片描述
图6-1- 9 sim.do文件

第二行:用于指定源码的位置,只要大家的工程结构和我们的一致,此处就不用更改
第三行:用于指定仿真代码的位置,只要大家的工程结构和我们的一致,此处就不用更改
第五行:仿真 tb_led_shark 这个仿真代码(就是我们前面编写的仿真代码)
第八行:调用波形文件,当我们还未开始仿真时,文件夹里面没有这个wave.do文件,仿真开始后,我们在波形窗口中加入要观察的信号后,按下 ctrl+s 就会生成一个 wave.do 文件,再下一次运行时,会自动加载上次观察的信号。
第九行:仿真运行时间
第十行:停止仿真
modelsim.bat 和 sim.do 文件修改好以后,就可以开始仿真了。
步骤1:直接鼠标双击 modelsim.bat 文件,如下图所示:
在这里插入图片描述
图6-1- 10 批处理仿真步骤1

步骤2:添加波形文件,选中被仿真的模块(led_shark),鼠标右键,然后选择 Add Wave,如下图所示:

在这里插入图片描述
图6-1- 11批处理仿真步骤2-1

这时我们可以看到波形窗口出现了我们添加的信号,如下图所示:
在这里插入图片描述
图6-1- 12批处理仿真步骤2-2
步骤3:保存添加的信号,按 CTRL+S ,出现如下对话框
在这里插入图片描述
图6-1- 13批处理仿真步骤3

默认会将 wave.do 文件保存在 do 文件夹下,直接点击 OK
步骤4:此时回到图 6-1-10 界面,在命令窗口输入 do sim.do ,如下图所示:
在这里插入图片描述
图6-1- 14批处理仿真步骤4-1
然后按下键盘上的 ENTER 键,modelsim 就开始编译仿真了,这时我们可以看到波形窗口出现了波形,如下图所示:
在这里插入图片描述
图6-1- 15批处理仿真步骤4-2
此时,我们可以按上面的图标,将波形缩小至全屏。波形的放大和缩小可通过按住 CTRL 键,滚动鼠标滚轮实现。
如果我们修改了代码,只用在图 6-1- 14 的命令窗口重新再输入 do sim.do 即可。

5.1.3 仿真波形分析

我们将仿真波形放大,如下图所示:
在这里插入图片描述
图6-1- 16仿真波形图

从上图可以看到, 计数器 cnt 的值在 0 到 9之间循环计数。当 cnt = 0 时, led 信号翻转,实现 LED 闪烁的效果。

6 综合编译

6.1 新建Vivado工程

毕竟笔者工作了十多年,再像前面《4-4 Vivado 使用初体验》章节那样使用Vivado软件,太繁琐了,我就以真正做项目的步骤生成bit文件。在前面我们已经将Source里面的源码(led_shark.v)和约束文件(pin.xdc)通过notepad++ 软件编辑好了,并且通过Modelsim进行了功能仿真,接下来我们新建Vivado工程。
步骤1:File --> Project --> New,然后点击Next
在这里插入图片描述
图6-1- 17 新建工程步骤1
步骤2:更改工程名及工程保存路径(注意:路径不能有中文字符),修改好以后,点击Next
在这里插入图片描述
图6-1- 18新建工程步骤2
步骤3:默认选择RTL Project即可,点击Next
在这里插入图片描述
图6-1- 19新建工程步骤3
步骤4:添加源文件(.v),点击Add Files,然后找到源文件存放的路径,将 .v 文件全部选中,点击OK
在这里插入图片描述
图6-1- 20 新建工程步骤4-1
在这里插入图片描述
图6-1- 21新建工程步骤4-2
步骤5:可以看到我们加入到工程的 .v 文件,点击Next
在这里插入图片描述
图6-1- 22新建工程步骤5
步骤6:添加约束文件(.xdc),点击Add Files
在这里插入图片描述
图6-1- 23新建工程步骤6
步骤7: 找到我们的管脚约束文件(pin.xdc),点击Next
在这里插入图片描述
图6-1- 24新建工程步骤7
步骤8: 选择器件xc7a35tfgg484-2,点击Next
在这里插入图片描述
图6-1- 25新建工程步骤8
步骤9:可以看到我们新建工程的总结,点击Finish即可
在这里插入图片描述
图6-1- 26新建工程步骤9
步骤10:可以看到新建工程的结构,包括了1个源码,1个约束文件,器件型号,如下图所示:
在这里插入图片描述
图6-1-27新建工程步骤10

6.2生成下载文件bit

我们直接生成bit文件,点击Generate Bitstream
在这里插入图片描述
图6-1- 28 生成bit文件
如果编译有错,我们就根据错误信息对我们的代码或约束文件进行修改,如果编译成功,如下图所示:
在这里插入图片描述
图6-1- 29 编译成功

7 下载验证

7.1 硬件连接

此时将 Xilinx 下载器一端连接电脑, 另一端与开发板上的 JTAG 下载口连接,开发板连接电源线,如下图所示:在这里插入图片描述
图6-1- 30征战 Pro 开发板连接实物图

注意!一定要先把下载器的一端连接到了电脑、另一端连接了 JTAG 接口之后,再给开发板上电!否则,对开发板的 JTAG 接口进行带电热插拔,有一定概率会损坏 JTAG 接口!

7.2 下载bit文件

步骤1:点击“Flow Navigator”窗口中的“Open Hardware Manager”按钮,如下图所示:
在这里插入图片描述

图6-1- 31下载bit文件步骤1-1
在这里插入图片描述
图6-1- 32下载bit文件步骤1-2

步骤2:鼠标右击“xc7a35t_0”,在弹出的菜单中选择“Program Device”,如下图所示:

在这里插入图片描述
图6-1- 33下载bit文件步骤2

步骤3:在弹出的对话框中直接点击“Program”即可,如下图所示:
在这里插入图片描述
图6-1- 34下载bit文件步骤3

下载完成之后,我们可以看到位于开发板上的 LED 灯在不断地闪烁,如下图所示:
在这里插入图片描述

图6-1-34 实验现象

到此,我们第一实验已经完成,大家多练习,延伸!
大家发现数码管显示了乱码,这是正常现象,因为数码管的驱动芯片我们没有控制它,在数码管接口上就会有一个不定状态的电平,反应到数码管就是显示乱码,这个我们不用管,只用关心 Led 灯是否正常控制。

相关文章:

跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验

硬件平台:征战Pro开发板 软件平台:Vivado2018.3 仿真软件:Modelsim10.6d 文本编译器:Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 LED,又名…...

springboot 跨域配置

方案一 Configuration public class GlobalCorsConfig {Beanpublic CorsFilter corsFilter() {//1. 添加 CORS配置信息CorsConfiguration config new CorsConfiguration();//放行哪些原始域config.addAllowedOrigin("*");//是否发送 Cookieconfig.setAllowCredenti…...

C语言宏和结构体的使用代码

先看代码: #include <stdio.h> #include <string.h>// 定义一个宏&#xff0c;用于定义结构体 #define DEFINE_STRUCT(name, type1, name1, type2, name2, size, cf) \typedef struct { \type1 name1; …...

微信小程序 覆盖组件cover-view

wxml 覆盖组件 <video src"../image/1.mp4" controls"{{false}}" event-model"bubble"> <cover-view class"controls"> <cover-view class"play" bind:tap"play"> <cover-image class"…...

【Redis知识】Redis进阶-redis还有哪些高级特性?

文章目录 概览1. 持久化2. 复制与高可用3. 事务和脚本4. 发布/订阅 Redis事务示例事务中的错误处理使用 WATCH 进行乐观锁总结 Redis管道一、管道的原理二、管道的特点三、管道的使用场景四、管道的实现示例五、管道的注意事项 发布订阅模式一、Redis发布订阅模式介绍二、Redis…...

【Pytorch实用教程】深入了解 torchvision.models.resnet18 新旧版本的区别

深入了解 torchvision.models.resnet18 新旧版本的区别 在深度学习模型开发中,PyTorch 和 torchvision 一直是我们不可或缺的工具。近期,torchvision 对其模型加载 API 进行了更新,将旧版的 pretrained 参数替换为新的 weights 参数。本文将介绍这一变化的背景、具体区别,…...

攻防世界 - Web - Level 3 | very_easy_sql

关注这个靶场的其它相关笔记&#xff1a;攻防世界&#xff08;XCTF&#xff09; —— 靶场笔记合集-CSDN博客 0x01&#xff1a;考点速览 本关考察的是 SSRF 漏洞&#xff0c;需要我们结合 Gopher 协议利用服务端进行越权 SQL 注入。考点不少&#xff0c;总结一下主要有以下几点…...

使用Java Selenium修改打开页面窗口大小

在自动化测试过程中&#xff0c;有时需要模拟不同屏幕尺寸的用户行为&#xff0c;以确保网页在不同设备上的显示效果和用户体验。Selenium是一个强大的自动化测试工具&#xff0c;支持多种编程语言和浏览器&#xff0c;可以帮助我们实现这一需求。本文将详细介绍如何使用Java S…...

基于BiLSTM和随机森林回归模型的序列数据预测

本文以新冠疫情相关数据集为案例,进行新冠数量预测。(源码请留言或评论) 首先介绍相关理论概念: 序列数据特点 序列数据是人工智能和机器学习领域的重要研究对象,在多个应用领域展现出独特的特征。这种数据类型的核心特点是 元素之间的顺序至关重要 ,反映了数据内在的时…...

【Vim Masterclass 笔记04】S03L12:Vim 文本删除同步练习课 + S03L13:练习课点评

文章目录 L12 Exercise 03 - Deleting Text1 训练目标2 训练指引2.1 打开文件 practicedeleting.txt2.2 练习删除单个字符2.3 练习 motion&#xff1a;删除&#xff08;Practice deleting motions&#xff09;2.4 文本行的删除练习&#xff08;Practice deleting lines&#xf…...

[AI] 深度学习的“黑箱”探索:从解释性到透明性

目录 1. 深度学习的“黑箱”问题&#xff1a;何为不可解释&#xff1f; 1.1 为什么“黑箱”问题存在&#xff1f; 2. 可解释性研究的现状 2.1 模型解释的方法 2.1.1 后置可解释性方法&#xff08;Post-hoc Explanations&#xff09; 2.1.2 内在可解释性方法&#xff08;I…...

网络安全技能试题总结参考

对网络安全技能测试相关的试题进行了总结,供大家参考。 一、单选题 1.(单选题)以下属于汇聚层功能的是 A.拥有大量的接口,用于与最终用户计算机相连 B.接入安全控制 C.高速的包交换 D.复杂的路由策略 答案:D 2.(单选题)VLAN划分的方法,选择一个错误选项 A.基于端口…...

【翻译】优化加速像素着色器执行的方法

中文翻译 在回复我的 Twitter 私信时,我遇到了一个关于如何提高像素/片段着色器执行速度的问题。这是一个相当广泛的问题,具体取决于每个 GPU/平台和游戏内容的特性,但我在本帖中扩展了我“头脑风暴”式的回答,以便其他人也觉得有用。这不是一份详尽的清单,更像是一个高层…...

赛博周刊·2024年度工具精选(图片资源类)

1、EmojiSpark emoji表情包查找工具。 2、fluentui-emoji 微软开源的Fluent Emoji表情包。 3、开源Emoji库 一个开源的emoji库&#xff0c;目前拥有4000个emoji表情。 4、中国表情包大合集博物馆 一个专门收集中国表情包的项目&#xff0c;已收录5712张表情包&#xff0c;并…...

【深度学习基础之多尺度特征提取】多尺度图像增强(Multi-Scale Image Augmentation)是如何在深度学习网络中提取多尺度特征的?附代码

【深度学习基础之多尺度特征提取】多尺度图像增强&#xff08;Multi-Scale Image Augmentation&#xff09;是如何在深度学习网络中提取多尺度特征的&#xff1f;附代码 【深度学习基础之多尺度特征提取】多尺度图像增强&#xff08;Multi-Scale Image Augmentation&#xff0…...

Spring Boot项目启动时显示MySQL连接数已满的错误

当Spring Boot项目启动时显示MySQL连接数已满的错误&#xff0c;这通常意味着应用程序尝试创建的数据库连接数超过了MySQL服务器配置的最大连接数限制。以下是一些解决此问题的步骤&#xff1a; 1. 检查MySQL服务器的最大连接数设置 首先&#xff0c;你需要检查MySQL服务器的…...

小程序多入口对应指定客服的实现方案:小程序如何实现接入指定客服人员?

小程序多入口对应指定客服的实现方案&#xff1a;小程序如何实现接入指定客服人员&#xff1f; 背景 小程序是否能接入指定客服&#xff1f; 近年来&#xff0c;小程序已经成为众多企业与用户交互的高效工具。无论是电商、服务预约还是在线咨询&#xff0c;客服功能的引入显…...

网页单机版五子棋小游戏项目练习-初学前端可用于练习~

今天给大家分享一个 前端练习的项目&#xff0c;技术使用的是 html css 和javascrpit 。希望能对于 刚刚学习前端的小伙伴一些帮助。 先看一下 实现的效果图 1. HTML&#xff08;HyperText Markup Language&#xff09; HTML 是构建网页的基础语言&#xff0c;它的主要作用是定…...

【玩转23种Java设计模式】行为型模式篇:命令模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...

【Spring MVC 常用注解】注解驱动开发的魔法

在 Spring MVC 中&#xff0c;注解可以说是开发者的“魔法棒”&#xff0c;通过简单的注解配置&#xff0c;开发者能够实现请求处理、参数绑定、响应返回等复杂功能&#xff0c;真正做到“少写代码多干活”。 我们接下来就来一起看看 Spring MVC 中常用的注解&#xff0c;它们的…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...