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

详解VHDL如何编写Testbench

1.概述

仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型,它为所测试的元件提供了激励信号,可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中,也可以从外部文件中加载。

一般而言,编写 Testbench 进行测试主要有下面四个步骤

  • (1)实例化需要测试的设计(DUT,Design Under Test);
  • (2)产生模拟激励(波形);
  • (3)将产生的激励加入到被测试模块并观察其输出响应;
  • (4)将输出响应与期望进行比较,从而判断设计的正确性。

其中,输出响应可以以波形方式显示或存储测试结果到文件中。

2.Testbench程序基本结构

通常 Testbench 的基本结构包括库的调用、程序包的调用、空实体、结构体描述。在结构体描述中,一般包含有被测试元件的声明、局部信号声明、被测试元件例化、激励信号的产生,如图所示。与一般的 VHDL 程序不同的是,Testbench 里面的实体为空。
在这里插入图片描述

2.1 被测试元件的声明方式

先说一个被测实体vote7,代码如下:

library ieee;
use ieee.std_logic_1164.all;entity vote7 is port(vt      : in  std_logic_vector(6 downto 0);result  : out std_logic);
end entity vote7;architecture rtl of vote7 is
beginprocess(vt)variable sum : integer range 0 to 7;beginsum := 0;for i in 0 to 6 loopif vt(i) = '1' thensum := sum + 1;if sum > 4 thenresult <= '1';elseresult <= '0';end if;end if;end loop;end process;
end architecture;

2.1.1 组件实例化

组件实例化是一种传统且常用的方法,特别适用于较早版本的VHDL(如VHDL-93)。该方法需要在测试平台中先声明一个组件,然后在架构中进行实例化。

步骤

  • 组件声明:在测试平台的架构声明部分(通常在architecture关键词之后)声明DUT的组件。

  • 实例化:在架构的主体部分使用component实例化DUT,并进行端口映射。
    示例代码

假设有一个被测实体vote7,其声明如下:

library ieee;
use ieee.std_logic_1164.all;entity tb_vote7 is
end entity tb_vote7;architecture Behavioral of tb_vote7 is-- 信号声明……-- 组件声明component vote7port(vt      : in  std_logic_vector(6 downto 0);result  : out std_logic);end component;begin-- DUT实例化DUT: vote7port map (vt      => vt,result  => result);-- 激励过程……
end architecture Behavioral;

2.1.2 直接实体实例化

直接实体实例化(也称为架构实例化)是VHDL-2002及更高版本中引入的一种更简洁的实例化方式。它不需要提前声明组件,直接引用实体和架构即可。

优点

  • 简洁:无需组件声明,减少了代码冗余。
  • 灵活:可以直接指定要使用的实体和架构。

使用与前述相同的vote7实体,测试平台采用直接实体实例化的方法如下:

library ieee;
use ieee.std_logic_1164.all;entity tb_vote7 is
end entity tb_vote7;architecture Behavioral of tb_vote7 is-- 信号声明……
begin-- DUT直接实例化DUT: entity work.vote7(rtl)port map (vt      => vt,result  => result);-- 激励过程……
end architecture Behavioral;

代码解析

  • DUT实例化:使用entity work.vote7(rtl)指定实体vote7和其架构rtl,然后进行端口映射。
  • 无需组件声明:省略了组件的预先声明,代码更加简洁。

3.激励信号的产生

激励信号产生的方式一般有两种,一种是以一定的离散时间间隔产生激励信号,另一种是基于实体的状态产生激励信号。需要注意的是,在 Testbench 程序中一定要对所有的激励信号赋初始值。下面通过实例,讲述激励信号的产生方法。

3.1 时钟信号的产生

时钟信号属于周期性出现的信号,是同步设计中最重要的信号之一。如图所示,时钟信号分为两类,即占空比为50%的对称时钟信号与占空比不是 50%的非对称时钟信号。

在这里插入图片描述
Testbench 中产生时钟信号方式有两种,

  • 一种是使用并行的信号赋值语句;
  • 一种是使用process进程。

下面分别通过两个例子来说明如何用这两种方法来产生所需的时钟信号。

【例】用并行信号赋值语句产生如图所示的 clk1clk2clk3 信号。
在这里插入图片描述
观察上图,我们发现 clk1 为对称时钟信号,其初始值可以在信号定义时赋值;clk2clk3为非对称时钟信号,其起始值可以在语句中赋值。这两种信号的产生方式有所不同,相对而言对称时钟信号的产生相对简单一些。

并行信号赋值语句的实现如下:

signal clk1:std_logic := '0';
signal clk2:std_logic;
signal clk3:std_logic;
……
clk1 <= not clk1 after clk_period/2;
clk2 <= '0' after clk_period/4 when clk2 = '1' else'1' after 3*clk_period/4 when clk2 = '0' else'1';
clk3 <= '0' after clk_period/4 when clk3 = '1' else'1' after 3*clk_period/4 when clk3 = '0' else'0';
……

