FPGA 16 ,Verilog中的位宽:深入理解与应用
目录
前言
一. 位宽的基本概念
二. 位宽的定义方法
1. 使用向量变量定义位宽
① 向量类型及位宽指定
② 位宽范围及位索引含义
③ 存储数据与字节数据
2. 使用常量参数定义位宽
3. 使用宏定义位宽
4. 使用[+:][-:]操作符定义位宽
1. 详细解释
+: 操作符
-: 操作符
2. 关键总结
三. 位宽在不同数据类型中的应用
1. reg型数据的位宽
2. wire型数据的位宽
3. integer型数据的位宽
四. 位宽不一致时的处理
五. 位宽相关的注意事项
六. 文章关键字提取解析
1. wire
2. reg
3. parameter
4. `define
5. integer
6. [+:][-:] 操作符
7. module
七. 更多操作
前言
在 Verilog 编程中,位宽是一个非常重要的概念,它直接关系到数据的存储、传输以及电路的功能实现。这里将深入探讨 Verilog 中位宽的相关知识,包括位宽的定义方法、在不同数据类型中的应用、位宽不一致时的处理以及相关的注意事项等等。
一. 位宽的基本概念
在Verilog这一硬件描述语言(HDL)中,位宽指的是数据在Verilog中的表示宽度,以比特(bit)为单位。它决定了一个信号或者变量能够存储的信息量。例如,一个位宽为8的信号可以表示 2⁸ = 256 种不同的状态。
二. 位宽的定义方法
1. 使用向量变量定义位宽
对于向量类型(如 wire 或 reg),可以直接指定位宽的大小。例如:
wire [7:0] data; // 定义一个8位宽的信号,位宽范围是从7到0
// 这里的7是最高有效位(MSB - Most Significant Bit),
// 0是最低有效位(LSB - Least Significant Bit)
在这个例子中:
- wire 是数据类型,用于表示模块之间的连线或信号路径。
- [7:0] 是位宽说明符,它指定了该信号由8个连续的二进制位组成,从最高有效位(MSB, bit 7)到最低有效位(LSB, bit 0)。
- data 是变量名,标识了这个8位宽的 wire 类型向量。
因此,data 变量信号可以用来存储8位的数据,比如一个字节的数据。
关键点的总结:
- wire 既是一种数据类型,可以通过指定位宽来表示单个位或向量(多位信号)。当你给 wire 指定位宽时,它就成为一个能够表示多个比特信息的向量。
- [7:0] 是位宽说明符,指定了信号的宽度,表明这个信号有多少个二进制位。
- data 是变量名,标识了一个特定的信号或寄存器,在这个例子中是一个8位宽的 wire 线网型向量。
① 向量类型及位宽指定
Wire 类型
- 概念:
wire
类型用于表示模块之间的连线或信号路径,这些信号线用来传输数据。在实际硬件中,可以将wire
想象成连接不同组件(如门、触发器等)的物理导线。- 向量定义:当需要传输多位数据时,可以通过定义一个向量来表示一组相关的信号。例如,
wire [7:0] data;
定义了一个8位宽的data
向量,意味着它能够承载从最低位(bit 0)到最高位(bit 7)共8个二进制位的信息。- 赋值方式:
wire
类型的赋值通常通过assign
语句或者通过实例化底层元件(如门级原语)来完成。wire
必须被驱动,即它的值由其驱动源决定,不能直接在过程块外部进行赋值操作。
Reg 类型
- 概念:
reg
类型则更多地用于表示具有存储能力的元素,比如寄存器。它可以保存数据,并且可以在特定的过程中(如always
块内)根据一定的逻辑条件更新其值。需要注意的是,reg
并不一定代表实际的寄存器;它也可以代表组合逻辑的结果,这取决于它是在时序逻辑还是组合逻辑上下文中被使用。- 向量定义:与
wire
类似,reg
也支持向量定义,如reg [7:0] counter;
表示一个8位宽的寄存器,可以用来保存8位的数据。- 赋值方式:
reg
类型的变量只能在过程块(如always
块)中进行赋值。在组合逻辑过程中,它会模拟组合逻辑的行为;而在时序逻辑过程中,它会表现出存储特性,通常是在时钟沿或特定事件发生时更新其值。
当我们要表示更复杂、能承载多位数据的信号时,就会将它们定义成向量类型,通过指定 [位宽范围] 的方式来明确其可以容纳的二进制位数。以 wire[7:0] data; 为例,这里 [7:0] 就是在指定位宽,表明 data 信号是一个位宽为 8 位的向量。
② 位宽范围及位索引含义
位宽范围的表示方式:在 wire[7:0] data; 里,7:0 这种写法定义了位宽范围,其中 7 代表最高有效位(MSB - Most Significant Bit),而 0 代表最低有效位(LSB - Least Significant Bit)。位宽范围的表示是从高位到低位依次递减排列的,这样的规定符合我们在数字电路以及计算机存储中对二进制数据表示的习惯。
位索引的作用:每个位都有对应的索引,用于精准地访问和操作向量信号中的某一位或者某几位。比如,data[7] 就专门用于访问 data 信号的最高有效位(也就是第 7 位),data[0] 则是用于访问其最低有效位。这种通过位索引来操作具体位的方式,在进行各种逻辑设计时非常有用,比如在进行数据的位操作、掩码处理、条件判断等情况中都会频繁用到。
例如,若想判断 data 信号的最高有效位是否为 1,可以写成如下的条件判断语句:
if (data[7] == 1)
// 执行相应的操作,比如进行一些后续的逻辑处理等
③ 存储数据与字节数据
存储数据的范围:由于
data
信号被定义为 8 位宽,根据二进制数的表示原理,它一共可以表示 2⁸ = 256 种不同的状态,对应的十进制数值范围是从 0(即二进制表示为00000000
)到 255(即二进制表示为11111111
)。这意味着这个信号能够存储和传递处于这个范围内的任何数值,这体现了它作为一个具有特定位宽的向量信号所具备的存储能力。与字节数据的联系:在计算机领域中,一个字节(Byte)的标准定义就是由 8 个二进制位组成的基本存储单元。所以,像
data
这样位宽为 8 位的信号,正好可以完整地存储一个字节的数据。这种对应关系在实际的数字电路设计以及计算机系统的数据交互等诸多场景中都有着广泛的应用。
例如,在一个简单的微处理器与外部存储器的数据传输过程中,如果每次传输是以字节为单位进行的,那么就可以利用像 data 这样的 8 位宽信号作为数据总线,来承载每一次传输的字节数据,实现数据在不同组件之间的有效传递。再比如,在一些简单的数字信号处理模块中,输入的数据如果是以字节格式进行编码的,同样可以用 data 信号接收并暂存这些字节数据,进而进行后续的诸如解码、运算等处理操作。
总之,通过 wire[7:0] data; 这样简洁的语句定义一个具有特定位宽且明确位索引的向量信号,我们可以在 Verilog 语言环境下方便灵活地进行与 8 位数据(即字节数据)相关的各种存储、传输以及逻辑处理操作,这为构建更为复杂的数字电路系统和逻辑功能模块奠定了坚实的基础。
2. 使用常量参数定义位宽
通过定义参数(parameter模块级常量 或 localparam局部常量)来灵活地设置位宽是一种推荐的做法。这种方法不仅提高了代码的可维护性,而且使得设计更加模块化和易于调试。当需要修改位宽时,只需要更改参数的值,而无需在代码中每个使用该位宽的地方进行修改。
// 定义一个参数 WIDTH,默认为8
parameter WIDTH = 8;// 使用参数来定义位宽
wire [WIDTH-1:0] data; // 定义了一个 WIDTH 位宽的 wire 向量
如果之后需要将位宽修改为16,只需要修改 parameter WIDTH = 16; 即可,所有依赖于 WIDTH 的定义会自动更新,而不需要在所有使用到 data 位宽的地方进行手动修改。
进一步的优化:
如果你希望在整个项目中保持一致的命名规范,并且可能需要在多个模块中使用相同的位宽定义,可以考虑将这些参数集中定义在一个单独的文件中,然后通过 include 指令引入。
// 在 parameters.v 文件中定义公共参数
parameter DATA_WIDTH = 8;
parameter ADDR_WIDTH = 32;// 在其他 Verilog 文件中引入参数
`include "parameters.v"
// 下面使用
上面提到的,parameter 和 localparam 都用于定义常量,但它们之间有一些重要的区别。理解这些差异可以帮助我们更有效地使用它们,并根据具体需求选择合适的类型。
parameter:模块级常量
定义:parameter 是模块级的常量,可以在模块内部或外部(其他模块)引用。
作用域:在模块内部定义时,parameter 的作用域是整个模块。
localparam:局部常量
定义:localparam 类似于 parameter,但它只能在定义它的模块内部使用,不能被外部模块实例化时覆盖。
作用域:localparam 的作用域严格限制在定义它的模块内部。
3. 使用宏定义位宽
在Verilog中,宏定义(通过反引号 ` 和 define 指令)可以用于定义常量值,如位宽。这提供了一种简单的方法来在整个设计中一致地应用某个特定值。例如:
`define WIDTH 8 // 定义一个宏
wire[`WIDTH - 1:0] data; // 使用宏来定义位宽
在这个例子中,WIDTH 是一个宏,其值为8。宏定义在预处理阶段进行简单的文本替换,因此 wire [WIDTH-1:0] data;实际上会被替换为wire [8-1:0] data;,即 wire [7:0] data;`。
但是需要注意的是,在 Verilog 中宏定义在预处理时进行简单的文本替换,可能会带来一些潜在的问题,特别是在涉及到复杂的位宽计算或者嵌套使用宏时。例如,当定义位宽为1时可能导致的错误,在模块中使用 define定义相关参数时,预处理时宏展开可能导致意外行为,所以在使用 define时要谨慎处理位宽计算,以避免设计错误url。
为了避免上述问题,建议遵循以下最佳实践:使用参数代替宏,对于位宽等常量值,推荐使用 parameter 或 localparam 来代替宏定义。这些关键字允许你在模块内部定义常量,并且可以在仿真和综合工具中更好地进行优化和调试。也就是,我们上面第二项记录的,2. 使用常量参数定义位宽。
4. 使用[+:][-:]
操作符定义位宽
在Verilog语法中,+: 和 -: 操作符主要用于进行位宽度选择(bit-width selection)。这些操作符允许你以一种更灵活的方式,从向量中提取子集,特别是在处理动态或参数化位宽时非常有用。语法如下:
value[base_expression +: width_expression];
value[base_expression -: width_expression];
// base_expression:表示起始的比特位置。
// width_expression:表示要选择的位宽。
1. 详细解释
+: 操作符
+: 操作符从 base_expression 开始,向高位方向选择指定宽度的比特。具体来说:
- value[base_expression +: width_expression] 表示从 base_expression 开始,向高位选择 width_expression 个比特。
- 这种选择是连续的,并且总是从低位到高位进行。
代码示例
reg [15:0] big_value;// 从第0位开始,选择8个比特,等价于 big_value[7:0]
big_value[0 +: 8];// 从第8位开始,选择8个比特,等价于 big_value[15:8]
big_value[8 +: 8];
-: 操作符
-: 操作符从 base_expression 开始,向低位方向选择指定宽度的比特。具体来说:
- value[base_expression -: width_expression] 表示从 base_expression 开始,向低位选择 width_expression 个比特。
- 这种选择也是连续的,并且总是从高位到低位进行。
代码示例
reg [15:0] big_value;// 从第7位开始,选择8个比特,等价于 big_value[7:0]
big_value[7 -: 8];// 从第15位开始,选择8个比特,等价于 big_value[15:8]
big_value[15 -: 8];
2. 关键总结
+:
操作符:向高位选择比特。适用于从低地址到高地址的选择。-:
操作符:向低位选择比特。适用于从高地址到低地址的选择。
这些操作符 +:
和 -:
操作符的一个重要特性是它们允许动态地选择位宽。这意味着你可以根据变量或参数来决定选择哪些比特,这在某些设计中非常有用。
三. 位宽在不同数据类型中的应用
1. reg型数据的位宽
reg类型用于表示寄存器类型的数据,可以存储一个值,直到被新的值覆盖。位宽的定义方式和前面提到的一样。例如:
reg[3:0] counter; // 定义一个4位宽的寄存器,可用于计数,范围是0到15
在这个例子中,counter可以用来实现一个简单的4位计数器。
2. wire型数据的位宽
wire类型用于表示连线,它的值由驱动它的信号决定。同样可以定义位宽,例如:
wire[15:0] address; // 定义一个15位宽的地址线
这里的address可以用于表示一个16位的地址信号,用于在电路中进行地址传输。
3. integer型数据的位宽
在Verilog中,integer 默认是32位的有符号数。虽然不能像 reg 和 wire 那样直接指定自定义的位宽,但在进行运算时需要考虑其32位的位宽特性。例如:
integer num;
// num在参与运算时,是按照32位有符号数进行处理的
四. 位宽不一致时的处理
- 在Verilog和SystemVerilog中,当不同位宽信号进行运算时可能导致预期结果错误。例如,一个8位的信号和一个16位的信号相加。
- 可以通过扩展位宽的方式来解决。例如,将8位信号扩展为16位后再进行相加操作。
- 也可以通过类型转换等方式确保运算的正确性。在实际编程中,需要根据具体的设计需求和电路功能来选择合适的处理方法。
五. 位宽相关的注意事项
- 在定义位宽时,要确保位宽的范围定义正确,特别是在使用[MSB:LSB]这种方式时,MSB和LSB都需要是常数而不能是变量(除了使用[+:][-:]操作符的情况)。
- 当使用参数或者宏定义位宽时,要注意它们的作用范围和可能带来的副作用。例如宏定义的文本替换特性可能导致意外的结果,而参数在模块实例化时的传递也需要正确处理。
- 在进行位宽相关的调试时,如果发现结果不符合预期,首先要检查位宽的定义和运算中涉及到的位宽处理是否正确。例如,是否存在位宽不匹配导致的数据截断或者错误的扩展。
六. 文章关键字提取解析
我们都知道,在Verilog中,关键字是该语言的重要组成部分,用于定义数据类型、控制结构和其它语言特性。虽然,上面和之前都有一些关键字的解析和应用,这里再来记录一下,多多益善。以下是以上博客文章中提取到的一些Verilog关键字,解析和小结,并附有示例代码和注释。
1. wire
wire关键字用来声明连线(net)类型的信号,它表示一个物理连接或逻辑门之间的信号线。wire的值由驱动它的源来决定,不能直接赋值。
// 定义一个8位宽的wire型变量data,它可以代表一个8位的数据总线
wire [7:0] data;
2. reg
reg关键字用于声明寄存器类型的变量,可以保存值直到被新的值覆盖。reg类型常用于存储状态信息,如计数器、寄存器文件等。
// 定义一个4位宽的reg型变量counter,可用于实现计数功能
reg [3:0] counter;
3. parameter
parameter关键字用于定义参数,即常量。参数可以在模块内部或跨多个模块共享,提供了一种灵活的方式去改变设计中的数值。
// 定义一个名为WIDTH的参数,默认值为8
parameter WIDTH = 8;// 使用参数WIDTH来定义一个宽度可变的wire型变量data
wire [WIDTH-1:0] data;
4. `define
`define 是一种预处理指令,用来创建宏定义。它会在编译前进行简单的文本替换。由于它是基于文本替换的,因此需要小心使用以避免潜在的问题。
// 定义一个名为WIDTH的宏,默认值为8
`define WIDTH 8// 使用宏定义WIDTH来定义一个宽度可变的wire型变量data
wire [`WIDTH-1:0] data;
5. integer
integer关键字用于声明整数类型的变量。默认情况下,integer是32位宽的有符号数。
// 声明一个integer类型的变量num,它默认是32位宽的有符号整数
integer num;
6. [+:][-:] 操作符
[+:][-:]操作符允许动态选择位段,其中+:是从低位开始向上取指定数量的位,而-:则是从高位向下取指定数量的位。
reg [15:0] big_value; // 定义一个16位宽的寄存器big_value// 使用+:操作符选取big_value的低8位
assign low_byte = big_value[0 +: 8]; // 等价于big_value[7:0]// 使用-:操作符选取big_value的高8位
assign high_byte = big_value[15 -: 8]; // 等价于big_value[15:8]
7. module
module关键字用于定义一个模块,它是Verilog设计的基本单元,包含了输入输出端口和内部逻辑。endmodule结束模块。
module example (input wire clk, // 时钟信号输入input wire rst_n, // 异步复位信号输入input wire [7:0] din,// 8位数据输入output reg [7:0] dout// 8位数据输出
);// 模块内部逻辑...
endmodule
以上是对博客文章中涉及的关键Verilog关键字的解析。每个关键字都有其特定的作用范围和用法,在实际编程中正确运用这些关键字对于编写高效且无误的Verilog代码至关重要。
七. 更多操作
之前文章中,有提到过关于 Verilog 中的关键字解析,请看
FPGA 9 ,Verilog 中的关键字和基数https://blog.csdn.net/weixin_65793170/article/details/141625021
完整FPGA系列,请看
FPGA系列,文章目录https://blog.csdn.net/weixin_65793170/article/details/144185217?spm=1001.2014.3001.5501
相关文章:
FPGA 16 ,Verilog中的位宽:深入理解与应用
目录 前言 一. 位宽的基本概念 二. 位宽的定义方法 1. 使用向量变量定义位宽 ① 向量类型及位宽指定 ② 位宽范围及位索引含义 ③ 存储数据与字节数据 2. 使用常量参数定义位宽 3. 使用宏定义位宽 4. 使用[:][-:]操作符定义位宽 1. 详细解释 : 操作符 -: 操作符 …...
day2 数据结构 结构体的应用
思维导图 小练习: 定义一个数组,用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息,删除后调用显示学…...
原创 传奇996_55——后端如何点击npc隐藏主界面
点击图片退出,举例: |linkexit Img|ax0.5|ay0.5|percentx50|percenty50|imgpublic/touming2.png|hideMain1|linkexit <Img|x0|y0|esc1|show4|bg1|move0|imgcustom/new/longhun/bg.png|loadDelay0|reset1|hideMain1>...
java+springboot+mysql法律咨询网
项目介绍: 使用javaspringbootmysql开发的法律咨询网(文书),系统包含管理员、用户角色,功能如下: 管理员:登录系统;用户管理;文章管理(法律知识)…...
【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!
还记得第一次使用ChatGPT时,那种既兴奋又困惑的心情吗?我是从一个对AI一知半解的普通用户,逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就,而是通过不断的探索和实践,掌握了一系列高效使用的技巧。今天&#…...
HarmonyOS-高级(四)
文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…...
国科大智能设备安全-APK逆向分析实验
APK逆向分析实验 使用APK常用逆向分析工具,对提供的移动应用程序APK文件进行逆向分析,提交逆向后代码和分析报告。具体任务如下: 任务一:安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法,对提供的Facebook Updat…...
Batch Normalization和 Layer Normalization
Batch Normalization和 Layer Normalization Batch Normalization (BN) 和 Layer Normalization (LN) 是深度学习中常用的归一化技术,它们的主要目的是加速训练、提高模型的收敛速度和稳定性。以下是对这两种归一化技术的详细讲解: 1. Batch Normalizat…...
数据结构——顺序表
顺序表的简单介绍 顺序表的概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 特点:顺序表的特点是可以通过元素的索引快速访问数据,其访问时间复杂度…...
C语言中互斥锁、信号量和条件变量的所有相关函数、参数、返回值和说明
1. 互斥锁(Mutex)的使用 互斥锁用于保护共享数据,防止多个线程同时修改它。 #include <pthread.h> #include <stdio.h> #include <stdlib.h> // 定义一个全局共享变量 int shared_counter 0; // 定义一个互斥锁 pthrea…...
(前序 简单)leetcode 226翻转二叉树
代码随想录说用前序遍历和后序遍历方便,而中序遍历比较绕。 活用自定义函数使程序结构更为清晰 这里用的是前序遍历,根结点root指向left和root,交换root的左右指向 执行过程: 也就是交换下例的 2 ,7 使得交换后&…...
搭建springmvc项目
什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据,对数据进行处理,…...
解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义
转载:self参数 - __ init__ ()方法 super(Net, self).__init__()是什么_super(net, self).init()-CSDN博客 相信大家在很多场合特别是写神经网络的代码的时候都看到过下面的这种代码: import torch import torch.nn as nn import torch.nn.functional …...
23种设计模式之责任链模式
目录 1. 简介2. 代码2.1 AbstractLogger(抽象处理者)2.2 InfoLogger (具体处理者)2.3 DebugLogger (具体处理者)2.4 ErrorLogger (具体处理者)2.5 Test (测试)…...
电感2222
1 电感 1电感是什么 2 电感的电流不能突变:电容是两端电压不能突变 3 电感只是限制电流变化速度...
车牌识别OCR授权:助力国产化升级,全面提升道路监控效率
政策背景:国产化升级,推动道路监控产业转型 随着国家对信息安全的重视,国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求,公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…...
【人工智能-中级】卷积神经网络(CNN)的中阶应用:从图像分类到目标检测
文章目录 卷积神经网络(CNN)的中阶应用:从图像分类到目标检测1. 图像分类:CNN的基础应用CNN结构概述经典网络架构2. 目标检测:从分类到定位基于区域的目标检测方法单阶段目标检测方法边界框回归与NMS(Non-Maximum Suppression)3. 深度学习中的目标检测挑战与解决方案4. …...
从资产流动分析WIF市场潜力X.game深究其他未知因素
近日,两则关于WIF最新消息引起了投资者们的注意。据报道,11月28日Vintermute在过去13小时内累计从Binance交易所提取了价值533万美元的WIF,此举不仅彰显了其强大的资金实力,更在某种程度上推动了WIF币价的反弹;另一方面…...
【工具变量】上市公司企业经营困境指数数据(Zscore、Oscore、RLPM、Merton DD)2000-2021年
一、资料范围:包括Zscore、Oscore、RLPM、Merton DD,经营困境说明如下:(1)Zscore:以2.67和1.81作为临界值计算样本得分所处的范围。Zscore>2.67 为财务状况良好,发生破产的可能性较小。Zscor…...
freeswitch(监听、旁听)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch使用场景: 比如A和B在通话,C想监听他们通话内容,其他设备是不知道有人在监听的使用方法: 进入dialplan/default.xml 在配置表添加 <…...
php基础:命名空间
1.PHP 命名空间可以解决以下两类问题: 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,以提高源代码的可读…...
SAP FICO物料分类账实操
物料分类账所涉及到的差异从采购入库的时候就可能已经产生,接下来从创建物料主数据开始对可能产生差异地方进行分析。其中有些操作步骤在标准价格估算这一篇博文中已经有过演示,可以先做了解。 其中的某些创建在有直接可用的情况下是非必须的࿰…...
【信息系统项目管理师】高分论文:论信息系统项目的整合管理(移动警务通系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文1、制定项目章程2、制定项目管理计划3、指导与管理项目工作4、管理项目知识5、监控项目工作6、实施整体变更控制7、结束项目或阶段正文 2022年2月,我有幸作为项目经理参加了“某市公安移动警务通系统”项…...
学习笔记069——Java集合框架
文章目录 集合1、List 接口2、Set 接口3、Map3.1、Map 常用实现类 集合 需要创建多个对象,但是数量和类型不确定。 集合是 Java 提供的一种类型,功能和数组类似,但是长度和数据类型都是动态。 集合框架(包括很多类和接口&#…...
JIS-CTF: VulnUpload靶场渗透
JIS-CTF: VulnUpload来自 <https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 靶机IP地址192.168.23.162,攻击机IP地址192.168.23.140…...
2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP
本篇文章,小编将与大家一同探讨2024年食堂采购系统的技术趋势,并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年,AI和机器学习在食堂采购系统中的应用将更加普遍。这些…...
Flink CDC实时同步mysql数据
官方参考资料: https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化(如插入、更新和删除操作)的技术。Flink CDC…...
解决MAC装win系统投屏失败问题(AMD显卡)
一、问题描述 电脑接上HDMI线后,电脑上能显示有外部显示器接入,但是外接显示器无投屏画面 二、已测试的方法 1 更改电脑分辨,结果无效 2 删除BootCamp,结果无效 3更新电脑系统,结果无效 4 在设备管理器中&#…...
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由…...
【NumPy进阶】:内存视图、性能优化与高级线性代数
目录 1. 深入理解 NumPy 的内存视图与拷贝1.1 内存视图(View)1.1.1 创建视图1.1.2 视图的特点 1.2 数组拷贝(Copy)1.2.1 创建拷贝1.2.2 拷贝的特点 1.3 视图与拷贝的选择 2. NumPy 的优化与性能提升技巧2.1 向量化操作示例&#x…...
[C++]多态
1. 什么是多态性? 1.定义 多态性是指同一个函数或操作在不同对象上表现出不同的行为。 2.分类 C 中的多态性主要分为两种: 1.编译时多态性(静态多态性): 编译时决定调用哪个函数。通过 函数重载 和 运算符重载 实…...
文本编辑器与正则表达式
1. VIM 编辑器 1.1 VIM 基本概念 VIM 是一个高度可定制的文本编辑器,广泛用于程序员的日常开发中。与传统的文本编辑器不同,VIM 基于模式操作,具有以下几个主要特点: 普通模式:用于浏览和修改文本。插入模式&#x…...
鲲鹏麒麟安装Kafka-v1.1.1
因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…...
scala基础_数据类型概览
Scala 数据类型 下表列出了 Scala 支持的数据类型: 类型类别数据类型描述Scala标准库中的实际类基本类型Byte8位有符号整数,数值范围为 -128 到 127scala.Byte基本类型Short16位有符号整数,数值范围为 -32768 到 32767scala.Short基本类型I…...
【重生之我要苦学C语言】文件操作
文件操作 为什么使用文件 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保…...
Python中PyTorch详解
文章目录 Python中PyTorch详解一、引言二、PyTorch核心概念1、张量(Tensor)1.1、创建张量1.2、张量操作 2、自动求导(Autograd)2.1、自动求导示例 三、构建神经网络1、使用nn模块2、优化器(Optimizer) 四、…...
Codigger SIDE之Helix编辑器
在Codigger的多维世界中,Helix编辑器以其卓越的性能和灵活性,成为开发者手中的利剑。基于Rust构建,Helix不仅继承了Vim编辑器的经典特性,更以其现代化的功能,重新定义了代码编辑的边界。 模式切换的艺术 Helix的模式切…...
vue3+echarts+websocket分时图与K线图实时推送
一、父组件代码: <template> <div class"chart-box" v-loading"loading"> <!-- tab导航栏 --> <div class"tab-box"> <div class"tab-list"> <div v-for"(item, index) in tabList…...
Maven常用插件清单
Maven 是一个强大的项目管理和构建工具,它使用插件来执行各种构建生命周期任务。以下是常用的一些 Maven 构建插件及其主要用途: 1. Maven Compiler Plugin 用途:编译Java源代码。配置示例:<build><plugins><plu…...
敏捷项目管理
虽然一直在践行敏捷开发,包括站会、尝试使用Confluence做知识wiki、每周分享等等,当然项目日常使用的coding、禅道、jira 项目管理和 jenkins 、git之类的CICD工具更不必说,但确实没有系统地去学习过敏捷开发管理。昨天被人问到敏捷开发到底是…...
牛客小白月赛107(A~E)
文章目录 A Cidoai的吃饭思路code B Cidoai的听歌思路code C Cidoai的植物思路code D Cidoai的猫猫思路code E Cidoai的可乐思路code 牛客小白月赛107 A Cidoai的吃饭 思路 签到题,按题意模拟即可 code void solve(){int n,a,b,c;cin >> n >> a &g…...
【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
基于Python深度学习的【猫狗宠物识别】系统设计实现
一、简介 宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【‘阿比西尼亚猫(Abyssinian)’, ‘孟加拉猫(Bengal)’…...
网站多语言前端翻译translate.js 在vue项目中的使用方法
网站多语言前端翻译translate.js 在vue项目中的使用方法 需求 客户网站,想要多语言版本的,通常的解决办法有两种: 1、最直接的办法:编写两种,或者多种语言版本的网站,也就是一个网站有几种语言࿰…...
HTML技术贴:深入理解与实践
1. 引言 HTML(HyperText Markup Language,超文本标记语言)是构建网页和网上应用的标准标记语言。它定义了网页内容的结构和意义,由一系列元素组成,这些元素告诉浏览器如何展示内容。本技术贴旨在深入探讨HTML的核心技…...
在SQL Server中使用hash join来提高表连接的性能
在SQL Server中使用hash join来提高表连接性能时,需要考虑数据集的大小、索引情况以及查询的具体需求。 在SQL Server中使用hash join来提高表连接性能的情况主要包括以下几种: • 两个表都没有合适的索引:Hash join通常适合当两个表都没有索…...
一键学懂BurpSuite(8)
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
系统思考—战略决策
别用管理上的勤奋,来掩盖经营上的懒惰。 日本一家物业公司,因经营不善,面临生死存亡的危机。老板为了扭转局面,采取了很多管理手段——提高员工积极性,推行业绩与绩效挂钩,实施各种考核制度。然而…...
mybatis,mysql之collection 与 association 不生效问题(仅是个人常犯错误)
因为自己马大哈,经常犯这个错误,原以为是拷贝的代码问题,最后发现是自己的遗漏问题! 看代码,先看不生效的 <resultMap type"Price" id"PriceResult"><id property"priceId&qu…...
探索 Echarts 绘图:数据可视化的奇妙之旅
目录 一、Echarts 初印象 二、搭建 Echarts 绘图环境 三、绘制第一个图表:柱状图的诞生 四、图表的美化与定制:让数据更具吸引力 1. 主题切换:一键变换风格 2. 颜色调整:色彩搭配的艺术 3. 标签与提示框:丰富信…...