初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~

news2024/11/20 14:24:18

实例:点灯学习
image.png

一、Verilog语法学习

1. 参考文章

刚接触Verilog,作为一个硬件小白,只能尝试着去理解,文章未完…持续更新。

参考博客文章:

  • Verilog语言入门学习(1)
  • Verilog语法
  • Verilog】一文带你了解Verilog基础语法 - 子墨祭的文章 - 知乎
  • 关于Verilog中的几种赋值语句

这里抄点,那里扣点,整理了一下,感谢以上各位作者。具体的实例项目是同事给的,他让我学着编出个流水灯,这不要我的命嘛,慢慢学吧。

你还可以在哪里看到这篇文章:

  • 知乎
  • 简书

2. Verilog模块

Verilog的基本设计单元是“模块”。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:

image.png

可以看到模块由关键字module....endmodule 确定。

module 模块名(接口信号);

​ //信号声明

​ //功能描述

endmodule

要求: 1. 模块名具有意义;2. 一个.v文件只有一个模块。

3. Verilog语法

Verilog是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

VerilogC的区别:

  • Verilog是硬件描述语言,编译下载到FPGA之后,会生成电路,所以Verilog全部是并行处理与运行的
  • C语言是软件语言,编译下载到单片机CPU之后,还是软件指令,而不会根据代码生成相应的硬件电路,而单片机CPU处理软件指令需要取址、译码、执行,是串行执行的。

**可综合描述:**综合tool能够Verilog描述转化(complie)成基本的数字电路底层cell(与或非gate,寄存器等)的描述。

assign y = a & b;

**不可综合描述:**综合tool不能把Verilog描述转换为基本的数字电路底层cell的描述。

$display("hello word.\n")

Verilog设计仿真与实现:通过EDA TOOL,可以在计算机上对Verilog设计的功能进行仿真。

数字电路设计方法学:

  • Bottom-Up:从底层cell开始,逐渐往上加功能;
  • top-Down:从底层结构,协议算法开始,向下逐步划分功能模块;再细分各功能模块与IO

目前,基于Verilog的数字电路通常使用TOP-Down的设计方法。因为数字IP/IC的规模很大,需要先抽象思维再细化;

Verilog给数字电路的设计的抽象思维提供了一种设计语言,但是:数字设计和软件设计不同的,需要Think in Hardware,写代码前先设计电路结构。Verilog的功能描述:

Top-Dowan描述数字电路功能:通过模块module的层次化设计,实现一个复杂的数字逻辑功能image.png

Verilog逻辑值:

逻辑电路中有四种值,即四种状态:

  • 逻辑0:表示低电平,对应电路的GND
  • 逻辑1:表示高电平,对应电路的VCC
  • 逻辑X:表示未知,有可能是高电平,也有可能是低电平;
  • 逻辑Z:表示高组态,外部没有激励信号是一个悬空状态;

image.png

Verilog的数字进制
Verilog数字进制格式包括二进制、八进制、十进制和十六进制,一般常用的为二进制、十进制和十六进制。

  • 二进制表示如下:4'b0101表示4位二进制数字0101
  • 十进制表示如下:4'd2表示4位十进制数字2
  • 十六进制表示如下:4'ha表示4位十六进制数字a

当没有指定数字的位宽与进制时,默认为32位的十进制,比如100,实际上表示的值为32'd100

4. Verilog语法详细介绍

(1)标识符:

用于定义code中的各种名字,比如:信号,moduledefineparameter

  • 标识符由:字符,数字,下划线组成;
  • 首字母必须是字母或者下划线;
  • 标识符是区分大小写的;
  • 信号名字与信号功能相对应;

不建议大小写混合使用,普通内部信号建议全部小写,参数定义建议大写

  1. 用有意义的有效的名字如sumcpu_addr
  2. 用下划线区分词语组合,如cpu_addr
  3. 采用一些前缀或后缀
    1. 比如:时钟采用clk前缀:clk_50m,clk_cpu;低电平采用_n后缀:enable_n
  4. 统一缩写,如全局复位信号rst
  5. 同一信号在不同层次保持一致,如同一时钟信号必须在各模块保持一致。
  6. 自定义的标识符不能与保留字(关键字)同名
  7. 参数统一采用大写,如定义参数使用SIZE