【例】使用 process 进程产生如图所示的clk1clk2 信号。
在这里插入图片描述
观察上图,可以发现 clk1 为对称时钟信号,clk2 为非对称时钟信号,但这两种信号用 process 进程实现的方法基本一致。

process 进程实现如下:

signal clk1:std_logic;
signal clk2:std_logic;
……
clk1_gen:processconstant clk_period	:time	:= 40ns;--常量只在该进程中起作用beginclk1 <= '1';wait for clk_period/2;clk1 <= '0';wait for clk_period/2;end process;
clk2_gen:processconstant clk_period	:time	:= 20ns; --常量只在该进程中起作用beginclk2 <= '0';wait for clk_period/4;clk2 <= '1';wait for 3*clk_period/4;end process;
……	

3.2 复位信号的产生

Testbench中产生复位信号方式也是两种,一种是并行赋值语句实现,另一种是在进程中设定。下面用例加以说明。

【例 7-5】如图所示,请用并行信号赋值语句产生的reset1信号,用 process 进程产生reset2信号。
在这里插入图片描述
程序如下:

……
signal reset1:std_logic;
signal reset2:std_logic;
……
-- 并行信号赋值语句产生的reset1信号
reset1 <= '0','1' after 20 ns,'0' after 40ns;--用process进程产生reset2信号
reset2_gen:processbeginreset2  <= '0';wait for 20 ns;reset2 <= '1';wait for 40 ns;reset2 <= '0';wait;
end process;
……

3.3 使用delayed属性产生两相关性信号

delayed是VHDL的预定义属性,使用它可以产生两个相关性的信号。如果已经产生了一个时钟信号,在这个时钟信号的基础上,可以使用delayed来使已经产生的时钟信号延迟一点的时间,从而获得另一个时钟信号。

假设已经使用如下的语句定义了一个时钟信号W_CLK:

W_CLK<= '1' after 30 ns when W_CLK= '0' else'0' after 20 ns;

然后可以使用如下的延迟语句获得一个新的时钟信号DLY_W_CLK,它比W_CLK延迟了10 ns:

DLY_W_CLK <= W_CLK' delayed(10 ns);

以上两个时钟信号波形如图所示:

在这里插入图片描述
【例 】 如图所示,请编程实现信号 periodl,period2,要求用到 DELAYED 属性。

在这里插入图片描述
程序如下:

signal period1,period2:std_logic;
……
period1 <= '1' after 30 ns when period1 = '0' else'0' after 20 ns when period1 = '1' else'0';--利用delayed属性,由period1产生period2
period2 <= period1' delayed(10 ns);

3.4 一般激励信号

一般的激励信号通常在 process 进程中定义,而在 process 进程中一般需要使用 wait 语句。所定义的普通的激励信号常用来作模型的输入信号。

【例】 如图 7-18 所示,请编程产生信号 test vectorl 和 test vector2。
在这里插入图片描述
程序如下:

signal test_vector1:std_vector_logic(1 downto 0);
signal test_vector2:std_vector_logic(1 downto 0);
……
TB1:process
begintest_vector1 <= "01";wait for 10 ns;test_vector2 <= "10";wait for 20 ns;
end process;TB2:process
begintest_vector2 <= "01";wait for 10 ns;test_vector2 <= "10";wait;
end process;

【例 】 输入信号 test_abtest_sel 均为 2bit,试用 VHDL 产生这两个输入信号以覆盖所有的输入情况。输入信号向量 test_abtest_sel 均为 2bit,产生的输入情况共有(2x2)x(2x2)=16 种可能。

实现的程序如下

signal test_ab : std_logic_vector(1 downto 0);
signal test_sel:std_logic_vector(1 downto 0);double_loop:process
begintest_ab <= "00";test_sel <= "00";for i in 0 to 3 loopfor j in 0 to 3 loopwait for 10 ns;test_ab <= test_ab + 1;end loop;test_sel <= test_sel + 1;end loop;
end process;

程序对应的波形如图所示:
在这里插入图片描述

特别注意:如果同一个信号在两个进程中进行赋值,若在某些时间段内发生了冲突,就会出现不定状态,如下例所示。因此同一信号不允许在不同进程中赋值。

【例】同一个信号在两个进程中进行赋值,在某些时问段内发生了冲突,出现不定状态的情况。

程序如下:

……
signal test_vector:std_logic_vector(2 downto 0);
signal reset:std_logic;
……
gen_1:process
beginreset <= '1';wait for 100 ns;reset <= '0';test_vector <= "000";wait;
end process;gen_2:process
beginwait for 200 ns;test_vector <= "001";wait for 200 ns;test_vector <= "011";
end process;
……

对应的波形如图所示:

在这里插入图片描述

3.5 动态激励信号

动态激励信号,就是输入激励信号与被仿真的实体(DUT)的行为模型相关,即 DUT 的输入激励信号受模型的行为所影响。

如下信号的定义,模型的输入信号 sig_A 就和模型输出信号 count 相关。

process(count)
begincase count iswhen 2 =>sig_A <= '1' after 10 ns;when others =>sig_A <= '0' after 10 ns;end case;
end process;

3.6 测试矢量

