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

news2025/1/31 6:17:34

项目代码下载

请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的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;
	else
		ALU_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】之中。

结束语

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

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

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

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

相关文章

[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)

目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…

基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测

完整源码项目包获取→点击文章末尾名片&#xff01; 番石榴病害数据集 背景描述 番石榴 &#xff08;Psidium guajava&#xff09; 是南亚的主要作物&#xff0c;尤其是在孟加拉国。它富含维生素 C 和纤维&#xff0c;支持区域经济和营养。不幸的是&#xff0c;番石榴生产受到降…

基于PostgreSQL的自然语义解析电子病历编程实践与探索(上)

一、引言 1.1研究目标与内容 本研究旨在构建一个基于 PostgreSQL 的自然语义解析电子病历编程体系,实现从电子病历文本中提取结构化信息,并将其存储于 PostgreSQL 数据库中,以支持高效的查询和分析。具体研究内容包括: 电子病历的预处理与自然语言处理:对电子病历文本进…

5.1.3 软件过程评估

文章目录 软件能力成熟度模型CMM能力成熟度模型集成 软件能力成熟度模型CMM 软件能力成熟度模型是用于评价软件承接方能力的方法&#xff0c;通过评价&#xff0c;也可以让承接方看到自身缺陷&#xff0c;不断改进和提升软件过程能力。分为5个成熟度等级&#xff0c;初始级、可…

【JavaEE】Spring(5):Mybatis(上)

一、什么是Mybatis Mybatis是一个持久层的框架&#xff0c;它用来更简单的完成程序和数据库之间的交互&#xff0c;也就是更简单的操作和读取数据库中的数据 在讲解Mybatis之前&#xff0c;先要进行一些准备工作&#xff1a; 1. 为项目添加 Mybatis 相关依赖 2. 创建用户表以…

记录 | MaxKB创建本地AI智能问答系统

目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里&#xff0c;随着项目的增长和需求的变化&#xff0c;如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…

八股——Java基础(四)

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

基于STM32的循迹小车设计与实现

1 系统方案设计 根据系统设计功能&#xff0c;展开基于STM32的循迹小车设计&#xff0c;整体设计框图如图2.1所示。系统采用STM32单片机作为控制器,通过L298驱动器控制两个直流电机实现对小车的运动控制&#xff0c;两路红外模块实现黑线的检测&#xff0c;HC-SR04超声波模块实…

AI刷题-蛋糕工厂产能规划、优质章节的连续选择

挑两个简单的写写 目录 一、蛋糕工厂产能规划 问题描述 输入格式 输出格式 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 关键点 最终代码&#xff1a; 运行结果&#xff1a;​编辑 二、优质章节的连续选择 问题描述 输入格式 输出格式 解题思路&a…

达梦拷贝DM_HOME的复制安装

近期一个项目需求&#xff0c;需要在没有安装包的情况下&#xff0c;将达梦数据库安装到虚机上&#xff08;生产机上安装了达梦&#xff09;&#xff0c;故采用直接打包生产机DM_HOME的方式拷贝至虚机&#xff0c;再依次执行达梦的部分指令完成安装。以下为验证的步骤&#xff…

网络工程师 (3)指令系统基础

一、寻址方式 &#xff08;一&#xff09;指令寻址 顺序寻址&#xff1a;通过程序计数器&#xff08;PC&#xff09;加1&#xff0c;自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址&#xff1a;通过转移类指令直接或间接给出下一条指令的地址。跳…

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…

DeepSeek R1与OpenAI o1深度对比

文章目录 引言技术原理DeepSeek R1OpenAI o1 性能表现官方数据推理任务知识密集型任务通用能力 价格对比应用场景科研与技术开发自然语言处理&#xff08;NLP&#xff09;企业智能化升级教育与培训数据分析与智能决策 部署与集成DeepSeek R1OpenAI o1 伦理考量DeepSeek R1OpenA…

图漾Halcon版本SDK使用教程【V1.1.0新版本】

1.下载并安装 Halcon 1.1 下载Halcon软件 在 Halcon 官网(https://www.mvtec.com/downloads) 下载 Halcon (Windows 版) 安装包&#xff0c;并根据官方文档安装 Halcon&#xff0c;下载HALCON24.11Progress-Steady。 1.2 安装Halcon 1.解压HALCON 24.11.1.0的安装包压缩文件…

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完&#xff0c;确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…

算法题(49):反转链表II

审题&#xff1a; 需要我们对指定范围的链表进行反转&#xff0c;并返回反转后链表的头结点 思路&#xff1a; 方法一&#xff1a;vector法 我们先遍历一次链表&#xff0c;并把数据对应的存在数组中&#xff0c;然后利用数组的reverse方法进行反转数据&#xff0c;最后再遍历一…

基于SpringBoot多数据源解决方案

最近在学习SpringBoot的时候&#xff0c;需要同时用两个不同的数据库连接服务&#xff0c;在网上学习了之后&#xff0c;下文以连接一个MySQL数据库和一个SqlServer数据库为例。 配置数据源连接信息 在配置文件中&#xff0c;配置对应的数据库连接信息&#xff0c;相比于单数…

通过案例研究二项分布和泊松分布之间关系(2)

通过案例研究二项分布和泊松分布之间关系 2. 汽车出事故的概率p与保险公司盈利W之间的关系3.通过遗传算法多次迭代计算控制p为多少时公司盈利最大(1) 计算过程(2) 结果及分析(计算过程详见附录二程序) 4.改变思路求解固定p为0.01时,保险费用如何设置公司可获得最大利润(1)计算过…

RISC-V读书笔记4

目录 乘法与除法 RV32F 和 RV32D&#xff1a;单精度和双精度浮点数 原子操作 压缩指令 向量 乘法与除法 RV32M属于扩展的指令&#xff0c;主要扩展的就是便捷的乘法和除法指令。 除法&#xff1a; 商 (被除数− 余数) 除数 被除数 除数 商 余数 余数 被除数− (商 …