(2)关键字

优先记录常用关键字:

关键字含义
module模块开始定义
input输入端口定义
output输出端口定义
inout双向端口定义
parameter信号的参数定义
wirewire信号定义
regreg信号定义
always产生reg信号语句的关键字
assign产生wire信号语句的关键字
begin语句的起始标志
end语句的结束标志
posedge、negedge时序电路的标志
caseCase语句起始标记
defaultCase语句的默认分支标志
endcaseCase语句结束标志
ifif/else语句标志
elseif/else语句标记
forfor语句标记
endmodule模块结束定义

(3)注释:

  • 注释一行:以//开始,到行末;

  • 注释多行:以/*开始,到*/为止的所有内容;

(4)数据类型:

主要有三大类数据类型,

  • 寄存器类型;
  • 线网类型;
  • 参数类型;

线性数据:用于连续赋值语句(assign)描述组合逻辑或者module间的信号连接线;

1) 寄存器类型

寄存器类型表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值过程中被保存下来。

如果语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为寄存器;如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号则该寄存器变量对应为硬件连线

寄存器类型的缺省值是x(未知状态)。

寄存器数据类型有很多种,如regintegerreal等,其中最常用的就是reg类型

reg [31:0] delay_cnt; // 延时计数器
reg key_flag; // 按键标志

wire [3:0] din;
reg [3:0] d0; //4bit
reg d1;//1bit
initial begin //过程赋值语句
  d1 = 0;#10;
  d1 = 1;
end
always(posedge clk)begin //clk端一般就是寄存器
  if(d1) d0 <= din;
end

2)线网类型

线网表示Verilog结构化元件间的物理连线。

值由驱动元件的值决定,例如连续赋值或门的输出。

如果没有驱动元件连接到线网,线网的缺省值为z(高阻态)。

线网类型,如triwire等,其中最常用的就是wire类型,它的使用方法如下:

wire data_en; //数据使能信号
wire [7:0] data;//数据

wire a;//1bit位宽
wire [3:0] b; //4bit
wire [7:0] c;//8bit
assign a = 1'b0;//连续赋值语句
assign c = 8'h5a;//8bit的十六进制数
//tri0、tri1:带下拉、上拉电阻的特性,没有驱动时,会由默认的值为0/1,一般综合代码不用
tri0 s0;
tri1 [20:0] s1;

3)参数类型

参数其实就是一个常量,常被用于定义状态机的状态、数据位宽和延迟大小

可以在编译时修改参数的值,因此又常被用于一些参数可调的模块中,使用户在实例化模块时,可以根据需要配置参数。

在定义参数时,可以一次定义多个+参数,参数与参数之间需要用逗号隔开。

要注意的是参数的定义是局部的,只在当前模块中有效。

parameter DATA_WIDTH = 8;//数据位宽为8

(5)Verilog运算符

1)算术运算符

+
-
*
/
%

Verilog实现乘除比较浪费组合逻辑资源,尤其是除法。一般2的指数次幂的乘除法使用移位运算来完成运算.

非2的指数次幂的乘除法一般是调用现成的IPQUARTUS/ISE等工具软件会有提供,不过这些工具软件提供的IP也是由最底层的组合逻辑(与或非门等)搭建而成的。

2)关系运算符

>
<
>=
<=
==
!=

用来进行条件判断,在进行关系运算符时,如果声明的关系是假的,则返回值是0,如果声明的关系是真的,则返回值是1;

所有的关系运算符有着相同的优先级别,关系运算符的优先级别低于算术运算符的优先级别。

3)逻辑运算符

!
&&
||

连接多个关系表达式,可实现更加复杂的判断,一般不单独使用,都需要配合具体语句来实现完整意思。

4)条件运算符

?
:

从两个输入中选择一个作为输出的条件选择结构,功能等同于always中的if-else语句。

5)位运算符

~
&
|
^

直接对应数字逻辑中的与、或、非门等逻辑门

位运算符一般用在信号赋值上。

6)移位运算符

<<
>>

移位运算符包括左移位运算符和右移位运算符,这两种移位运算符都用0来填补移出的空位。

一般使用左移位运算代替乘法,右移位运算代替除法,但是只能表示2的指数次幂的乘除法。

7)拼接运算符