在实际应用中,常常将一组固定的输入输出矢量值存储在一个常量表或一个 ASCI 文件中,然后将这些值应用到输入信号从而产生激励信号。这里所说的固定输入输出矢量值就称为测试矢量。矢量的值序列可以使用多维数组或使用多列记录来描述。

如下面的数据表存储了输入矢量:

constant no_of_bits:integer := 4;
constant no_of_vectors:integer := 5;
type table_type is array (1 to no_of_bits) of std_logic_vector(1 to no_of_vectors);
constant input_vectors:table_type := ("1001","1000","0010","0000","0110");signal inputs:std_logic_vector(1 to no_of_vectors);
signal A,B,C:std_logic;
signal D:std_logic_vector(0 to 1);

假设所测试的实体(DUT)具有4个输入:A、B、C和D信号,如果以一般的时间间隔应用测试矢量,则可以使用一个generate语句,例如

G1:for j in 1 to no_of_vectors generateinputs <= input_vectors(j) after (vector_period*j);
end generate;A <= inputs(1);B <= inputs(4);C <= inputs(1);D <= inputs(2 to 3);

如果将信号应用于任意时间间隔,则需要使用并行的信号赋值语句产生多个信号的波形,使用这种方法可以将一个矢量赋值给多个信号,如下面的代码:

inputs <= input_vector(1) after 10 ns;input_vector(2) after 25 ns;input_vector(3) after 30 ns;input_vector(4) after 32 ns;input_vector(5) after 40 ns;

4.高级Testbench编写

高级Testbench 是在简单 Testbench 基础上改进的,能够自动读入测试矢量文件、完成输出值和期望值的比较等功能,如图所示。相比简单Testbench,高级 Testbench 更显得智能化,也减少了人工分析的烦琐工作。

在这里插入图片描述

4.1 文件I/O的读写

仿真时,VHDL 允许设计人员从文件加载数据或将数据存储到文件中。比如用户定义的测试矢量可以保存在文件中,然后在仿真时从文件中读取这些测试矢量。另外,仿真的结果也可以保存在文件中。

VHDL 标准中的文件 I/O 主要是由 TEXTIO 程序包提供的,用于仿真且综合工具不能综合标准库 STD 中的 TEXTIO 定义的程序包只能使用 BIT 和 BIT_VECTOR 数据类型,其引用的格式为:

library std;
use std.textio.all;

如果要使用std_logicstd_logic_vector,则需要调用std_logic_textio,格式为:

library ieee;
use ieee.std_logic_textio.all;

4.1.1 TEXTIO介绍

TEXTIO 是 VHDL 标准库 STD 中的一个程序包(package)。在该包中定义了三个基本类型:LINE 类型、TEXT 类型以及 SIDE 类型。另外,还有一个子类型(subtype)WIDTH。此外,在该程序包中还定义了一些访问文件所必须的过程(procedure),如图所示。

在这里插入图片描述
其中,TEXT为ASCII文件类型。定义成TEXT类型的文件是长度可变的ASCII文件,需要注意的是VHDL’87 和 VHDL’93 在使用文件方面由较大的差异,在编译时注意选择对应的标准。

side只能有两种状态,即rightleft,分别表示将数据从左边还是从右边写入行变量。该类型主要是在TEXTIO程序包包含的过程中使用。

WIDTH为自然数的子类型。所谓子类型表示其取值范围是父类型范围的子集。

TEXTIO 也提供了基本的用于访问文本文件的过程。类似于 C++,VHDL 提供了重载功能,即完成相近功能的不同过程可以有相同的过程名,但其参数列表不同,或参数类型不同或参数个数不同。

TEXTIO 提供的基本过程有:

1.procedure READLINE(文件变量;行变量);

用于从指定文件读取一行数据到行变量中。

2.procedure WRITELINE(文件变量:行变量):

用于向指定文件写入行变量所包含的数据。

3.procedure READ(…);

可重载,用于从行变量中读取相应数据类型的数据。

4.procedure WRITE(…);

可重载,用于将数据写入行变量

4.1.2 文件基本操作

1.定义文件

TEXTIO 程序包中可操作的文件主要包含两大类:integertext

integer 文件中的数据是以二进制存取的,不能被人识别,只有 integer 型的数据能够存入这类文件。

text 文件是可以读取的 ASCI 码,可以被人识别。integer 、bit vector(x downto x)、string(x downto 1)、std logic_vector(x downto 0)及 bit 等类型都可以被存入此类文件。

对文件进行操作之前,需要对将要进行操作的文件进行定义,在 93 版的 VHDL 中,文件定义的方式如下:

FIE file handle: text open read mode is"目录十文件.后缀"---(输入文件的说明)
FIE file handle: text open write mode is"目录十文件.后缀"---(输出文件的说明)

在 87 版的 VHDL 中,文件定义的方式:

FIEL file handle: text is in"目录十文件.后缀"---(输入文件的说明)
FIEL file handle: text is out"目录十文件.后缀"---(输出文件的说明)

如果在支持 93 版的 VHDL 语言中使用了 87 版的格式,仿真时会提示:

warning: FIE declaration was written using 1076-1987 syntax.

2.打开文件

定义文件句柄后就可以在程序中打开指定文件,同时指定打开模式。93 版的 VHDL 可以使用 file open()进行文件打开操作,其中文件打开操作的函数使用方法如下:

file_open(fstatus,file_handle,filename)

其中,fstatus指示当前文件状态,但是在使用前首先得定义:

variable fatatus:file_open_status;

状态一般有四种,即open_ok,status_error,name_error,mode_error

file handle 即是上一步定义的文件句柄file handle

filename 是以双引号括起的文件名,如"datain.txt",也可以加上文件路径。openmode 是指打开该文件的模式,文件打开有read_mode,write mode,append_mode 三种。

3.读写文件

打开文件后就可以对文件进行读写操作,其语句格式如下:

--将文件中的一行数据读至行变量中。
realine(文件变量,行变量);--行变量中保存的数据取n位放至数据变量v中,n为数据变量v的数据位数。在此之前,需要定义好行变量和数据变量。
read(行变量,数据变量);--将一个数据写到某一行中。
write(行变量,数据变量);--起始位置为left 或 righ,字符数则表示数据变量写入到行变量后占的位宽。
write(行变量,数据变量,起始位置,字符数);--将行变量包含的数据写入到指定文件;
wwriteline(文件变量,行变量);

4.关闭文件

在文件读写完毕后,需使用 file)close(file handle)关闭文件。

如果想判断在文件操作中是否读取到文件的末尾,可以使用函数endfile(file_handle)进行判断,如果到达文件末尾将返回“真(true)”,否则返回“假(false)”。

下面举一个例子,使用了上面介绍的各种语法。

【例】文件I/O读写例程

