手把手教你设计字长8位的简单CPU-Verilog实现

这篇具有很好参考价值的文章主要介绍了手把手教你设计字长8位的简单CPU-Verilog实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


首先声明,所实现的8字长简单CPU所支持的指令不多,结构也很简单,只是演示讲解下如何根据任务书设计一个属于自己的CPU,不喜勿喷,谢谢。

转载请注明出处
作者:雪天鱼
更多博客、资料和业务承接发布在我的个人网站上,欢迎交流学习。

一、设计要求

此设计要求来源于一个课程设计任务书。

1.1 设计内容

设计实现一个字长8位的CPU,所设计的系统能调试通过,进行仿真测试后在FPGA开发板上运行一段程序,通过检查程序结果的正确性来判断所设计计算机系统的正确性。

CPU架构

  • 寄存器只有 AC 、R两个
  • 指令长度是 8bit

1.2 设计要求

(1)自行设计指令格式

表1 所实现的指令集
序号 指令 功能
0 NOP 无操作
1 LDAC AC <— M[T]
2 STAC M[T] <— AC
3 MOVAC R <— AC
4 MOVR AC <— R
5 JUMP GOTO
6 JMPZ IF(Z=1) GOTO T
7 JPNZ IF(Z=0) GOTO T
8 ADD AC <— AC+R
9 SUB AC <— AC-R
10 INAC AC<— AC+1
11 CLAC AC <— 0
12 AND AC <— AC^R
13 OR AC <— AC or R
14 XOR AC <— AC xor R
15 NOT AC <— ~AC

注:T是16位地址,M是数据存储器。
上述指令中包含:

单字指令:

  • 寄存器-寄存器传送指令
  • 算术运算指令
  • 逻辑运算指令
  • 清零指令

三字指令:

  • 寄存器与存储器之间的数据传送
  • 无条件转移指令
  • 条件转移指令

(2)自行设计数据通路
(3)能运行由自己所设计的指令系统构成的一段程序,程序执行功能正确。
(4)仿真测试后,综合下载到FPGA开发板上测试。
(5)在FPGA开发板上测试程序时,可单步执行,应能通过数码管适时显示信息。

首先进行指令的系统的设计。

二、设计过程

2.1 指令系统设计

(1)参考mips的指令类型,先将要实现的指令进行分类:

表2 指令分类
类型 指令
RR类型(寄存器-寄存器) MOVR、MOVAC、ADD、SUB、INAC、CLAC、AND、OR、XOR、NOT(单字指令)
RS类型(寄存器-存储器) LDAC(装入字)、STAC(存储字)(三字指令)
J类型 JUMP、JMPZ、JPNZ(三字指令)
O类型(其他指令) NOP(单字指令)

由于要求设计的CPU的通用寄存器就两个,一个AC(目的寄存器),一个是R(源寄存器),所以RR类型指令都不需要rd,rs字段来指定对应寄存器,直接根据指令操作码就可以完成对应指令功能,所以为单字指令;而分类到RS类型和J类型的指令则需要提供16位地址才能完成对应功能,所以为三字指令。

(2)字长为8bit,一共16条指令,故可设计指令格式为:

表3 自行设计的指令系统
序号 指令 格式 功能
0 NOP 00_0000_00 空操作
1 MOVAC 01_0000_00 R <— AC
2 MOVR 01_0001_10 AC <— R
3 ADD 01_0010_10 AC <— AC + R
4 SUB 01_0011_10 AC <— AC - R
5 INAC 01_0100_10 AC <— AC + 1
6 CLAC 01_0101_10 AC <— 0
7 AND 01_0110_10 AC <— AC and R
8 OR 01_0111_10 AC <— AC or R
9 XOR 01_1000_10 AC <— AC xor R
10 NOT 01_1001_10 AC <— ~AC
11 LDAC 10_0000_10 T AC <— M[T]
12 STAC 10_0001_00 T M[T] <— AC
13 JUMP 11_0000_00 T GOTO T
14 JMPZ 11_0001_00 T IF(Z=1) GOTO T
15 JPNZ 11_0010_00 T IF(Z=0) GOTO T

