hungrywolf1987 发表于 2014-7-30 00:10:34

关于avr怎么用1个时钟周期处理16位和32位指令的问题

今天看了马潮老师的《AVR单片机嵌入式系统原理与应用实践》,有个问题百思不解。
问题是:ATmega16是8位单片机,说明数据总线宽度是8位的,也就说明CPU做一次基本运算的字符处理能力是8位数据,那么马潮老师书中所说,AVR的一条指令是16位,甚至是32位,这个8位的CPU是怎么在一个时钟周期里处理16位甚至是32位的指令的??
先谢谢大家了!

takashiki 发表于 2014-7-30 06:02:19

数据总线宽度是8位的,不是所有总线宽度都是8位的。Flash和数据总线是分开的,Flash组织成16位的了,一个时钟周期处理32位指令还得依靠流水线

rockyyangyang 发表于 2014-7-30 07:28:48

mark                                 

zhanan 发表于 2014-7-30 08:08:15

AVR指令按16位编码,指令16位,有外加数据就是32位。
指令长度和执行周期不是对应的,有单周期指令,也有多周期指令。

再一个,单周期指令也是因为流水线的结构才实现的。

XA144F 发表于 2014-7-30 08:47:51

看来你没理解指令的构成啊。指令宽度不等于ALU的宽度啊,只是把指令里面包含的数据送到ALU啊。
指令是 操作码+操作数,难道指令宽度16位就必须对应寄存器宽度16位?51单片机指令从1字节到3字节的都有呢,x86处理器更是乱套了呢。
虽然avr指令宽度是16位或32位,但里面最多包含8位或者16位的立即数,比如向R寄存器写入立即数的指令,32位的指令是向XYZ寄存器写入16位数据而准备的。

在研究stm32的汇编时,经常遇到间接寻址的问题,就是从一个内存或者外设地址进行读写。但这地址是32位的,stm32指令集的也是32位的,要是立即寻址直接把一个32位数据放在R寄存器的话,那指令长度就变成64位了,难道就可以说stm32是64位了?实际不是呢,这代码翻译成汇编的时候,32位的立即数是被放在一个地址里,给R寄存器赋值的汇编语句用了一个间接寻址,从当前PC加上一个偏移的地址中读取32位数据放在R寄存器中,就像51单片机的MOVC A,@A+PC指令一样。

sbk100 发表于 2014-7-30 09:02:45

指令是放在flash里的,avr的flash是以字为单位的,所以一个单字指令占一个单位,avr采用流水线操作,一个时钟周期就可以执行一个单字的指令,跟数据总线宽度没关系

qzhiping 发表于 2014-7-30 09:22:26

之前我也是对这个位数不是很理解,看到大神们的回复。学习了!

hungrywolf1987 发表于 2014-8-7 09:49:10

XA144F 发表于 2014-7-30 08:47
看来你没理解指令的构成啊。指令宽度不等于ALU的宽度啊,只是把指令里面包含的数据送到ALU啊。
指令是 操作 ...

谢谢!我往后面看了,发现指令中的操作数的位数才是和ALU的字长相关的,指令的位数不应考虑在内

hungrywolf1987 发表于 2014-8-7 09:50:28

sbk100 发表于 2014-7-30 09:02
指令是放在flash里的,avr的flash是以字为单位的,所以一个单字指令占一个单位,avr采用流水线操作,一个时 ...

我觉得指令是指令,它和ALU的字长无关联,指令中的操作数的位数才和ALU有关联
页: [1]
查看完整版本: 关于avr怎么用1个时钟周期处理16位和32位指令的问题