library ieee;
library std;use std.textio.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity testin is
end entity testin;architecture rtl of testin is
beginprocess-- 定义text类型得文件句柄file file_out1,file_in:text; -- 定义文件状态指示变量variable fstatus1,fstatus2:file_open_status;variable count:integer := 5;variable stringdata:string(5 downto 1) := "SCUTE"; --string型variable vectordata:bit_vector(5 downto 0) := "001000";variable value:std_logic_vector(3 downto 0) := "1111";variable buf,buf1:line;begin--创建并打开文件file_open(fstatus1,file_out1,"DATAIN.TXT",write_mode);write(file_out1,string'("THE FIRST PAPAMETER IS ="));readline(input,buf);write(buf,count);writeline(file_out1,buf);wait for 20 ns;write(buf,string'(THE SECOND PAPAMETER IS = "));write(buf,value);writeline(file_out1,buf);wait for 20 ns;write(buf,string'("THE THIRD PAPAMETER IS = "));write(buf,vectordata);writeline(file_out1,buf);wait for 20 ns;write(buf,string'("THE FORTH PAPAMETER IS = "));write(buf,stringdata);writeline(file_out1,buf);write(file_out1,string'("END OF FILE"));file_close(file_out1);wait for 100 ns;file_open(fstatus1,file_out1,"DATAIN.TXT",read_mode);readline(file_out1,buf);writeline(output,buf);file_close(file_out1);wait for 100 ns;file_open(fstatus1,file_in,"STD_INPUT",read_mode);file_open(fstatus2,file_out1,"STD_OUTPUT",write_mode);readline(file_in,buf);writeline(file_out1,buf);wait;end process;
end rtl;

在modelsim中运行,控制台将做如下操作:

在这里插入图片描述
等待数秒后,在modelsim工程目录下将会新建一个“DATAIN.TXT”文本文档,打开文档其内容如图所示:

在这里插入图片描述

4.2 断言语句

断言语句(Assert)语句可以在仿真的过程中,检查一个条件并报告信息,一般用于程序调试与时序仿真时的人机对话,也是不可综合的语句。

断言语句的书写格式为:

assert<条件表达式>report<出错信息>severity<错误级别>;

其中,ASSERT 后的条件表达式为布尔表达式,用于模拟执行时的真假判断。若其值为“真”则跳过下面两个子句,继续执行后面的语句;若其值为“假”,则表示出错,于是执行 REPORT报告出错信息,同时由 SEVERITY 子句给出错误等级。

ASSERT 后的条件表达式由设计人员自行拟定,没有默认格式。断言语句里面的出错信息与错误等级也都由设计者自行设计,VHDL不自动生成这些信息。而且,REPORT 后的出错信息必须是字符串,需要用双括号括起来,若缺省出错信息,则系统默认输出错误信息报告为"Assertion Violation"。SEVERITY 后的错误级别要求是预定义的四种错误之一, 预定义的四种错误类型分别是:Note(通报)、Warning(警告)、Error(错误)、Failure(失败)。若缺省,则默认为 Error。

4.2.1 断言语句的使用方法

断言语句可以在实体、结构体以及进程中使用。下面通过一个例子初步介绍断言语句在仿真时的应用。

【例】用断言语句判断仿真的时间,如果当前时间为1000ns,则仿真完成,使用 ERROR严重级别终止仿真过程。

程序如下:

process
begin
assert(now <= 1000 ns)report "simulation completed successfully"severity error;
end process;

断言语句判断条件的判断结果为 FALSE,则执行后面的报告及严重级语句,否则跳过这些错误报告语句并继续执行。

放在进程内的断言语句叫顺序断言语句,它在进程内按照顺序执行。放在进程外部的断言语句叫并行断言语句。并行断言语句本质上等同于一个进程,该进程只对条件表达式给出的所有信号敏感。

如果把断言语句单独放在一个进程里面,则该进程称为断言进程。断言进程只能放在结构体里面,且不对任何信号进行赋值操作。下例就是一个断言进程语句。

【例】 使用 ASSERT 语句设定一个判断条件,以便对仿真的某个结果或值做出响应

……
process(q)
begin
assert(q /= "1001")report "the shifter gets the result!"severity error;
end process;

在上面的程序中,如果信号q等于“1001”,则终止仿真,并输出 The shifter gets the result!。

4.2.2 断言语句的应用实例

下面以一个简单的实例来讲述使用断言语句来响应一个仿真的过程。

【例】 4位加减计数器的仿真。所述4位加减计数器的位数为4位,且带有 CLR 清零端。当 DIR 信号为高电平时,计数器为加1计数器;当 DIR 信号为低电平时,为减1计数器。

4 位加减计数器的设计程序如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity counter is port(clk,clr,dir:in	std_logic;result	   :out	std_logic_vector(3 downto 0));
end entity counter;architecture rtl of counter is
signal tmp:std_logic_vector(3 downto 0);
begin
process(clk,clr)
beginif(clr = '1') thentmp <= "0000";elsif(clk' event and clk = '1') thenif(dir = '1') thentmp <= tmp + 1;elsetmp <= tmp - 1;end if;end if;
end process;result <= tmp;end rtl;

4位加减计数器的仿真程序如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned;entity tb_counter is
end entity tb_counter;atchitecture rtl of tb_counter issignal clk      :std_logic := '0';
signal clr		:std_logic := '0';
signal dir		:std_logic := '0';
signa result 	:std_logic_vector(3 downto 0);
constant clk_period:time := 40 ns;beginuut:entity work.counter(rtl)port map(clk => clk,clr => clr,dir => dir,result => result);clk_gen:process
beginclk <= '0';wait for clk_period/2;clk <= '1';wait for clk_period/2;
end process;TB:process
beginclr <= '1';dir <= '1';wait for 20 ns;clr <= '0';wait for 280 ns;dir <= '0';wait for 320 ns;wait;
end process;process(result)
beginassert(result /= "1001")report "THe counter gets to nine!"severity error;
end process;
end rtl;

仿真波形如下图所示:
在这里插入图片描述

当计数到“1001”时,在信息栏输出

在这里插入图片描述

相关文章:

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型&#xff0c;它为所测试的元件提供了激励信号&#xff0c;可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中&#xff0c;也可以从…...

Kafka为什么要放弃Zookeeper

1.Kafka简介 Apache Kafka最早是由Linkedin公司开发&#xff0c;后来捐献给了Apack基金会。 Kafka被官方定义为分布式流式处理平台&#xff0c;因为具备高吞吐、可持久化、可水平扩展等特性而被广泛使用。目前Kafka具体如下功能&#xff1a; 消息队列,Kafka具有系统解耦、流…...

python 渗透开发工具之SQLMapApi Server不同IP服务启动方式处理 解决方案SqlMapApiServer外网不能访问的情况

目录 说在前面 什么是 SQLMapAPI 说明 sqlmapApi能干什么 sqlmapApi 服务安装相关 kali-sqlmap存放位置 正常启动sqlmap-api server SqlMapApi-Server 解决外网不能访问情况 说在前面 什么是sqlmap 这个在前面已经说过了&#xff0c;如果这个不知道&#xff0c;就可以…...

go语言的成神之路-筑基篇-gin常用功能

第一节-gin参数绑定 目录 第一节-?gin参数绑定 ShouldBind简要概述 功能&#xff1a; 使用场景&#xff1a; 可能的错误&#xff1a; 实例代码 效果展示 第二节-gin文件上传 选择要上传的文件 选择要上传的文件。 效果展示? 代码部分 第三节-gin请求重定向 第…...

K8S中,pod的创建流程

kubelet创建pod流程 流程图 OCI&#xff08;Open Container Initiative&#xff09;是一个由docker社区发起的项目&#xff0c;Docker、containerd CNI&#xff08;Container Network Interface&#xff09;网络配置&#xff1a;为容器分配IP地址、配置网络接口、设置路由 C…...

Windows系统提示synsoacc.dll文件报错要怎么解决?

一、文件丢失问题&#xff1a;深度剖析与应对策略 文件丢失是电脑运行时常见的问题之一。它可能由多种原因引起&#xff0c;如硬盘故障、病毒攻击、不当的文件操作等。当Windows系统提示synsoacc.dll丢失时&#xff0c;通常意味着该文件对于当前正在运行的程序或系统服务至关重…...

【从0带做】基于Springboot3+Vue3的高校食堂点餐系统

大家好&#xff0c;我是武哥&#xff0c;最近给大家手撸了一个基于SpringBoot3Vue3的高校食堂点餐系统&#xff0c;可用于毕业设计、课程设计、练手学习&#xff0c;系统全部原创&#xff0c;如有遇到网上抄袭站长的&#xff0c;欢迎联系博主~ 项目演示视频和教程视频 https:…...

C语言-基因序列转换独热码(one-hot code)

1.题目要求 (语言: C)在生物信息学家处理基因序列时&#xff0c;经常需要将基因序列转化为独热码&#xff0c;在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特&#xff0c;而且只有一个比特为1&#xff0c;其他全为0的一种码制。 如基因序列有四种状态&…...

git在idea中操作频繁出现让输入token或用户密码,可以使用凭证助手(使用git命令时输入的用户密码即可) use credential helper

1、打开 idea 设置&#xff0c;找到 git 路径 File | Settings | Version Control | Git 2、勾选 Use credential helper 即可...

《机器视觉:开启智能新时代》

《机器视觉&#xff1a;开启智能新时代》 一、机器视觉&#xff1a;工业之眼的崛起二、核心组件&#xff1a;构建精准视觉系统&#xff08;一&#xff09;光源&#xff1a;照亮视界的画笔&#xff08;二&#xff09;镜头&#xff1a;聚焦精准的慧眼&#xff08;三&#xff09;相…...

C#冒泡排序

一、冒泡排序基本原理 冒泡排序是一种简单的排序算法。它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。 以一个简单的整数数…...

计算机网络习题(第1章 概论 第2章 数据通信基础)

第1章 概论 1、计算机网络 2、互联网 3、计算机网络体系结构 分层模型 OSI/RM 7层模型 TCP/IP 5层模型 协议、PDU、SDU、SAP等术语 数据封装&#xff08;计算&#xff09; 第2章 数据通信基础 1、数据通信系统组成 2、主要性能指标 数据传输速率 码元速率 时延 3…...

从0入门自主空中机器人-4-【PX4与Gazebo入门】

前言: 从上一篇的文章 从0入门自主空中机器人-3-【环境与常用软件安装】 | MGodmonkeyの世界 中我们的机载电脑已经安装了系统和常用的软件&#xff0c;这一篇文章中我们入门一下无人机常用的开源飞控PX4&#xff0c;以及ROS中无人机的仿真 1. PX4的安装 1.1 PX4固件代码的下载…...

百度热力图数据日期如何选择

目录 1、看日历2、看天气 根据研究内容定&#xff0c;一般如果研究城市活力的话&#xff0c;通常会写“非重大节假日&#xff0c;非重大活动&#xff0c;非极端天气等”。南方晴天不多&#xff0c;有小雨或者中雨都可认为没有影响&#xff0c;要不然在南方很难找到完全一周没有…...

深入理解 ElasticSearch 索引与检索原理

在当今数字化浪潮中&#xff0c;数据呈爆炸式增长&#xff0c;如何高效地从海量信息里找到所需内容成为关键。ElasticSearch 凭借其卓越的索引和检索能力脱颖而出&#xff0c;成为众多企业与开发者的得力工具。接下来&#xff0c;让我们深入剖析它的索引和检索工作原理。 一、…...

汽车CAN通信逻辑与LabVIEW开发

CAN通信的核心概念 CAN&#xff08;Controller Area Network&#xff09;是一种多主通信协议&#xff0c;广泛应用于汽车电子系统中&#xff0c;用于控制单元之间的高效通信。 ​ 消息优先级&#xff1a;每个CAN帧包含唯一的标识符&#xff08;ID&#xff09;&#xff0c;ID的…...

OWASP~SQL注入

文章只做学习知识&#xff0c;禁止违法。 一、简介 SQL注入是一种Web应用代码中的漏洞。在工作中渗透测试工作时&#xff0c;使用工具扫描、手工注入和绕过WAF注入等找注入点&#xff0c;其中一层不变的构造特殊请求&#xff0c;使其与数据库SQL语句进行闭合。测试完成闭合时会…...

大数据-261 实时数仓 - 业务数据库表结构 交易订单、订单产品、产品分类、商家店铺、地域组织表

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; H…...

大厂开发规范-如何规范的提交Git

多人协作开发提交代码通常是遵循约定式提交规范&#xff0c;如果严格安照约定式提交规范&#xff0c; 手动进行代码提交的话&#xff0c;那么是一件非常痛苦的事情&#xff0c;但是 Git 提交规范的处理又势在必行&#xff0c;那么怎么办呢&#xff1f; 经过了很多人的冥思苦想…...

深度学习中batch_size

Batch size调整和epoch/iteration的关系 训练数据集总共有1000个样本。若batch_size10&#xff0c;那么训练完全体样本集需要100次迭代&#xff0c;1次epoch。 训练样本10000条&#xff0c;batchsize设置为20&#xff0c;将所有的训练样本在同一个模型中训练5遍&#xff0c;则…...

SpringBoot的pom.xml文件中,scope标签有几种配置?

1.compile&#xff08;默认&#xff09; 含义&#xff1a;表示该依赖在项目的所有阶段&#xff08;编译、测试、运行&#xff09;都需要。 当你依赖一个库&#xff0c;并且这个库是你项目的核心部分&#xff0c;比如 Spring Boot 的spring - boot - starter - web&#xff0c…...

科技快讯 | 水滴筹成为民政部指定个人求助网络服务平台;小米超级小爱首次向正式版用户开放;腾讯发布全球首个重症医疗大模型

本地 AI 开发利器&#xff0c;初探微软 Win11 AI Dev Gallery 功能 12月27日&#xff0c;科技媒体Windows Latest报道&#xff0c;微软推出AI Dev Gallery功能&#xff0c;助力开发者集成端侧AI。该功能支持Windows 10/11&#xff0c;提供25个示例模型&#xff0c;涵盖多领域。…...

在 Windows 上,如果忘记了 MySQL 密码 重置密码

在 Windows 上&#xff0c;如果忘记了 MySQL 密码&#xff0c;可以通过以下方法重置密码&#xff1a; 方法 1&#xff1a;以跳过权限验证模式启动 MySQL 并重置密码 停止 MySQL 服务&#xff1a; 打开 命令提示符 或 PowerShell&#xff0c;输入以下命令停止 MySQL 服务&#…...

Linux下载RabbitMQ,并解决Github拒绝访问443的问题

RabbitMQ Linux下载资源时&#xff0c;GitHub网站 443 拒绝访问 例如无法直接使用下面命令 rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc在Linux中无法访问Github(外网)资源的都可以采用以下类似的方式 首…...

攻防世界web新手第五题supersqli

这是题目&#xff0c;题目看起来像是sql注入的题&#xff0c;先试一下最常规的&#xff0c;输入1&#xff0c;回显正常 输入1‘&#xff0c;显示错误 尝试加上注释符号#或者–或者%23&#xff08;注释掉后面语句&#xff0c;使1后面的单引号与前面的单引号成功匹配就不会报错…...

什么是ondelete cascade以及使用sqlite演示ondelete cascade使用案例

什么是ondelete cascade ‌ON DELETE CASCADE是数据库中的一种约束&#xff0c;用于自动删除相关的记录‌。具体来说&#xff0c;当一个表中的记录&#xff08;父表&#xff09;被删除时&#xff0c;与其相关的其他表&#xff08;子表&#xff09;中的记录也会被自动删除&…...

Wordperss漏洞 DeDeCMS漏洞

Wordperss漏洞 环境搭建 #执⾏命令 cd /vulhub/wordpress/pwnscriptum docker-compose up -d #靶场地址 http://8.155.7.173:8080/wp-admin/ 注册账号 登录 漏洞一&#xff1a;后台修改模板拿WebShell 步骤一&#xff1a;思路是修改其WP的模板写入⼀句话木马后门并访问其文件…...

人才公寓系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...

SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明

前言&#xff1a;现在项目普遍使用的数据库都是MySQL&#xff0c;而有些项目实际上使用SQLite既足矣。在一些特定的项目中&#xff0c;要比MySQL更适用。 这一篇文章简单的介绍一下SQLite&#xff0c;对比MySQL的优缺点、以及适用的项目类型和集成SpringBoot。 1. SQLite 简介 …...

sqlserver镜像设置

本案例是双机热备&#xff0c;只设置主体服务器&#xff08;主&#xff09;和镜像服务器&#xff08;从&#xff09;&#xff0c;不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC &#xff08;1&#xff09;打开SQL Server配置管理器…...

Chapter 03 复合数据类型-1

1.列表 Python内置的一种有序、可变的序列数据类型&#xff1b; 列表的定义&#xff1a; [ ]括起来的逗号分隔的多个元素组成的序列 列表对象的创建&#xff1a; &#xff08;1&#xff09;直接赋值 >>> list1 []#创建一个空列表赋值给list1 >>> list…...

goview——vue3+vite——数据大屏配置系统

低代码数据大屏配置系统&#xff1a; 数据来源是可以动态api配置的&#xff1a; 配置上面的api接口后&#xff0c;在数据过滤中进行数据格式的转化。 以上内容&#xff0c;来源于https://gitee.com/dromara/go-view/tree/master-fetch/ 后端代码如下&#xff0c;需要更改…...

Linux Shell : Process Substitution

注&#xff1a;本文为 “Process Substitution” 相关文章合辑。 英文引文机翻&#xff0c;未校。 Process Substitution. 进程替换允许使用文件名引用进程的输入或输出。它采取以下形式 <(list)or >(list)进程 list 异步运行&#xff0c;其输入或输出显示为文件名。…...

html转PDF

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中会有一些需要页面转成PDF的情况&#xff0c;这里需要配合一些插件可以完成 使用html2canvas将使用canvas将页面转为base64图片流&#xff0c;并插入jspdf插件中&#xff0c;保存并下载pdf。…...

React 之 Redux =》 理解+应用

文章目录 Redux基础介绍一、概述二、元素组成1. Action&#xff08;动作&#xff09;2. Reducer&#xff08;纯函数&#xff09;3. Store&#xff08;仓库&#xff09; 三、原理结构四、场景应用1. 大型复杂的单页应用&#xff08;SPA&#xff09;2. 多用户协作的应用3. 数据持…...

生成excel文件(有备注和表头的情况)

要使用 Java 导出 Excel 文件&#xff0c;并且通过 ExcelProperty 注解进行列的映射&#xff0c;可以利用 EasyExcel 库。EasyExcel 是阿里巴巴开源的一款高性能 Excel 读写工具&#xff0c;它支持通过注解将类与 Excel 的列进行映射&#xff0c;简化了 Excel 操作的复杂性。 …...

Docker 安装全攻略:从入门到上手

Docker 安装全攻略&#xff1a;从入门到上手 在当今的软件开发与部署领域&#xff0c;Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器&#xff0c;极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…...

@Scheduled注解的使用-SpringBoot-Springtask

Scheduled 注解是 Spring 框架中用于定时任务调度的核心注解之一。通过 Scheduled 注解&#xff0c;开发者可以非常方便地在 Spring 应用程序中定义和配置各种定时任务&#xff0c;包括固定速率执行、固定延迟执行、cron 表达式执行等。本文将详细讲解 Scheduled 注解的各个方面…...

Elasticsearch:使用 Ollama 和 Go 开发 RAG 应用程序

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 Ollama 通过 Go 创建 RAG 应用程序来利用本地模型。 关于各种开放模型&#xff0c;有很多话要说。其中一些被称为 Mixtral 系列&#xff0c;各种规模都有&#xff0c;而一种可能不太为人所知的是 openbiollm&#xff0c;这…...

Linux 下 Mamba 环境安装踩坑问题汇总(重置版)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …...

(免费送源码)计算机毕业设计原创定制:Java+springboot+MySQL springboot 线上线下一体化的宠物交易

摘 要 网络发布信息有其突出的优点&#xff0c;即信息量大&#xff0c;资源丰富&#xff0c;更新速度快等&#xff0c;很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个线上线下一体化的宠物交易&#xff0c;为商家提供一个信息发布的平台&#xff0…...

【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例&#xff1a; m…...

自动生成关于软件程序开发的100个文件并可提供下载入口

创建一个包含100个关于软件程序开发的文件并提供下载入口是一个庞大的任务&#xff0c;因为这需要编写大量的代码、文档和示例。不过&#xff0c;我可以提供一个大致的框架和指导&#xff0c;帮助你生成这些文件&#xff0c;并说明如何设置下载入口。 文件生成思路 编程语言文…...

Linux下基本指令

一、什么是指令 指令本质是可执行程序&#xff0c;在执行指令前&#xff0c;先在系统中查找对应的指令。在Linux系统中指令存在于/usr/bin/路径下 二、ls 指令 1、语法 ls [选项][目录或文件] 2、功能 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。 对于文…...

2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。

文章目录 sklearn学习(20) 无监督学习-双聚类1 Spectral Co-Clustering1.1 数学公式 2 Spectral Biclustering2.1 数学表示 3 Biclustering 评价 sklearn学习(20) 无监督学习-双聚类 文章参考网站&#xff1a; https://sklearn.apachecn.org/ 和 https://scikit-learn.org/sta…...

编程考古-传奇的开始Delphi(下)含所有版本.iso

概览 Delphi 的最新版本&#xff0c;即 Delphi 12&#xff0c;勾勒出了自公司创立以来的一条进化之路。该平台不断通过提升开发者生产力、扩展其支持的平台范围以及引入前沿技术来实现自我完善。作为 Embarcadero 提供的主要快速应用开发&#xff08;RAD&#xff09;环境&…...

集合stream

1.Collection集合 1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构【理解】…...

Xshell 和 Xftp 更新提示问题的解决方法及分析

Xshell 和 Xftp 更新提示问题的解决方法及分析 在个人使用 Xshell 和 Xftp 的过程中&#xff0c;通过官网注册使用一段时间后&#xff0c;往往会遇到这样的问题&#xff1a;软件提示“要继续使用此程序&#xff0c;你必须应用最新的更新或使用新版本”。对于那些觉得更新比较麻…...

Docker安装MongoDB

Docker安装MongoDB 1、拉取镜像2、创建容器3、启动容器4、进入容器内部5、进入admin数据库6、添加管理员&#xff0c;其拥有管理用户和角色的权限7、进行认证8、通过admin添加普通用户 1、拉取镜像 docker pull mongo:4.0.32、创建容器 docker create --name mongodb-server …...

解锁自动化新高度,zTasker v2.0全方位提升效率

zTasker 是一款集强大功能与高效操作于一体的自动化任务管理软件&#xff0c;以其简单直观的设计和一键完成操作的特性深受用户喜爱。软件体积小巧&#xff0c;运行速度极快&#xff0c;支持超过 100 种不同的任务类型&#xff0c;并提供 30 多种定时或条件触发方式&#xff0c…...