即将16条指令分类为上述四类,通过指令的高两位指示。其中0 ~ 10为单字指令,11~15为三字指令,T为16位地址。
(3)将指令信号名设置为instr,位宽为8bit

  • instr[7:6]=00时,为其他指令,字段为
type(instr[7:6]) op(instr[5:2]) reserve(instr[1:0])
  • instr[7:6]=01时,为RR类型指令,字段为
type(instr[7:6]) op(instr[5:2]) rd(instr[1]) reserve(instr[0])

type字段指示指令类型
op即为操作码,指示具体指令;
rd指示目的寄存器为哪个, 自定义rd=1时为AC;rd=0时为R
instr[0]为保留位,默认为0

  • instr[7:6]=10时,为RS类型指令(三字指令),字段为
type(instr[7:6]) op(instr[5:2]) dir(instr[1]) reserve(instr[0]) T(16bit)

dir指示数据传输方向,自定义dir=1时数据从M[T]传输到AC;dir=0时数据从AC传输到M[T]

  • instr[7:6]=11时,为J类型指令(三字指令),字段为
type(instr[7:6]) op(instr[5:2]) reserve(instr[1:0]) T(16bit)

2.2 数据通路的设计

由于有些RR指令的目的寄存器和操作数所用的寄存器一致并且存在三字指令,所以,打算搭建的是多周期CPU,其中单字指令单时钟周期执行完毕,而三字指令需要三时钟周期才能执行完毕。由2.2指令系统设计可知,需要执行的指令集,存在R、I、J、O四种类型的指令,需要的组件有:
(1)基础组件:NPC、PC、指令存储器IM、寄存器文件RF(即AC和R)、运算器ALU、数据存储器DM、控制单元Control unit
(2)添加组件:

  • 16位的地址寄存器AR,用来存T
    (3)自定义
  • 规定PC为16bit,最小存储单元为1字节,即8bit;顺序执行的情况下,PC每周期加1
    这里偷懒,用Vivado编译后的原理图当做数据通路示意图。
    数据通路图如下图所示:
    手把手教你设计字长8位的简单CPU-Verilog实现
(a)CPU顶层数据通路

手把手教你设计字长8位的简单CPU-Verilog实现

(b)cpu core内部数据通路
图1 CPU数据通路

(1)取指(Fetch):
PC的输出信号输入到指令存储器地址端,取出指令instr
(2)译码(Decode):
指令instr输入到控制器CTRL和地址寄存器AR,在控制器中译码,输出控制信号到NPC、ALU、AR、RF和DM
(3)执行(Execute):
ALU从AC和R中读出数据,根据对应控制信号进行相应的计算,并输出计算结果和标志信号
(4)存储器(Memory)
RS类型的指令需要读写存储器
(5)写回(Writeback):
RR类型的指令会将数据写回寄存器文件,即写入AC或者R

2.3 ALU的设计

编译后的原理图如下图所示:
手把手教你设计字长8位的简单CPU-Verilog实现

(a)ALU模块输入输出信号

手把手教你设计字长8位的简单CPU-Verilog实现

(b)ALU内部原理图
图2 ALU设计
ALU根据输入的控制信号ALUOp对操作数AC和R进行对应的操作,如指令ADD,就是执行加法,指令SUB就是执行减法,并且输出标志信号zero,用于判断AC是否为0。

2.4 控制器的设计

控制器为硬布线控制器,输出的控制信号如表所示:

表4 控制信号概览
信号名 作用
T 三字指令标志
RegDst 选择RF数据写入的寄存器
RegWrite 寄存器文件RF写使能
RegData RF写入数据来源选择
MemWrite 数据存储器Mem写使能
ALUOp 运算器ALU控制信号
NPCOp Next PC计算控制信号
表5 控制器译码器真值表
指令 T RegDst RegWrite RegData MemWrite ALUOp NPCOp
NOP 0 x 0 x 0 0000 00
MOVAC 0 0 1 1 0 0001 00
MOVR 0 1 1 1 0 0010 00
ADD 0 1 1 1 0 0011 00
SUB 0 1 1 1 0 0100 00
INAC 0 1 1 1 0 0101 00
CLAC 0 1 1 1 0 0110 00
AND 0 1 1 1 0 0111 00
OR 0 1 1 1 0 1000 00
XOR 0 1 1 1 0 1001 00
NOT 0 1 1 1 0 1010 00
LDAC 1 1 1 0 0 1111 00
STAC 1 x 0 x 1 1111 00
JUMP 1 x 0 x 0 1111 01
JMPZ 1 x 0 x 0 1111 01
JPNZ 1 x 0 x 0 1111 01

注:x表示任意值均可(此时该控制信号无效)
编译后的原理图如下图所示:
手把手教你设计字长8位的简单CPU-Verilog实现

(a)控制器输入输出信号

手把手教你设计字长8位的简单CPU-Verilog实现

(b)控制器内部原理图
图3 控制器设计
控制器为硬布线控制器,根据输入的8位指令进行译码,并输出控制信号。

这里我用Verilog实现了此字长8位的简单CPU。
下面进行仿真测试

三、实验结果

3.1 指令仿真测试

(1)测试RR类型指令:

  • 测试MOVAC,机器码为40
    此条指令实现的功能是R<-AC,即将寄存器AC中的值放置到寄存器R中。为测试此条指令,设置AC寄存器初始值为2,R寄存器初始值为5。指令执行完毕后,R寄存器为2。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图4 MOVAC仿真结果图

可以看到寄存器R的值在执行完MOVAC指令后变为AC存储值2,说明指令执行没问题。

  • 测试MOVR,机器码为46
    此条指令实现的功能是ACR,即将寄存器R中的值放置到寄存器AC中。为测试此条指令,设置AC寄存器初始值为2,R寄存器初始值为5。指令执行完毕后,AC寄存器为5。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图5 MOVR仿真结果图

可以看到寄存器AC的值在执行完MOVR指令后,AC存储值变为5,说明指令执行没问题。

  • 测试ADD,机器码为4A
    此条指令实现的功能是AC<-AC+R,即将寄存器AC和R中的值相加后放置到寄存器AC中。为测试此条指令,设置AC寄存器初始值为2,R寄存器初始值为5。指令执行完毕后,AC寄存器为7。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图6 ADD仿真结果图

可以看到寄存器AC的值在执行完ADD指令后,AC存储值变为7,说明指令执行没问题。

  • 测试SUB,机器码为4E
    此条指令实现的功能是AC<-AC-R,即将寄存器AC和R中的值相减后放置到寄存器AC中。为测试此条指令,设置AC寄存器初始值为2,R寄存器初始值为5。指令执行完毕后,AC寄存器为-3。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图7 SUB仿真结果图
可以看到寄存器AC的值在执行完SUB指令后,AC存储值变为-3,说明指令执行没问题。
  • 测试INAC,机器码为52
    此条指令实现的功能是AC <- AC+1,即将寄存器AC加1后放置到寄存器AC中。为测试此条指令,设置AC寄存器初始值为2,R寄存器初始值为5。指令执行完毕后,AC寄存器为3。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图8 INAC仿真结果图

可以看到寄存器AC的值在执行完INAC指令后,AC存储值变为3,说明指令执行没问题。

  • 测试CLAC,机器码为56
    此条指令实现的功能是AC0,即将寄存器AC清零。为测试此条指令,设置AC寄存器初始值为2,R寄存器初始值为5。指令执行完毕后,AC寄存器为0。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图9 CLAC仿真结果图

可以看到寄存器AC的值在执行完CLAC指令后,AC存储值变为0,说明指令执行没问题。

  • 测试AND,机器码为5A
    此条指令实现的功能是AC <- AC and R,即将寄存器AC与R的存储值进行与操作。为测试此条指令,设置AC寄存器初始值为2(00000010),R寄存器初始值为5(00000101)。指令执行完毕后,AC寄存器为0(00000000)。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图10 AND仿真结果图