{a,b}

可以把两个或多个信号的某些位拼接起来进行运算操作

image.png

5. 阻塞赋值(Blocking)和非阻塞赋值(Non-Blocking)

(1)阻塞赋值

在一个always块中,后面的语句会受到前语句的影响,具体来说,在同一个always中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被“阻塞”。

也就是说always块内的语句是一种顺序关系

符号“=”用于阻塞的赋值(如:b=a;),阻塞赋值“=”在begin和end之间的语句是顺序执行,属于串行语句。其后面的赋值语句从概念上来讲是在前面一条语句赋值完成之后才执行的。

(2)非阻塞赋值

符号"<="用于非阻塞赋值(如:b<=a;),非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边。

begin-end之间的所有语句,一起执行,且是个时钟只执行一次,属于并行执行语句。

非阻塞赋值的操作过程可以看作两个步骤:

  • 赋值开始的时候,计算RHS(等号右边的表达式);
  • 赋值结束的时候,更新LHS(等号左边的表达式)。

非阻塞的概念是指,在计算非阻塞赋值的RHS以及LHS期间,允许其他的非阻塞赋值语句同时计算RHS和更新LHS

6. assign和always的区别

  • assign语句使用时不能带时钟;
  • always语句可以带时钟,也可以不带时钟;
  • always不带时钟是,逻辑功能和assign完全一致,都是只产生组合逻辑。
  • 比较简单的组合逻辑推荐使用assign语句,比较复杂的组合逻辑推荐使用always语句。

(1)带时钟和不带时钟的always

always语句可以带时钟,也可以不带时钟。

  • always不带时钟时,逻辑功能和assign完全一致,虽然产生的信号定义为reg类型,但是该语句产生的还是组合逻辑;
  • always带时钟信号时,这个逻辑语句才能产生真正的寄存器。

(2)latch

latch指锁存器,是一种对脉冲点平敏感的存储单元电路

锁存器和寄存器都是基本存储单元,锁存器是电平触发的存储器,寄存器是边沿触发的存储器。

两者的基本功能是一样的,都可以存储数据。

锁存器是组合逻辑产生的,而寄存器是在时序电路中使用,由时钟触发产生的。

latch的主要危害是产生毛刺(glitch),这种毛刺对一级电路是很危险的。并且其隐蔽性很强,不易查出。

在设计中,应尽量避免latch的使用。

代码里出现latch的两个原因是在组合逻辑中,if或者case语句不完整的描述,比如if缺少else分支,case缺少default分支,导致代码在综合过程中出现了latch。解决办法就是if必须带else分支,case必须带default分支。

只有不带时钟的always语句if语句或者case语句不完整才会产生latch,带时钟的语句if或者case语句不完整描述不会产生latch

7. 状态机

Verilog是硬件描述语言,硬件电路是并行执行的,当需要按照流程或者步骤来完成某个功能是,代码中通常会使用很多个if嵌套语句来实现,这样就增加了代码的复杂度,以及降低了代码的可读性,这个时候就可以使用状态机来编写代码。

状态机相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。

状态机,全程是有限状态机(Finite State Machine,缩写为FSM),是一种在有限状态之间按一定规律转换的时序电路,可以认为是组合逻辑和时序逻辑的一种组合。状态机通过控制各个状态的跳转来控制流程,使得整个代码看上去更加清晰易懂,在控制复杂流程的时候,状态机优势明显,因此基本上都会用到状态机,如SDRAM控制器等。

根据状态机的输出是否与输入条件相关,可将状态机分为两大类,即摩尔(Moore)状态机和米勒(Mealy)型状态机

  • Mealy状态机:组合逻辑的输出不仅取决于当前状态,还取决于输入状态

image.png

  • Moore状态机:组合逻辑的输出只取决于当前状态

image.png

(1)三段式状态机

根据状态机的实际写法,状态机还可以分为一段式、和二段式和三段式状态机。

  • 一段式:整个状态机写到一个always模块里面,在该模块中即描述状态转移,又描述状态的输入和输出。

