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

简易CPU设计入门:控制总线的剩余信号(二)

项目代码下载

请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。

CSDN文章:下载本项目代码

上述链接为本项目所依据的版本。

在讲解过程中,我还时不时地发现自己在讲解与注释上的一些个错误。有时,我还会添加一点新的资料。在这里,我将动态更新的代码版本发在下面的链接中。

Gitee项目:简易CPU设计入门项目代码:

讲课的时候,我主要依据的是CSDN文章链接。然后呢,如果你为了获得我的最近更新的版本,那就请在Gitee项目链接里下载代码。

准备好了项目源代码以后,我们接着去讲解。

本节前言

在上一节,我讲解了立即数读信号。本节,我们继续来讲解控制总线中的剩余信号。

本节的代码,位于【......\cpu_me01\code\Ctrl_Center\】路径里面。主要讲解的代码,是【ctrl_center.v】。

我们来看一下控制总线的信号列表。

如果【ctrl_bus】的取值范围是【0 <= ctrl_bus < 4】,表示本次操作为寄存器写操作。
如果【ctrl_bus】的取值范围是【4 <= ctrl_bus < 8】,表示本次操作为寄存器读操作。
如果【ctrl_bus】的取值范围是【8 <= ctrl_bus < 12】,表示本次操作为内存写操作。
如果【ctrl_bus】的取值范围是【12 <= ctrl_bus < 16】,表示本次操作为内存读操作。
如果【ctrl_bus】的取值范围是【16 <= ctrl_bus < 20】,表示本次操作为立即数读操作。
如果【ctrl_bus】的取值范围是【20 <= ctrl_bus < 24】,表示本次操作为算术逻辑运算。
如果【ctrl_bus】的取值范围是【24 <= ctrl_bus < 28】,表示本次操作为更新指令指针寄存器【ip】。
如果【ctrl_bus】的取值范围是【28 <= ctrl_bus < 32】,表示本次操作为停机操作。

以上的块引用部分的内容,就是控制总线的全部信号了。我们之前讲了一部分,它们是【0 <= ctrl_bus < 20】的范围的信号。

这样一来,我们所剩下的,算术逻辑运算控制信号,更新指令指针寄存器ip的控制信号,还有指示停机的控制信号。

本节,我们要去讲解的,是算术逻辑运算控制信号。

一.    系统总线与内部寄存器

本节所要讲解的东西,主要是跟算术逻辑运算有关。我们来看一看系统总线。

图1

图1中所示的代码,位于控制中心模块的端口声明部分。它们分别是我们的仿真CPU项目中的控制总线,地址总线,数据总线,它们都属于是系统总线。

图2

在图2中,65行到67行,分别是用来对控制总线、地址总线和数据总线进行缓存的变量。为啥要进行缓存呢?因为,三大系统总线中的信号的有效期,仅有一个时钟周期,稍纵即逝。而我们又需要在不同于总线数据有效期的时间里使用它们,所以呢,我们就声明了三个变量,用来将三大总线的数据给缓存下来,以便长久使用。

在图2的 64 行,我们声明了一个 reg 类型的数组,如下面的代码块所示。

reg [15:0] inner_reg[3:0];

它的含义是,声明四个 reg 类型的向量,每一个向量都是16位的,其中最高有效位是位15,最低有效位是位0。四个向量,用数组索引来引用。四个向量的引用方法为:inner_reg[0],inner_reg[1], inner_reg[2],inner_reg[3]。

这四个向量,是我们的系统中的四个内部寄存器。注意,它们是内部寄存器,而非通用寄存器。

图2的68行申请的变量,它在代码中,用来作为访问内部寄存器的索引变量。由于,每当新指令任务到来之时,要访问的内部寄存器的索引位于控制总线【ctrl_bus】中,所以,我将这个用来访问内部寄存器的索引变量命名为【ctrl_bus_index】。

二.    ALU_flag 组节拍变量

图3

图3所示的几个变量,便是 ALU_flag 组节拍变量。从名字上可以大致猜到,【ALU_flag】是主要的变量,【ALU_flag_d1】比【ALU_flag】延后一个时钟周期,【ALU_flag_d2】比【ALU_flag_d1】延后一个时钟周期。

是否如此呢?我们来看看下图所示的代码。

图4

从图4来看,的确是说,【ALU_flag】是主要的变量,【ALU_flag_d1】比【ALU_flag】延后一个时钟周期,【ALU_flag_d2】比【ALUflag_d1】延后一个时钟周期。

三.    new_task 变量与缓存系统总线的有效数据

这个变量是我在控制中心模块里申请的一个 wire 型变量,如下图所示。

图5