可以看到寄存器AC的值在执行完AND指令后,AC存储值变为0,说明指令执行没问题。

  • 测试OR,机器码为5E
    此条指令实现的功能是ACAC or R,即将寄存器AC与R的存储值进行或操作。为测试此条指令,设置AC寄存器初始值为2(00000010),R寄存器初始值为5(00000101)。指令执行完毕后,AC寄存器为7(00000111)。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图11 OR仿真结果图

可以看到寄存器AC的值在执行完OR指令后,AC存储值变为7,说明指令执行没问题。

  • 测试XOR,机器码为62
    此条指令实现的功能是ACAC xor R,即将寄存器AC与R的存储值进行异或操作。为测试此条指令,设置AC寄存器初始值为2(00000010),R寄存器初始值为5(00000101)。指令执行完毕后,AC寄存器为7(00000111)。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图12 XOR仿真结果图
可以看到寄存器AC的值在执行完XOR指令后,AC存储值变为7,说明指令执行没问题。
  • 测试NOT,机器码为66
    此条指令实现的功能是AC~AC,即将寄存器AC的存储值进行取反操作。为测试此条指令,设置AC寄存器初始值为2(00000010),R寄存器初始值为5(00000101)。指令执行完毕后,AC寄存器为-3(11111101)。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图13 NOT仿真结果图

可以看到寄存器AC的值在执行完NOT指令后,AC存储值变为-3,说明指令执行没问题。

(2)测试RS类型指令

  • 测试LDAC,机器码为82 16’h0002
    此条指令实现的功能是ACM[T],即将存储器M的地址为T的存储单元中的值放置到AC中。为测试此条指令,设置AC寄存器初始值为2(00000010),R寄存器初始值为5(00000101),存储器地址0127的单元值分别为0127。指令执行完毕后,AC寄存器为2。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图14 LDAC仿真结果图

可以看到寄存器AC的值在执行完LDAC指令后,AC存储值变为2,且三个时钟周期执行完毕,说明指令执行没问题。

  • 测试STAC,机器码为84 16’h0004
    此条指令实现的功能是M[T] <- AC,即将AC的值放置到存储器M的地址为T的存储单元中中。为测试此条指令,设置AC寄存器初始值为2(00000010),R寄存器初始值为5(00000101),存储器地址0~127的单元值分别为0 ~127。指令执行完毕后,M[4]存储单元值为2。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图15 STAC仿真结果图

可以看到在执行完STAC指令后,M[4]存储单元值变为2,且三个时钟周期执行完毕,说明指令执行没问题。
(3)测试J类型指令

  • 测试JUMP,机器码为C0 16’h0006
    此条指令实现的功能是GOTO T,即将直接跳转到地址为T的指令去继续执行。为测试此条指令,设置指令寄存器,存储8字,为C0,00,06,01,02,03,04,05。指令执行完毕后,instr为04。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图16 JUMP仿真结果图

可以看到在执行完JUMP指令后,指令instr变为04,且三个时钟周期执行完毕,说明指令执行没问题。

  • 测试JPNZ,机器码为C8 16’h0006
    此条指令实现的功能是IF(Z=0)GOTO T,即当AC不等于0时将直接跳转到地址为T的指令去继续执行。为测试此条指令,设置指令寄存器,存储8字,为C8,00,06,01,02,03,04,05。指令执行完毕后,instr为04。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图17 JPNZ仿真结果图

可以看到在执行完JPNZ指令后,指令instr变为04,且三个时钟周期执行完毕,说明指令执行没问题。

  • 测试JMPZ,机器码为C4 16’h0006
    此条指令实现的功能是IF(Z=1)GOTO T,即当AC等于0时将直接跳转到地址为T的指令去继续执行。为测试此条指令,设置指令寄存器,存储8字,为C4,00,06,01,02,03,04,05,AC初始值为0。指令执行完毕后,instr为04。仿真结果图如下:
    手把手教你设计字长8位的简单CPU-Verilog实现
图18 JMPZ仿真结果图