不推荐,一般都会要求把组合逻辑和时序逻辑分开,组合逻辑和时序逻辑混合在一起不利于代码维护和修改

  • 二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出,需要定义两个状态,现态和次态,然后通过现态和次态的转换来实现时序逻辑。
  • 三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
    • 三段式状态机的基本格式是:
      • 第一个always语句实现同步状态跳转;
      • 第二个always语句采用组合逻辑判断状态转移条件;
      • 第三个always语句描述状态输出(可以用组合电路输出,也可以时序电路输出)。

8. 模块化设计

划分模块的基本原则是子模块功能相对独立、模块内部联系尽量紧密、模块间的连接尽量简单。

在进行模块化设计中,对于复杂的数字系统,我们一般采用自顶向下的设计方式。可以把系统划分成几个功能模块,每个功能模块再划分成下一层的子模块;每个模块的设计对应一个module,一个module设计成一个Verilog程序文件。因此,对一个系统的顶层模块,我们采用结构化的设计,即顶层模块分别调用了各个功能模块。

image.png

FPGA逻辑设计中通常是一个大的模块中包含了一个或多个功能子模块,Verilog通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接,有利于简化每一个模块的代码,易于维护和修改。

如果子模块内部使用parameter定义了一些参数,Verilog也支持对参数的例化(也叫参数的传递),即顶层模块可以通过例化参数来修改子模块内定义的参数。

子模块名是指被例化模块的模块名,而例化模块名相当于标识,当例化多个相同模块时,可以通过例化名来识别哪一个例化,一般命名为“u_”+“子模块名”

参数的例化,参数的例化是在模块例化的基础上,增加了对参数的信号定义

// 例子
time_count #(
    .MAX_NUM (TIME_SHOW)    // 参数例化
)u_time_count(
    .clk (sys_clk),
    .rst_n (sys_rst_n),     // 信号例化
    .flag (add_flag)
);

9. Verilog的编程规范

工程的组织形式一般包括如下几个部分,分别是doc、par、rtlsim四个部分

  • doc:一般存放工程相关的文档,包括该项目用到的datasheet(数据手册)、设计方案等。
  • par:主要存放工程文件和使用到的一些IP文件
  • rtl:主要存放工程的rtl代码,是工程的核心,文件名与module名称应当一致,建议按照模块的层次分开存放
  • sim:主要存放工程的仿真代码,复杂的工程里面,仿真也是不可或缺的部分,可以极大减少调试的工作量。

(1)文件头声明

每一个Verilog文件的开头,都必须有一段声明的文字。包含文件的版权、作者、创建日期,以及内容简介等等

//*************************************Copyright(c)*******************//
// FileName:
// Last modified Date:
// Last Version:
// Descriptions: 
//*******************************************************************//

(2)输入输出定义

module led(
	input   sys_clk,     // 系统时钟
    input   sys_rst_n ,  // 系统复位
    output reg [3:0] led // 4位LED灯
);
  • 一行只定义一个信号
  • 信号全部对齐
  • 同一组的信号放在一起

(3)parameter定义

  • module中的parameter声明,不建议随处乱放,将parameter定义放在紧跟着module的输入输出定义之后
  • parameter等常量命名全部使用大写

(4)wire/reg定义

一个module中的wire/reg变量声明需要集中放在一起,不建议随处乱放

  • regwire的定义放在紧跟着parameter之后
  • 建议具有相同功能的信号集中放在一起
  • 信号需要对齐,reg和位宽需要空2格,位宽和信号名字至少空四格
  • 位宽使用降序描述,[6:0]
  • 时钟使用前缀clk,复位使用后缀rst
  • 一行只定义一个信号

(5)信号命名

  • 内部信号不要使用大写,也不要使用大小写混合,建议全部使用小写
  • 模块名字使用小写
  • 异步信号,使用_a作为信号后缀

(6)always块

  • 一个always需要配一个beginend
  • always前面需要有注释
  • 一个always和下一个always空一行即可,不要空多行
  • 时序逻辑使用非阻塞赋值

(7)assign块

  • assign的逻辑不能太复杂,否则易读性不好
  • assign前面需要有注释
  • 组合逻辑使用阻塞赋值

(8)空格 和 TAB

  • 由于不同的解释器对于TAB翻译不一致,所以建议不使用TAB,全部使用空格