关于这个变量的含义,本节,我们依然是先不去深究。我们需要了解它的基本含义。如果它为1,就代表了一个新的微指令的开始,或者是代表了一个新的微操作的开始。

当 new_task 为1的时候,三大系统总线均含有有效数据。三大总线中的数据与 new_task 一样,有效数据的存在时间只有一个时钟周期。

对于 new_task 变量,它的值我们不需要保存。而对于三大系统总线的有效数据,我们是需要将其保存下来的,因为,它们正好处于有效期的时候,我们可能暂时用不到,但是 后面会有用,所以,我们需要将其缓存下来。

图6

在图6里面,我们可以看到三大系统总线缓存变量与内部寄存器索引变量【ctrl_bus_index】的逻辑。

在系统复位时,三大系统总线缓存变量与内部寄存器索引变量【ctrl_bus_index】均被非阻塞赋值为高阻态值。在平时,先来无事时,也就是在【else】分支里面,它们都保存着各自的现有值不变。

每当 new_task 为1时,也就是,每当开启了一个新的微指令的时候,三大系统总线缓存变量会缓存各自对应的系统总线的有效数据。同时呢,内部寄存器索引变量【ctrl_bus_index】会将控制总线【ctrl_bus】的位1与位0给缓存下来。

也就是,在每一个新的微指令开启的时候,控制总线的位选信号【ctrl_bus[1:0]】指定了本次的微指令需要访问的内部寄存器的索引号,并且它会被缓存到变量【ctrl_bus_index】之中。

在我们的系统中,有四个内部寄存器。这样一来,由控制总线【ctrl_bus】发布过来的每一个控制信号,其实都是4个一组。原因在于,每一个控制信号都需要指定要去访问的内部寄存器。

通用寄存器读操作,需要指定要去使用的内部寄存器索引。写操作,也需要指定本次要访问的内部寄存器的索引,其他的一些个控制信号,也是如此的。

对于每一种操作,无论是通用寄存器的读写操作,还是内存读写,算术逻辑操作,它们都含有索引字段。而索引值,是控制总线的位1与位0,所以,索引字段的值的范围,是0,1,2,3。

四.    ALU_flag 组节拍变量的逻辑

 首先呢,我们来看 ALU_flag 的逻辑。

图7
always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)ALU_flag <= 1'b0;else if ((new_task == 1'b1) && (ctrl_bus >= 16'd20) && (ctrl_bus < 16'd24))ALU_flag <= 1'b1;elseALU_flag <= 1'b0;