可以看到在执行完JMPZ指令后,指令instr变为04,且三个时钟周期执行完毕,说明指令执行没问题。

3.2 程序仿真测试

编写一个简易的程序同时进行多条指令的测试,如下所示:
AC初始值为2 ,R初始值为5 M[0]~M[127]初始值分别对应 0 ~127

表6 测试程序概览
地址 指令 机器码 结果
0 MOVAC 40 AC:2 R:2,其余不变
1 ADD 4A AC:4 R:2,其余不变
2 MOVR 46 AC:2 R:2, 其余不变
3 INAC 52 AC:3 R:2,其余不变
4 SUB 4E AC:1 R:2,其余不变
5 XOR 62 AC:3 R:2,其余不变
6 AND 5A AC:2 R:2,其余不变
7 NOP 00 AC:2 R:2,其余不变
8 NOT 66 AC:-3 R:2,其余不变
9 LDAC 16’h0004 82 0004 AC:4 R:2,其余不变
10 OR 5E AC:6 R:2,其余不变
11 STAC 16’h0002 84 0002 AC:6 R:2,M[2]=6
12 JUMP 16’h000E C0 000E 跳转到地址0E
13 JPNZ 16’h0010 C8 0010 跳转到地址10(程序结束)
14 CLAC 56 AC:0 R:2,其余不变
15 JMPZ 16’h000D C4 000D 跳转到地址0D

仿真测试波形图如下图所示:
手把手教你设计字长8位的简单CPU-Verilog实现

(a)

手把手教你设计字长8位的简单CPU-Verilog实现

(b)
图19 简易程序仿真测试图

可以看到AC值和R值变化与预期一致,且最终在ff地址处结束,说明程序执行正确无误。8位字长的简单CPU搭建完毕!

3.3 上板测试

开发板如图20所示:
手把手教你设计字长8位的简单CPU-Verilog实现

图20 上板所用开发板

首先需要设置好顶层模块的输入输出接口,即如何显示输入指令和显示运行结果。如下表:

表7 上板测试输入输出接口设置

即通过拨码开关输入指令,通过按键控制指令执行和复位,数码管和LED灯指示执行结果和执行状态。
CPU分为三个状态:IN状态,CHECK状态和RUN状态。IN状态为输入状态:从switch开关上输入指令并保存;CHECK状态为检查状态:检查输入的指令是否正确;RUN状态:依次执行之前输入的指令。

  • SW17=0,SW16=1,输入状态,指令通过SW7~SW0输入,按下KEY1,将输入指令写入IM中,写完PC自动+1;
  • SW17=1,SW16=0,检查输入状态,按下KEY0,PC复位为初始地址,按下KEY1,读出当前地址的指令,通过led 0-7显示机器码,读完PC自动+1,进行运行状态前,先按下KEY0,PC复位为初始地址。
  • SW17=1,SW16=1,运行状态,按下KEY1,依次执行所有输入的指令;
    注:状态切换按01->00->10->11顺序来。

四、结论分析

4.1 所遇到的问题与解决思路

(1)如何搭建数据通路?
首先遇到的问题就是搭建怎样的数据通路,要能满足任务书中所提到的要求。我的解决思路是通过查阅教材,查找执行不同类型指令所必须的组件,然后将它们组合到一起,设置控制信号,得到了最后所设计的数据通路。
(2)如何设计指令系统?
其次遇到的问题是怎么为指令编码,编码要有意义,这样才好扩展指令集,虽然现在就只是实现16条指令,但思路要按照可扩展的指令集来,培养个人能力。所以通过翻阅资料,参考mips的指令集,先对指令进行分类,再根据不同类型设置不同的字段,自行设计了一个简单指令系统。
(3)如何处理三字指令?
单字指令好处理,一个周期就可以执行完,但三字指令不行,需要添加一个地址寄存器,用来储存后面的二字,即地址,再通过控制信号T来指示三字指令。三字指令用三个时钟周期执行完毕。
(4)如何上板测试?
上板测试需要设置CPU有对应的输入和输出端口,能接收外部的信号输入,并输出对应的结果以便查看验证。通过研究板卡的资源设置和CPU构造,最终敲定了输入输出端口分别与板子上的什么硬件相连接。文章来源地址https://www.toymoban.com/news/detail-447822.html