二、环境Lattice Dimond环境的搭建

  • Lattice的官网下载Dimond,下一步下一步安装;

  • 获取电脑的MAC地址,注意是有线网卡的MAC地址,不能是无线的;

  • 在官网申请免费的证书,这里有问题,官网不会跳出来,所以是请同事帮忙生成的;

  • 打开软件添加证书文件,即可。

  • Lattice官网链接

  • 证书申请网址

(有的会跳出来什么联系管理员,我这里是把IP改为马来西亚打开网址的)

image-20230506135525601

填写物理网卡MAC地址质料:

image-20230506135617995

新建工程项目:

image.png

image.png

选择芯片,我的板子上的芯片是:image.png

生成项目文件夹:

image.png

添加Verilog文件;
image.png

image.png

这样就可以编写Verilog代码了。

三、点灯实例分析

同事给出的一段实例,能够点亮两个灯;

实例环境硬件如下:

  • 电脑
  • 可调电源

image-20230506140226687

module clk_div
( 
in_clk,
clk_8hz,
clk_1hz,
pg_rstn
);

input	in_clk; 
output	clk_8hz;
output	clk_1hz;
input	pg_rstn; 

reg [4:0] count0_r;
reg [8:0] count1_r;
reg [9:0] count2_r;

reg       div0_clk;
reg       div1_clk;
reg       div2_clk;

wire	  clk_1hz;
wire	  clk_8hz;

 
assign	clk_1hz		=	count2_r[9];
assign	clk_8hz		=	count2_r[6];