图7中所示,是关于 ALU_flag 的逻辑。它的逻辑是,系统复位与处于【else】分支时,它都是0值。每当系统检测到【(new_task == 1'b1) && (ctrl_bus >= 16'd20) && (ctrl_bus < 16'd24)】条件满足时,则 ALU_flag 会被非阻塞赋值为 1。

 new_task 变量我们讲过了,它为1,表示开启了一个新的微指令操作,标志着新任务的开始。而当 new_task 为1时,控制总线【ctrl_bus】的值,则是表示了本次微指令的功能。

根据本节的前言部分的控制总线信号的列表信息,如果【ctrl_bus】的取值范围是【20 <= ctrl_bus < 24】,且 new_task 为 1 时,表示开启了一个新任务,这个新任务的内容,为算术逻辑操作。

想要执行算术逻辑操作,我们还需要指出,要将运算结果保存在那里。那么,这个数据在哪里呢?这个数据,目前是保存在四个内部寄存器中的某一个里面。具体保存位置的有效索引号,保存在【ctrl_bus[1:0]】之中。我们将【ctrl_bus[1:0]】赋给【ctrl_bus_index】,正是为了方便地引用这个索引号。

五.    内部总线与三个操作数

图8

图8中,16行到18行,是三大内部总线,分别为内部控制总线,内部地址总线,内部数据总线。21行,是内部成功信号总线。

在这四个内部总线里面,内部控制总线、内部地址总线和内部数据总线分别有对应的代理变量,以便可以让内部总线通过其代理变量参与时序逻辑运算。而在控制中心模块里面,内部成功信号总线没有代理变量。因而,在控制中心里面,其实控制中心模块仅仅是读取这个总线的值,而并不对其开展写入操作。

图9

图9所示,为三大内部总线的代理变量。

图10

图10中的125到127行,分别是三大内部总线与它们的代理变量的绑定代码。

以上,我算是讲解了内部总线变量及其代理变量的情况。

在算术逻辑运算中,我们还需要关注着三个操作数变量。

图10-1,控制中心模块中的操作数端口声明

图10-1所示,是控制中心模块的端口声明部分中的三个操作数变量。它们其实是对控制中心模块里面的四个内部寄存器中的前三个的绑定输出。我们看一下下面的代码。

图10-2,控制中心模块中的操作数变量的绑定输出

从10-2可以看到,操作数0对应着内部寄存器0,操作数1对应着内部寄存器1,操作数2对应着内部寄存器2。

在讲解内存读写,寄存器读写的时候,我们并未讲解操作数变量与内部寄存器变量的绑定。而在讲解算术逻辑运算的时候,我们需要讲解了。这是因为,一个算术逻辑运算,他可能会涉及不同数量的操作数。一般的算术逻辑运算,它需要两个操作数,加法需要加数和被加数,乘法需要乘数和被乘数。而有的运算类型需要的仅仅是一个操作数。也有的,需要三个操作数。为了满足这不同的类型的算术逻辑运算,我统一地设置了三个操作数,将内部寄存器中的三个予以绑定输出。

六.    内部总线的逻辑

算术逻辑操作是怎么回事?

当控制中心模块的 new_task 为1,且根据控制总线的取值范围,判断出本次的操作任务是算术逻辑运算,接下来,我们就需要通过往三大内部总线写入合适的值,来向算术逻辑单元发布指令,指示算术逻辑单元【ALU.v】来进行算术逻辑操作。

我们通过关于内部总线的代码来了解,控制中心是如何向【ALU】模块发出指令的。

图11
图12
图13
图14

根据图11和图14,在系统复位与【else】分支里面,也就是说,在系统复位与闲来无事时,控制中心模块的三大内部总线代理变量均被非阻塞赋值为高阻态值。也就是说,在系统复位与闲来无事时,控制中心模块与三大内部总线是断开连接的。

关于与总线断开连接这件事,我们说过多次了。忘了的,请大家复习下述链接所示的文章。

简易CPU设计入门:本系统中的通用寄存器(四)-CSDN博客

在上面的链接的第七分解中,我讲解了总线逻辑,也讲解了,什么叫做与总线断开连接。

然后呢,根据图12,我们看到,如果在某一个时钟的上升沿到来时,系统检测到【ALU_flag == 1】条件成立,则内部控制总线代理变量与内部地址总线代理变量被赋予0值,而内部数据总线代理变量被赋予高阻态值。也就是,相当于说,控制中心模块里面的内部控制总线变量与内部地址总线变量被赋予0值,而内部数据总线变量被赋予高阻态值。此时,控制中心里面的内部控制中心总线变量与内部地址总线变量均与同名的内部总线建立了连接,而控制中心的内部数据总线变量则是与同名的内部数据总线处于断开连接的状态。

由于控制中心模块通过三大内部总线变量【ctrl_sig_iner】,【addr_sig_iner】和【data_sig_iner】与同名的三大内部总线相连,且此时仅仅可能有控制中心模块与三大内部总线保持连接,并不存在其他模块与三大内部总线保持连接的可能。所以呢,此时控制中心模块里面的内部控制总线变量和内部地址总线变量被赋予0值,就等同于内部控制总线和内部地址总线被赋予0值。而此时,控制中心模块的内部数据总线变量被赋予高阻态z值,等同于说,控制中心模块的内部数据总线变量【data_sig_inner】与同名的内部数据总线是断开连接的。

我们再往下看。

根据图13,如果在某一个时钟的上升沿到来时,系统检测到【ALU_flag_d1 == 1】条件成立,则则三大内部总线代理变量被分别赋予各自的有效值。

我们先来看内部控制总线的情况,【ctrl_bus_represent <= 16'h0010;】。这一行的含义,如果你是一路跟着我的专栏学习过来的,那么,它对你来讲,应该是不难理解的。

图15
/*********************************************
ctrl_sig_inner[0]:register write enable:寄存器写使能
ctrl_sig_inner[1]:register read enable:寄存器读使能
ctrl_sig_inner[2]:random memory write ebable:内存写使能
ctrl_sig_inner[3]:random memory read enable:内存读使能
ctrl_sig_inner[4]:Arithmetic and Logic calculate:算术逻辑运算
ctrl_sig_inner[5]:reserve:保留
ctrl_sig_inner[6]:reserve:保留
ctrl_sig_inner[7]:reserve:保留
ctrl_sig_inner[8]:reserve:保留
ctrl_sig_inner[9]:reserve:保留
ctrl_sig_inner[10]:reserve:保留
ctrl_sig_inner[11]:reserve:保留
ctrl_sig_inner[12]:reserve:保留
ctrl_sig_inner[13]:reserve:保留
ctrl_sig_inner[14]:reserve:保留
ctrl_sig_inner[15]:reserve:保留
还有一种运算叫做读取立即数,将立即数放入内部寄存器。
此运算不需要通过内部信号的参与。
************************************************/

【ctrl_bus_represent】是【ctrl_sig_inner】的代理变量。【ctrl_bus_represent】被赋值为【16'h0010】,相当于是将【ctrl_sig_inner】总线赋值为【16'h0010】。【16'h0010】这个数,它一共是有16位,其中只有位4为1,其余都是0值。根据图15,当【ctrl_sig_inner】总线的位4为1,而其余都是0值,这表示说,控制中心模块发布了算术逻辑运算信号。

所以呢,图13里面的475行代码,它的意思就是,通过向内部控制总线写入【16'h0010】,向算术逻辑单元发布算术逻辑运算信号。

在发布算术逻辑运算信号的同时,我们需要告诉算术逻辑单元,本次要去进行算术逻辑运算的类型是什么。我们要去进行加法运算呢?还是逻辑移位运算呢?还是按位与、按位或的运算呢?图13的476行代码指示了这一点。

addr_bus_represent <= addr_bus_buf;

在当初,new_task 为 1 时,控制中心模块将三大系统总线的值都给缓存下来了。对于算术逻辑操作来讲,地址总线的有效值,代表了本次要去进行的算术逻辑运算的类型。如同一个值代表算术加法,某一个值代表着逻辑左移,等等。我们在 new_task 为 1 时,将地址总线的有效值缓存到了 addr_bus_buf 里面,而在图13中的 476 行,我们又将这个地址值通过【addr_bus_represent】传给【addr_sig_inner】总线,进而传递给算术逻辑单元【ALU】。

在算术逻辑运算的输入参数中,不需要内部地址总线的参与,因此,在图13的477行,我们为内部地址总线代理变量赋予了高阻态值。

data_bus_represent <= 16'hz;

七.    实例化算术逻辑单元与操作时序梳理

关于算术逻辑单元【ALU】的实例化代码,我们以前讲过,参考下图所示的文章链接。

简易CPU设计入门:算术逻辑单元(一)-CSDN博客

接下来,我们来梳理一下内存写操作的操作时序。

我们还是来设定一个0号时钟上升沿。

(一)0号时钟上升沿

在0号时钟上升沿,系统检测到,【new_task == 1】,并且【20 <= ctrl_bus < 24】。

于是,在0号时钟上升沿之后的非阻塞赋值阶段,根据图6,三大系统总线缓存变量将三大总线的有效值给缓存了下来。注意,当【new_task == 1】条件满足之时,三大总线上,的确是含有着有效的数据。同时,【ctrl_bus[1:0]】的值被赋给了【ctrl_bus_index】。对于算术逻辑操作来讲,算术逻辑运算的运算结果,需要被保存在某一个内部寄存器之中,而【ctrl_bus[1:0]】则是在 new_task 为1时指定了这个内部寄存器的有效索引号。当本次的算术逻辑操作完成了以后,【inner_reg[ctrl_bus_index]】里面,会保存本次算术逻辑操作的运算结果。

在0号时钟上升沿之后的非阻塞赋值阶段,根据图7,【ALU_flag】被赋值为1。

(二)1号时钟上升沿

在1号时钟上升沿,系统检测到【ALU_flag == 1】。

在【ALU_flag == 1】条件满足之时,我们要准备向算术逻辑单元【ALU】发布关于算术逻辑操作的相关信号。

在1号时钟上升沿的非阻塞赋值阶段,根据图12,我们通过对三大内部总线信号的代理变量的非阻塞赋值,向三大内部总线传递0值或高阻态值。

在1号时钟上升沿的非阻塞赋值阶段,根据图4,【ALU_flag_d1】会被非阻塞赋值为1。

(三)2号时钟上升沿

在2号时钟上升沿,系统检测到【ALU_flag_d1 == 1】。

在【ALU_flag_d1 == 1】条件满足之时,我们要正式向算术逻辑单元【ALU】发布关于内存写操作的相关信号。

在2号时钟上升沿的非阻塞赋值阶段,根据图13,我们通过对三大内部总线的代理变量的非阻塞赋值,分别向三大内部总线传递各自的信号,以开展算术逻辑操作方面的工作。

通过【ctrl_bus_represent <= 16'h0010;】,我们向内部控制信号总线写入了一个只有位4为1,而其余位均为0的值。写入这个值,就表示说,控制中心在向算术逻辑单元发布算术逻辑运算信号。

通过【addr_bus_represent <= addr_bus_buf;】,我们向内部地址信号总线写入有效的算术逻辑运算类型值,它是我们本次要去进行的算术逻辑运算的类型。早在0号上升沿的非阻塞赋值阶段,我们将地址总线【addr_bus】里面的地址值,存入了【addr_bus_buf】之中。由此,【addr_bus_buf】中就保存了本次的算术逻辑操作的运算类型值。而在此时,在2号时钟上升沿的非阻塞赋值阶段,我们要将【addr_bus_buf】里面保存的算术逻辑运算类型值,写入内部地址总线【addr_sig_inner】之中。

通过【data_bus_represent <= 16'hz;】,我们将控制中心模块的内部数据总线代理变量【data_bus_represent】所对应的,控制中心模块的内部总线变量【data_sig_inner】,设置为与同名的内部总线【data_sig_inner】保持在断开连接的状态。

(四)3号时钟上升沿

在这一时钟上升沿,系统会检测到。【ALU_flag】和【ALU_flag_d1】均为0值。在这一上升沿之后的非阻塞赋值阶段,三大内部信号总线的代理变量均被赋予了高阻态z值,因此,控制中心模块的三大内部信号总线变量也都会被赋值为高阻态z值,因此,控制中心模块会与同名的【ctrl_sig_inner】总线、【addr_sig_inner】总线和【data_sig_inner】总线断开连接。此时,三大总线没有与之连接的线路,因此,也都处于高阻态状态。

从本时钟上升沿开始,系统将进行算术逻辑运算工作。这是【ALU】模块的工作。在进行完了算术逻辑运算工作以后,在某一个时钟的上升沿,控制中心模块会检测到内部总线变量,【work_ok_inner】,会变为有效的高电平。这时,控制中心模块进行一番处理。

处理如下图所示。

图16

如图16所示,当检测到内部总线,成功完成信号【work_ok_inner】为有效的高电平,且控制总线缓存值为【20 <= ctrl_bus_buf < 24】时,此时算术逻辑单元完成了算术逻辑运算,且运算结果保存在内部数据总线【data_sig_inner】里面。那么,我们就将这个内部数据总线【data_sig_inner】中的运算结果给保存下来,保存在某一个内部寄存器里面,索引号由【ctrl_bus_index】来指定。

这便是图16中的代码的功能。

另外,我们还可以看一看关于内部寄存器的其他的逻辑代码。

图17
图18
图19

根据图17,在系统复位时,四个内部寄存器被赋予0值。根据图19,四个内部寄存器在处于【else】分支时,也就是闲来无事时,会保持现有值不变。而根据图18,在操作类型为算术逻辑操作,且成功完成之时,则需要将内部数据总线【data_sig_inner】上面的值保存在以【ctrl_bus_index】为索引号的内部寄存器【inner_reg】之中。

结束语

本节内容,可以说是很多。

希望大家能够学好本节知识。

相关文章:

简易CPU设计入门:控制总线的剩余信号(二)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…...

软件开发中的密码学(国密算法)

1.软件行业中的加解密 在软件行业中&#xff0c;加解密技术广泛应用于数据保护、通信安全、身份验证等多个领域。加密&#xff08;Encryption&#xff09;是将明文数据转换为密文的过程&#xff0c;而解密&#xff08;Decryption&#xff09;则是将密文恢复为明文的过程。以下…...

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…...

rust feature h和 workspace相关知识 (十一)

feature 相关作用和描述 在 Rust 中&#xff0c;features&#xff08;特性&#xff09; 是一种控制可选功能和依赖的机制。它允许你在编译时根据不同的需求启用或禁用某些功能&#xff0c;优化构建&#xff0c;甚至改变代码的行为。Rust 的特性使得你可以轻松地为库提供不同的…...

动手学深度学习-卷积神经网络-3填充和步幅

目录 填充 步幅 小结 在上一节的例子&#xff08;下图&#xff09; 中&#xff0c;输入的高度和宽度都为3&#xff0c;卷积核的高度和宽度都为2&#xff0c;生成的输出表征的维数为22。 正如我们在 上一节中所概括的那样&#xff0c;假设输入形状为nhnw&#xff0c;卷积核形…...

最长递增——蓝桥杯

1.题目描述 在数列 a1​,a2​,⋯,an​ 中&#xff0c;如果ai​<ai1​<ai2​<⋯<aj​&#xff0c;则称 ai​ 至 aj​ 为一段递增序列&#xff0c;长度为 j−i1。 定一个数列&#xff0c;请问数列中最长的递增序列有多长。 输入描述 输入的第一行包含一个整数 n。…...

DeepSeek R1 对比 AlphaGo,Zero 的思考过程

作者&#xff1a;真中合欢 原文&#xff1a;https://zhuanlan.zhihu.com/p/19897045280 等了好久&#xff0c;终于等来R1的论文&#xff0c;我在当天晚上第一时间拜读。整篇论文的实验和理论给我一种简洁的优雅&#xff0c;和DeepSeek-V3那篇论文的感觉完全不同。读论文的过程中…...

【2025最新计算机毕业设计】基于SSM房屋租赁平台【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

蓝桥杯练习日常|c/c++竞赛常用库函数(下)

书接上回......蓝桥杯算法日常|c\c常用竞赛函数总结备用-CSDN博客 目录 书接上回......https://blog.csdn.net/weixin_47011416/article/details/145290017 1、二分查找 2、lower_bound uper_bound 3、memset&#xff08;&#xff09; 函数原型 参数说明 返回值 常见用…...

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…...

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

目录 1、前言工程概述免责声明 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Block for PCI ExpressRIFFA驱动及其安装QT上位机HDMI输出RGB转BT…...

【16届蓝桥杯寒假刷题营】第2期DAY5

2.最大公因数 - 蓝桥云课 问题描述 给你2个正整数N&#xff0c;M。 你需要构造一个有N个数的正整数序列a&#xff0c;满足以下条件&#xff1a; ∑i1N​ai​M。 求gcd(a)&#xff0c;可能的最大值。 输入描述 输入一行两个正整数N&#xff0c;M&#xff0c;表示数组的长…...

26.项目集风险管理战略和项目集风险管理活动有何区别与联系?

项目集风险管理战略和项目集风险管理活动有何区别与联系? 项目集风险管理战略和项目集风险管理活动在项目集管理中的作用不同&#xff0c;但又是密切相关的。 区别&#xff1a; 1.定义 项目集风险管理战略&#xff1a;指的是制定一套全面的、系统的方针和方法&#xff0c;…...

PETSc源码分析: Time Integrators

本文结合PETSc源代码&#xff0c;总结PETSc中的ODE/DAE求解器。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 参考文献 Balay S. PETSc/TAO Users Manual, Revision 3.22. Argonne National Labo…...

Spring Boot是什么及其优点

简介 Spring Boot是基于Spring框架开发的全新框架&#xff0c;其设计目的是简化Spring应用的初始化搭建和开发过程。 Spring Boot整合了许多框架和第三方库配置&#xff0c;几乎可以达到“开箱即用”。 优点 可快速构建独立的Spring应用。 直接嵌入Tomcat、Jetty和Underto…...

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…...

LeetCode --- 433周赛

题目列表 3427. 变长子数组求和 3428. 最多 K 个元素的子序列的最值之和 3429. 粉刷房子 IV 3430. 最多 K 个元素的子数组的最值之和 一、变长子数组求和 题意要求我们能快速算出 n u m s [ s t a r t . . . i ] nums[start...i] nums[start...i] 这段区间和&#xff0c;其中…...

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题&#xff08;LLM 幻觉&#xff1a;现象剖析、影响与应对策略&#xff09;对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符&#xff0c;在医疗、金融、法律等对准确性要求极高的关键领域&#xff0c;可能引发误导性后果&#x…...

Rocky9.5编译freeswitch【记录】

文件目录 tree -dL 1 . ├── flite-2.0.0 ├── freeswitch ├── ldns-1.8.4 ├── libcodec2-2.59 ├── libks ├── ooh323-0.1 ├── opus ├── signalwire-client-c ├── sofia-sip ├── spandsp ├── v8-6.1.298 └── zeromq-2.1.9操作记录 ip a nm…...

自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

在 TensorFlow 中实现逻辑回归、保存模型并加载模型进行预测的过程可以分为以下几个步骤&#xff1a; 准备数据&#xff1a;创建或加载你的自定义数据集。构建逻辑回归模型。训练模型。保存模型。加载模型。使用加载的模型进行预测。 import tensorflow as tf import numpy as…...

WPF进阶 | WPF 数据绑定进阶:绑定模式、转换器与验证

WPF进阶 | WPF 数据绑定进阶&#xff1a;绑定模式、转换器与验证 一、前言二、WPF 数据绑定基础回顾2.1 数据绑定的基本概念2.2 数据绑定的基本语法 三、绑定模式3.1 单向绑定&#xff08;One - Way Binding&#xff09;3.2 双向绑定&#xff08;Two - Way Binding&#xff09;…...

八股——Java基础(四)

目录 一、泛型 1. Java中的泛型是什么 ? 2. 使用泛型的好处是什么? 3. Java泛型的原理是什么 ? 什么是类型擦除 ? 4.什么是泛型中的限定通配符和非限定通配符 ? 5. List和List 之间有什么区别 ? 6. 可以把List传递给一个接受List参数的方法吗&#xff1f; 7. Arra…...

2025蓝桥杯JAVA编程题练习Day1

1.刑侦科推理试题 题目描述 有以下10道单选题&#xff0c;编程求这10道题的答案。 这道题的答案是&#xff1a; A. A B. B C. C D. D 第5题的答案是&#xff1a; A. C B. D C. A D. B 以下选项中哪一题的答案与其他三项不同&#xff1a; A. 第3题 B. 第6题 C. 第2题 D.…...

数据结构与算法-要点整理

知识导图: 一、数据结构 包含:线性表(数组、队列、链表、栈)、散列表、树(二叉树、多路查找树)、图 1.线性表 数据之间就是“一对一“的逻辑关系。 线性表存储数据的实现方案有两种,分别是顺序存储结构和链式存储结构。 包含:数组、队列、链表、栈。 1.1 数组…...

SaaS底层盈利逻辑剖析:运维费与服务费的战略抉择

一、引言 1.1 研究背景与意义 在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业近年来取得了迅猛发展&#xff0c;成为软件产业中不可或缺的一部分。SaaS 通过互联网提供软件服务&#xff0c;企业无需进行复杂的本地软件安装和硬件购置&#xff…...

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…...

【数据结构】(2)时间、空间复杂度

一、衡量算法好坏的指标 时间复杂度衡量算法的运行速度&#xff0c;空间复杂度衡量算法所需的额外空间。这些指标&#xff0c;是某场景中选择使用哪种数据结构和算法的依据。如今&#xff0c;计算机的存储器已经变得容易获得&#xff0c;所以不再太关注空间复杂度。 二、渐进表…...

理解 IS-IS 中重要概念之间的关系

本文为 “IS-IS 中重要概念” 相关文章合辑。 未整理去重。 理解 IS-IS、CLNS、CMNS、NSAP、NET 等概念之间的关系 1. 核心概念 IS-IS (Intermediate System to Intermediate System) 一种链路状态路由协议&#xff0c;基于 SPF&#xff08;最短路径优先&#xff09;算法计…...

AI 模型评估与质量控制:生成内容的评估与问题防护

在生成式 AI 应用中&#xff0c;模型生成的内容质量直接影响用户体验。然而&#xff0c;生成式模型存在一定风险&#xff0c;如幻觉&#xff08;Hallucination&#xff09;问题——生成不准确或完全虚构的内容。因此&#xff0c;在构建生成式 AI 应用时&#xff0c;模型评估与质…...

Mybatis-plus缓存

mybatis-plus缓存 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上提供了更多的便利性和强大的功能&#xff0c;包括但不限于分页、条件构造器、通用 Mapper、代码生成器等。MyBatis-Plus 也内置了基础的缓存功能&#xff0c;但需要注意的是&#xff…...

unity学习20:time相关基础 Time.time 和 Time.deltaTime

目录 1 unity里的几种基本时间 1.1 time 相关测试脚本 1.2 游戏开始到现在所用的时间 Time.time 1.3 时间缩放值 Time.timeScale 1.4 固定时间间隔 Time.fixedDeltaTime 1.5 两次响应时间之间的间隔&#xff1a;Time.deltaTime 1.6 对应测试代码 1.7 需要关注的2个基本…...

系统思考—转型

“我知道自己有问题&#xff0c;但问题到底出在哪里&#xff1f;” 很多中小企业主都会在这样的迷茫中徘徊。市场变化太快、团队执行力不强、内部沟通不畅……这些问题似乎无处不在。但其实&#xff0c;真正让企业陷入困境的&#xff0c;并不是问题本身&#xff0c;而是——看…...

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…...

本地Harbor仓库搭建流程

Harbor仓库搭建流程 本文主要介绍如何搭建harbor仓库&#xff0c;推送本地镜像供其他机器拉取构建服务 harbor文档&#xff1a;Harbor 文档 | 配置 Harbor YML 文件 - Harbor 中文 github下载离线安装包 Releases goharbor/harbor 这是harbor的GitHub下载地址&#xff0c…...

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …...

Qt调用FFmpeg库实时播放UDP组播视频流

基于以下参考链接&#xff0c;通过改进实现实时播放UDP组播视频流 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows&#xff08;qt-opensource-windows-x86-5.12.9.exe&#xff09;、ubuntu20.04.6(x64)(qt-opensource-linux-x64-5.12.12.run)、以…...

YOLOv10改进,YOLOv10检测头融合DynamicHead,添加小目标检测层(四头检测)+CA注意机制,全网首发

摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...

【ComfyUI专栏】推荐几个常用的云端ComfyUI平台

如果我们本身的系统资源不足&#xff0c;但是我们依然能够使用显卡来利用ComfyUI生成我们需要的图片或者视频。当前平台中主要有两个不同的廉价平台提供了ComfyUI的功能&#xff0c;这里提供的资源基本上都是基于分钟进行计算。这些平台的好处就是基本上不需要你额外进行配置。…...

std::pair源码:operator=被delete了,提供的是sfinae版本

D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\utility pair& operator(const volatile pair&) delete;真正版本&#xff1a;template<class _Other1 _Ty1,class _Other2 _Ty2,enable_if_t<conjunction_v<is_assignable<_Ty1&, const _Oth…...

数据要素白皮书(2024年)(解读+全文阅读)

数据要素白皮书&#xff08;2024年&#xff09;》由中国通信标准化协会大数据技术标准推进委员会发布&#xff0c;版权受法律保护&#xff0c;转载需注明来源。该白皮书深入分析了当前数据要素在全球及中国的发展态势&#xff0c;并提出了关键观察与展望。 全球范围内&#xf…...

C#常用257单词

1、Visual Studio 直译&#xff1a;可视化开发环境 说明&#xff1a;简称VS&#xff0c;我们编写程序的集成开发环境&#xff0c;可以写代码、编译代码、调试代码、发布程序。 2、.Net 直译&#xff1a;dotNet 说明&#xff1a;我们常说的.net读作dotnet&#xff0c;表示网…...

禅道2024年度回顾:品牌向善,才能向上!

很高兴禅道顺利完成了2024年的跃升计划&#xff0c;并交出了一份认真的答卷&#xff01; 这一年&#xff0c;禅道的产品在变强&#xff0c;完成了产品的重构与全面升级&#xff1b; 这一年&#xff0c;禅道的朋友在变多&#xff0c;服务到更多不同行业的客户&#xff1b; 这…...

RK3568 adb使用

文章目录 一、adb介绍**ADB 主要功能****常用 ADB 命令****如何使用 ADB****总结** 二、Linux下载adb**方法 1&#xff1a;使用包管理器&#xff08;适用于 Ubuntu/Debian 系统&#xff09;****方法 2&#xff1a;通过 Snap 安装&#xff08;适用于支持 Snap 的系统&#xff09…...

koodo-reader-电脑跨平台现代阅读器[支持ebook等电子书,支持多种格式]

koodo-reader-电脑跨平台现代阅读器[支持ebook等电子书&#xff0c;支持多种格式] 链接&#xff1a;https://pan.xunlei.com/s/VOH_rDBEXIU8lg4aA6IztZ4PA1?pwdg724# 特色 支持阅读格式&#xff1a; EPUB (.epub) PDF (.pdf) Kindle (.azw3, .mobi, .azw) 纯文本 (.txt…...

03:Heap代码的分析

Heap代码的分析 1、内存对齐2、Heap_1.c文件代码分析3、Heap_2.c文件代码分析4、Heap_4.c文件代码分析5、Heap_5.c文件代码分析 1、内存对齐 内存对齐的作用是为了CPU更快的读取数据。对齐存储与不对齐存储的情况如下&#xff1a; 计算机读取内存中的数据时是一组一组的读取的…...

二分查找题目:寻找两个正序数组的中位数

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;寻找两个正序数组的中位数 出处&#xff1a;4. 寻找两个正序数组的中位数 难度 8 级 题目描述 要求 给定两个大…...

Java Web-Tomcat Servlet

Web服务器-Tomcat Web服务器简介 Web 服务器是一种软件程序&#xff0c;它主要用于在网络上接收和处理客户端&#xff08;如浏览器&#xff09;发送的 HTTP 请求&#xff0c;并返回相应的网页内容或数据。以下是关于 Web 服务器的详细介绍&#xff1a; 功能 接收请求&#…...

渗透测试-WAF是什么以及原理解释 waf功能详解

目录 waf功能介绍 waf出现的地点: 什么是waf 功能: 常见的系统攻击分为两类 一是利用Web服务器的漏洞进行攻击 二是利用网页自身的安全漏洞进行攻击 WAF主要功能&#xff1a; waf的特点1 waf主要功能2 网马木马主动防御及查杀 流量监控 网站漏洞防御功能 危险组件…...

Vue3 provide/inject用法总结

1. 基本概念 provide/inject 是 Vue3 中实现跨层级组件通信的方案&#xff0c;类似于 React 的 Context。它允许父组件向其所有子孙组件注入依赖&#xff0c;无论层级有多深。 1.1 基本语法 // 提供方&#xff08;父组件&#xff09; const value ref(hello) provide(key, …...

C# 提取PDF表单数据

目录 使用工具 C# 提取多个PDF表单域的数据 C# 提取特定PDF表单域的数据 PDF表单是一种常见的数据收集工具&#xff0c;广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点&#xff0c;PDF表单在各行各业中得到了广泛应用。然而&#xff0c;当需要整合…...