到了这里,关于手把手教你设计字长8位的简单CPU-Verilog实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

    2024年02月07日
    浏览(57)
  • 手把手教你实战TDD

    领域驱动设计,测试驱动开发。 我们在《手把手教你落地DDD》一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解、TDD常见误区、TDD技术选型,以及案例实战。希望通过本文,读者能够理解掌握TDD并将其应用于实际

    2024年02月08日
    浏览(45)
  • 手把手教你做主成分分析

    主成分分析是一种降维处理的统计方法,实践中有三个应用场景: 信息浓缩:将多个分析项浓缩成几个关键概括性指标; 权重计算:利用方差解释率值计算各概括性指标的权重; 综合评价:基于主成分得分构造综合得分数据,用于综合评价。 接下来,以一个具体案例来学习

    2024年02月01日
    浏览(57)
  • 手把手教你落地DDD

    一、前言 常见的DDD实现架构有很多种,如经典四层架构、六边形(适配器端口)架构、整洁架构(Clean Architecture)、CQRS架构等。架构无优劣高下之分,只要熟练掌握就都是合适的架构。本文不会逐个去讲解这些架构,感兴趣的读者可以自行去了解。 本文将带领大家从日常的

    2024年02月16日
    浏览(49)
  • 手把手教你写go单元测试

    ​ 在 Go 语言中,单元测试是一种测试方法,用于验证代码的某个独立单元是否按预期功能,它的目的是确保代码的每个组成部分都在独立测试的情况下运行正常。 ​ 在我们对项目新增一个新功能时,最好就要养成写单元测试的好习惯,这样可以有助于提高我们代码的质量、

    2024年04月14日
    浏览(45)
  • 手把手教你Linux的网络配置

    目录 网络连接测试 测试Linux虚拟机是否与主机连接 测试主机是否与虚拟机连接 网络连接模式 桥接模式 NAT模式 仅主机模式 修改静态IP 修改 IP 地址后可能会遇到的问题 配置主机名 测试Linux虚拟机是否与主机连接 首先可以在windows界面,windows + R键输出cmd打开命令行,输入  

    2024年02月03日
    浏览(52)
  • 手把手教你小程序反编译

    1.反编译工具unveilr :百度网盘链接:https://pan.baidu.com/s/10Wle8CwvBq54GPWcbEnxLQ 提取码:bivh   解压即可用。 2.微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 1.获取小程序存储文件夹 (1)打开PC端微信设置,在文件管理中找到存储路径,选择打开文件夹。

    2024年04月12日
    浏览(42)
  • 手把手教你怎么写顺序表

    目录 一、顺序表有什么功能? 二、实现顺序表的各个功能 1.前置准备 2.初始化顺序表 3.顺序表扩容 4.打印顺序表 5.增加顺序表成员 5.1尾增 5.2头增  6.删除顺序表中成员的内容 6.1尾删 6.2头删  7.查找成员  8.修改(替换) 9.插入(在目标位置插入成员) 10.定向删除(将目标位置的成

    2024年02月15日
    浏览(64)
  • 手把手教你如何使用SimiliarWeb

    在之前的“手把手教你如何使用Google Trends”文章中我们讲到从事跨境电商的卖家第一步遇到的问题是“客户在哪里?”该如何推广我的产品?因此若想自己的店铺做大做好,则需要工具来帮助分析市场行情,根据市场行情调整自己的业务状况。小编在上篇中已经讲解了三个特

    2024年02月09日
    浏览(61)
  • 手把手教你如何使用Docker

    我们在公司开发中,会有开发环境,测试环境,上线环境, 比如我们开发人员开发好了一个项目,在开发环境中运行正常,但测试人员拉到测试环境就跑不起来【jdk版本等】,或者上线的时候运行不起来,这时候就要为每个机器配置一个环境,那运维人员不得累死?【哈哈,

    2024年02月10日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包