always @(posedge in_clk or negedge pg_rstn)	//25M--1M
begin
 if (!pg_rstn)
   begin
   div0_clk<= 1'b1;
   count0_r	<= 5'b0;	
  end
  else if (count0_r==5'b11001)
  begin
   div0_clk<=1'b1;		
   count0_r<=5'b0;
  end 
  
 else
  begin
   count0_r<=count0_r+1'b1;
   div0_clk<= 1'b0;	
  end
end

always @(posedge div0_clk or negedge pg_rstn)	//1M--1k
begin
 if (!pg_rstn)
  begin
   count1_r	<= 9'b0;
   div1_clk	<= 1'b0;
  end
 else if (count1_r==9'h1ff)
  begin
   div1_clk<=~div1_clk;		
   count1_r<=9'h0;
  end
 else
  count1_r<=count1_r+1'b1;
end

always @(posedge div1_clk or negedge pg_rstn)	//1k--1Hz
begin
 if (!pg_rstn)
  begin
   count2_r	<= 10'b0;
  end
 else if (count2_r==10'h3ff)
  begin		        
   count2_r <= 10'b0;                        
  end
 else
	 begin
  count2_r <= count2_r+1'b1;
  end
end

OSCH #("10.23") osc_int (
 .STDBY(1'b0),
 .OSC(clk_i),
 .SEDSTDBY());
 
endmodule

1. 实例代码分析

module clk_div
( 
in_clk,
clk_8hz,
clk_1hz,
pg_rstn
);
input	in_clk; 
output	clk_8hz;
output	clk_1hz;
input	pg_rstn;    
....
endmodule

这一段是接口定义,定义了两个输出信号clk_8hzclk_1hz,代表两个灯不同的频率。两个输入信号in_clkpg_rstn指芯片的时钟和复位。

模块由关键字module....endmodule 确定。

clk_div模块名

image-20230506142132091

reg [4:0] count0_r;//5bit
reg [8:0] count1_r;//9bit
reg [9:0] count2_r;//10bit

reg定义寄存器,寄存器数据类型有很多种,如reg、integer、real等,其中最常用的就是reg类型。

reg div0_clk;
reg div1_clk;
reg div2_clk;

默认位宽是1。

image-20230506143616054

wire	  clk_1hz;
wire	  clk_8hz;

wire定义的是线网,线网指的是Verilog结构化元件间的物理连线

assign	clk_1hz		=	count2_r[9];
assign	clk_8hz		=	count2_r[6];
  • assign产生wire信号语句的关键字,连续赋值语句assign

  • 比较简单的组合逻辑推荐使用assign语句,比较复杂的组合逻辑推荐使用always语句。

  • reg与wire的区别详细

always @(posedge in_clk or negedge pg_rstn)	//25M--1M
begin
 if (!pg_rstn)
   begin
   div0_clk<= 1'b1;//一位二进制数1
   count0_r	<= 5'b0;//五位二进制数0
  end
    else if (count0_r==5'b11001)//五位二进制数11001
  begin
   div0_clk<=1'b1;
   count0_r<=5'b0;
  end 
  • 时序逻辑 ,带异步复位 ;

  • posedge是上升沿,电平从低到高跳变

  • negedge是下降沿,电平从高到低跳变

  • 参考文章

文章持续更新,由于刚接触,所以很多东西也分析不错来,之后慢慢补充。

2. 编译运行

  1. 编译代码

image-20230506153249044

image-20230506153333075

  1. 生成JED文件

image-20230506153400419

  1. 引脚设置

image-20230506153443864

  1. 找到项目中的.jed文件

image-20230506154229607

  1. 设备上电,插上烧录器插上电脑。点击烧录

image-20230506154315720

  1. 等待

image-20230506154324639

  1. 完成

image-20230506154405479

四、总结

这东西对于像我这样跨专业的初学者来说真难,慢慢学吧,之后会找有关书或者视频,更新Verilog语言的基础学习笔记。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NoSQL自述---衍生过程

NoSQL概述 一.数据存储的演化史 1.单机MySQL的美好年代 在90年代&#xff0c;一个网站的访问量一般都不大&#xff0c;用单个数据库完全可以轻松应付。在那个时候&#xff0c;更多的都是静态网页&#xff0c;动态交互类型的网站不多。 上述架构下&#xff0c;我们来看看数据…

计算机毕业论文内容参考|软件工程|基于java开发汽车销售系统资料

文章目录 导文资料1简述模块与功能总结资料二摘要前言绪论课题背景国内外现状与趋势相关技术与方法介绍导文 如下是一个 Java 实现的汽车销售系统的简单描述,供参考。 计算机毕业论文内容参考|软件工程|基于java开发汽车销售系统资料 资料1 简述 汽车销售系统是专门为汽车销…

jetcache:阿里这款多级缓存框架一定要掌握

0. 引言 之前我们讲解了本地缓存ehcache组件&#xff0c;在实际应用中&#xff0c;并不是单一的使用本地缓存或者redis&#xff0c;更多是组合使用来满足不同的业务场景&#xff0c;于是如何优雅的组合本地缓存和远程缓存就成了我们要研究的问题&#xff0c;而这一点&#xff…

前端002_初始化项目

1、命名和启动项目 将目录名 vue-admin-template-master 重命名为 db-manager-system 将 db-manager-system/package.json 中的 name 值改为 db-manager-system {"name": "db-manager-system","version": "1.0.1","descriptio…

车载搭载SystemUI音频技术,全方位呈现高品质音效

SystemUI概述 SystemUI 是 Android 操作系统中的一个系统服务&#xff0c;主要负责管理和显示系统界面元素&#xff0c;例如状态栏、通知栏、键盘和屏幕截图等。SystemUI 系统服务是系统级别的组件&#xff0c;提供的功能对于用户体验和系统安全性都非常重要。 SystemUI 的主…

KNN中不同距离度量对比和介绍

k近邻算法KNN是一种简单而强大的算法&#xff0c;可用于分类和回归任务。他实现简单&#xff0c;主要依赖不同的距离度量来判断向量间的区别&#xff0c;但是有很多距离度量可以使用&#xff0c;所以本文演示了KNN与三种不同距离度量(Euclidean、Minkowski和Manhattan)的使用。…

Three——四、几何体、高光网络材质、锯齿模糊以及GUI库的使用

文章&#xff1a; Three.js——一、初识Three以及基础的前端场景搭建(结尾含源码)Three——二、加强对三维空间的认识Three——三、动画执行、画布大小、渲染帧率和相机适配体验Three——四、几何体、高光网络材质、锯齿模糊以及GUI库的使用 Threejs 常见几何体简介 Three.j…

为什么我们要使用向量化运算

问题背景 如果你是matlab用户&#xff0c;你一般都会使用向量化运算进行编程。原因也许很简单&#xff0c;因为matlab针对向量化运算在底层做了深度优化&#xff0c;尤其是针对矩阵乘法调用了MKL之类的高度优化的第三库来加速。所以我们在推演算法的阶段&#xff0c;尽量的以向…

管理后台项目-08-首页使用echarts展示图表数据

目录 1-需求页面 2-头部需求分析 3-中间部分需求分析 3.1-mock数据 3.2-动态渲染数据 4-底部需求分析 1-需求页面 2-头部需求分析 上面头部有四个card&#xff0c;card分为上中下三部分&#xff0c;其中上都是文字描述和一个小图标&#xff1b;中间部分有文字&#xff0c;折…

达梦数据库管理系统 DM8

检查数据库版本及服务状态 //查看达梦数据库运行状态 SELECT status$ as 状态 FROM v$instance; //查看达梦数据库版本 SELECT banner as 版本信息 FROM v$version;创建用户 //创建用户 CREATE USER DM IDENTIFIED BY "dameng123";授予用户基本权限 使用 GRANT 语…

重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)

重大问题&#xff0c;Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的&#xff0c;但是&#xff0c;今天我将代表所有微软用户&#xff0c;解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…

[链表OJ题 2] 链表的中间结点 -- 快慢指针找链表的中间节点

目录 题目来源&#xff1a; 代码实现 思路分析&#xff1a; 1.当链表个数为奇数 2.当链表个数为偶数 总结&#xff1a; 题目来源&#xff1a; 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com) 题目描述&#xff1a; 代码实现 struct Li…

Dart中的factory关键字用法

factory简介 在Dart中,factory关键字用于定义工厂构造函数。它与普通的构造函数有以下几个区别: factory构造函数的调用可以返回子类型或其它类型的实例。普通构造函数总是返回其包含的类型的实例。factory构造函数可以有返回值。普通构造函数的返回值永远是其包含的类型的实…

服务器中了勒索病毒,malox勒索病毒的加密方式及如何应对勒索病毒攻击

随着计算机技术的发展&#xff0c;计算机成为现代人工作和生活中必不可少的电子产品。但随着很多企业和个人用户的信息化建设不断升级&#xff0c;也经常会出现许多恶意软件。其中包括malox勒索病毒&#xff0c;malox勒索病毒是mallox勒索病毒新升级的加密程序&#xff0c;下面…

使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队

作者&#xff1a;京东零售 佟恩 本文介绍&#xff0c;如何使用 NutUI 组件库&#xff0c;搭建一套为专属业务风格的业务组件库。 NutUI 是一款京东风格的移动端组件库。NutUI 目前支持 Vue 和 React技术栈&#xff0c;支持Taro多端适配。 当下的实现方式 一般组件库&#xff…

Vue最新状态管理工具Pinia——彻底搞懂Pinia是什么

Pinia从了解到实际运用——彻底搞懂什么是Pinia 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现什么是piniapinia相比vuex的优势为什么要使用pinia&#xff1f;基本示例 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09; 知识专栏专栏链接Vuex知…

Nginx 静态文件、反向代理、负载均衡、缓存、SSL/TLS 加密、gzip 压缩 等等

Nginx的功能 1. 静态文件服务器2. 反向代理服务器3. 负载均衡4. 缓存5. SSL/TLS 加密6. URL 重写7. HTTP/28. WebSocket9. 反向代理缓存10. 安全限制11. gzip 压缩12. 请求限速13. 日志记录14. SSL 证书续订 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器&#xff0c;它…

ASEMI代理ADI亚德诺LTC3309AEV#TRMPBF车规级芯片

编辑-Z LTC3309AEV#TRMPBF特点&#xff1a; 与 LTC3307(3A) 和 LTC3308(4A) 引脚兼容 高效率&#xff1a;8mΩ NMOS、31mΩ PMOS 可编程频率 1MHz 至 3MHz 微型电感器和电容器 峰值电流模式控制 22ns 最短接通时间 宽带宽&#xff0c;快速瞬态响应 Silent Switcher 架…

虹科荣誉 | 虹科工业物联网产品荣获中国自动化产业年会用户信赖产品奖!

2023 虹科荣获2021年度中国自动化产业年会用户信赖产品奖 近日&#xff0c;2023中国自动化产业年会于北京隆重举行。虹科工业物联网的产品“OPC UA Tunneller软件”凭借其产品优势和市场美誉度&#xff0c;通过层层选拔&#xff0c;在本次大会中荣获2021年度用户信赖产品奖。…

【c语言】字符串计算长度 | API仿真

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …