diy经验网 > 儿童diy >

16位CPU怎么做,DIY大神给你支支招儿

时间:2019-03-31 19:39 来源:未知  手机版

北部湾经济区,蒋欣的新宠原来是TA,樵夫,不知火舞的图片,曼联直播,电影天堂下载,qq冻结解除,天翼院线通

状态机基本上与系统所有的组件都连接到一起了,因为上面所说的所有动作的执行,都需要状态机的控制,状态机其实就是由一部分触发器构成的记忆电路和另外一部 分组合逻辑构成的次态译码电路构成,还有根据当前状态和输入进行译码的部分用于控制各个部件,下面是教科书上的典型FSM结构:

而我们用的状态机状态转移图如下:

因为这个处理器设计的很简单,所以没有出现很多状态,当处理器经历完以上的状态之后,处理器就执行完了一条指令。

有的CISC的处理器用微指令进行控制,作用和状态机相近,这种结构出现在一些比较古老的处理器上,因为那个时候的设计工具和方法没有现在的先进,所以往往 改动硬件是困难的和高成本的,所以用微指令的话,做好了硬件的结构,要是需要改动只要修改微指令就好了,而现在的电子技术很发达,设计工具也很完备,所以 就有很多直接通过硬连线实现的处理器。

好马配好鞍,有了处理器,我们就得给它配上一个好的程序,下面我们就用自己设计的处理器进行求和,从1加到100,因为我们没有设计编译器,也没有设计汇编器,所以程序只能用机器码写出,示例程序如下:

我们不妨先写出程序的汇编代码:

mov [ADDR],r0;r0 = 0

mov r1,100

lop:add r2,r1

sub r1,1

cmp r1,0

jz ext

mov r4,4

jmp r4(lop)

ext:mov [ADDR],r2

jmp $

先将内存中存放数据的地址清零,这样才能存放等下送来的结果,然后将r1寄存器存入循环次数(也就是求和的上限)。然后再将r1的值加到r2中来,r2其实就是放求和的寄存器,最后我们会将r2中的值送到内存中的某个地址存放的。

然 后将r1减去1,看看是否为0?如果为0则说明求和结束了,如果不是0则说明还要继续,结束后程序就跳到ext部分将结果存放到内存中某个地址(例子中给 的是49152也就是二进制的1100000000000000b),最后jmp $是为了让程序停在这一行,防止程序跑飞(跑飞的程序危害很大!有可能吧数据当代码或者把代码当数据!)

转换成VerilogHDL语言如下:

module memory

input [15:0] addr,

inout [15:0] data,

input rw

);

reg [15:0] data_ram[0:16'b1111_1111_1111_1111];

integer i;

initial begin

for (i = 0; i <= 16'b1111_1111_1111_1111; i = i + 1)

data_ram[i] = $random();

data_ram[0] = 16'b1000000100000000; //mov [ADDR],r0;r0 = 0

data_ram[1] = 16'b1100000000000000; //ADDR

data_ram[2] = 16'b1000000010001000; //mov r1,100

data_ram[3] = 100; //100

//data_ram[2] = 16'b1110011001000000;

data_ram[4] = 16'b0010000100010001; //lop:add r2,r1

data_ram[5] = 16'b1110000011001000; //sub r1,1

data_ram[6] = 16'b0000000000000001; //1

data_ram[7] = 16'b1110000000001000; //cmp r1,0

data_ram[8] = 16'b0000000000000000; //0

data_ram[9] = 16'b1110011010000000; //jz ext

data_ram[10] = 16'b0000000000000011; //+3 offset(ext)

data_ram[11] = 16'b1000000010100000;//mov r4,4

data_ram[12] = 16'b0000000000000100;

本站所有文章均来自搜索引擎和其他站点公开内容,如有侵权或表述不当,请联系并标明身份和情况后立即删除。
本文地址: http://www.eatdiy.com/ertongdiy/98.html

本文标签:程序 处理器 指令 设计 求和

相关文章

热图 更多>>
热门文章 更多>>