差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
oc8051软核 [2018/09/12 10:34]
group003 [2 模块描述]
oc8051软核 [2018/09/12 17:47] (当前版本)
group003 [参考来源]
行 267: 行 267:
 {{::​oc8051-指令执行.gif|}} \\ {{::​oc8051-指令执行.gif|}} \\
 大多数指令的执行过程如上所述。 程序跳转指令和程序存储器读取指令(MOVC)例外。在接下来的章节中,我们将介绍指令组及其特定功能。 大多数指令的执行过程如上所述。 程序跳转指令和程序存储器读取指令(MOVC)例外。在接下来的章节中,我们将介绍指令组及其特定功能。
-3.1 算术和逻辑指令+===3.1 算术和逻辑指令===
 这些指令的主要特征是我们必须定义ALU操作数和ALE运算。 除了两个例外:MUL(乘法)指令Div(除)指令。 这两个指令的不同之处在于结果。 当执行MUL或DIV时,我们得到16位结果,其中一半保存到B寄存器(result1),后半部分(result2)保存到ACC。 如果结果通常写入B寄存器,则设置wad2信号,并将第二个结果写入ACC,即可实现此目的。\\ 这些指令的主要特征是我们必须定义ALU操作数和ALE运算。 除了两个例外:MUL(乘法)指令Div(除)指令。 这两个指令的不同之处在于结果。 当执行MUL或DIV时,我们得到16位结果,其中一半保存到B寄存器(result1),后半部分(result2)保存到ACC。 如果结果通常写入B寄存器,则设置wad2信号,并将第二个结果写入ACC,即可实现此目的。\\
 另一个例外是INC DPTR指令,它对16位DPTR寄存器进行寻址。 前8位宽的值被发送给ALE source3,0被转发到source2,输入进位被设置为1,然后运算执行。\\ 另一个例外是INC DPTR指令,它对16位DPTR寄存器进行寻址。 前8位宽的值被发送给ALE source3,0被转发到source2,输入进位被设置为1,然后运算执行。\\
行 288: 行 288:
 -       ​RRC ​      ​rotation right with carry\\ -       ​RRC ​      ​rotation right with carry\\
 -       ​SWAP ​   swap bits\\ -       ​SWAP ​   swap bits\\
- +===3.2 ​ 数据传输指令=== 
- +该组包含不更改数据值的指令,它们只是将数据传输到另一个内存位置。 ALU操作固定为oc8051_alu_nop,它仅将数据从输入传输到输出,从而将数据写入所需位置。 例外是使用ALE操作oc8051_alu_xch的switdh指令(XCH和XCHD)。\\ 
-\\ +该指令组还包含外部存储器处理的指令。 下图显示了管理外部数据存储器的内核细节。 读取地址选择oc8051_ext_addr_sel multiplekser,输入数据在下一个时钟周期可用。 数据像multikser上的选项一样可用,我们选择ALE源1.通过正常程序,数据被写入内部存储器。 写入时我们只需要地址和write_x信号,输出引脚上应该有来自ACC的信号。\\ 
-===参考===: \\ +{{::​oc8051-数据传输指令.gif|}}\\ 
-opencores的设计文档 ​oc8051_design ​>  ​\\ +特殊指令也用来从程序存储器传送数据。这次使用另一个选择器(oc8051_rom_addr_sel)来选择地址,该选择器不会发送PC 的值,而是发送ALU 运算结果给输出。下一时钟周期收到的数据作为立即操作数。这个指令花费两个时钟周期。\\ 
-李全利老师主编的《单片机原理及接口技术》 \\  +- MOV\\ 
-网友oldbeginner的开源软核学习笔记:http://​xilinx.eetop.cn/​space.php?​uid=1214938&​op=bbs \\ +- PUSH\\ 
-网友leishangwen的《DE2上使用OC8051运行点灯程序》:  \\ +- POP\\ 
-https://​download.csdn.net/​download/​leishangwen/​5173363 \\ +- XCH\\ 
-由于水平所限,难免有不对之处,欢迎指正。 \\+- XCHD\\ 
 +===3.3 位操作指令=== 
 +位操作指令和逻辑运算指令类似,区别在于他们用位输入和ALU进位代替了ALU 输入,结果可以通过ALU 输出。\\ 
 +使用位指令时,需要特别留意选择ALU运算。利用oc8051_cy_select选择ALU的进位输入,我们有四个选项:PSW (PSW.7),空间的位输出,逻辑1或逻辑0。\\ 
 +前两个选项用在运算中,后两个用给特定位的置位(或复位)\\ 
 +{{::​oc8051-位操作指令.gif|}}\\ 
 +该组还包含跳转指令(JC,JNC,JB,JNB和JBC),下一节将对此进行更详细的描述。\\ 
 +Other instructions in this group are:\\ 
 +-       ​ANL\\ 
 +-       ​ORL\\ 
 +-       ​MOV\\ 
 +-       ​CLR\\ 
 +-       ​SETB\\ 
 +-       ​CPL\\ 
 +===3.4 程序跳转=== 
 +转移指令和其它指令不太类似。这些指令改变PC 值,以致不得不停止流水线,等待从新地址取得第一条指令。利用花费时间的不同,将这类指令分成三组:\\ 
 +第一组指令需要两个时钟周期。这组指令让新的PC 值作为立即操作数。利用这组指令,新的数值被写入 PC,然后等待新的指令。\\ 
 +第二组指令需要三个时钟周期。该组指令是变址寻址(间接)转移指令,它是将累加器A中的8位数和数据指针DPTR中的16位数相加,形成16位的转移目标地址送给PC,而不改变A和DPTR的内容,不影响标志位。\\ 
 +Instructions in this group are:\\ 
 +-       ​JC\\ 
 +-       ​JNC\\ 
 +-       ​JB\\ 
 +-       ​JNB\\ 
 +-       ​JBC\\ 
 +-       ​SJMP\\ 
 +-       ​JMP\\ 
 +-       ​JZ\\ 
 +-       ​JNZ\\ 
 +最后一组指令需要四个时钟周期。\\ 
 +These instructions are:\\ 
 +-       CJNE, 类似于前一组的指令,但需要另一个时钟周期来设置进位标志\\ 
 +-       ​RET\\ 
 +-       ​RETI\\ 
 +===3.5 寻址模式=== 
 +控制寻址模式的有两个模块:oc8051_ram_rd_sel 和 oc8051_ram_wr_sel。\\ 
 +利用这两个模块,我们可以选择要读取的地址或要写入的地址。操作数利用oc8051_immediate_sel 选择。\\ 
 +利用 oc8051_alu_src1_sel 和 oc8051_alu_src2_sel ,可以选择是从数据存储器或是ACC或是理解操作数中,读取数据\\ 
 +不同的寻址模式:\\ 
 +- 直接寻址:我们选择具有多路复用器的直接地址(读取OC8051_RRS_D - 操作数2,写入OC8051_RWS_D操作数2和OC8051_RWS_D3操作数3),并将来自程序存储器的数据发送到总线。\\ 
 +- 间接寻址:对于间接寻址,使用来自所选寄存器组的寄存器R0和R1,模块oc8051_indi_addr用于此,模块保存可能有用的寄存器,然后考虑选择哪个寄存器组,操作码的最后一位选择寄存器我们可能需要。用于地址选择的多用户(oc8051_RRS_I和oc8051_RWS_I)必须设置为间接寻址。堆栈管理也属于这组指令。使用模块oc8051_RRS_SP和oc8051_RWS_SP,我们在寻址总线上获得堆栈指针值,模块oc8051_sp用于增加或减少指针值。\\ 
 +- 寄存器寻址:当我们使用寄存器寻址时,必须使用OC8051_RRS_RN和OC8051_RWS_RN多路复用器选择地址。最后的物理地址从操作码的最后三位和两位用于选择寄存器组。高三位始终为零。\\ 
 +- 特殊寄存器寻址:这些指令主要针对累加器。选择ACC读取ALU源选择复用器。使用oc8051_ram_wr_sel 复用器选择写入ACC,这提供ACC写入作为选项之一(OC8051_RWS_ACC)。还有一些特定于B寄存器或DPTR的指令。该指令在oc8051_op_select模块中被截获,所需地址被放入第二结果总线并被视为直接寻址。\\ 
 +- 立即数寻址:在此寻址模式下,常量的值跟在操作码之后。由于限制,总是从内存中传递三个字节,因此它们也是立即可用的。我们选择与oc8051_immediate_sel 复用器一起使用哪一个,然后选择ALU源的立即操作数。该组还包括程序计数器,因此它也可用于调用子程序和相对寻址。\\ 
 +- 索引寻址:该寻址模式仅在寻址程序存储器时使用。在此模式下,使用oc8051_rom_addr_sel 复用器。在计算下一个地址时,将发送ALE结果而不是PC。数据在下一个时钟周期中作为立即操作数被接收。\\ 
 +{{::​oc8051-寻址模式.gif|}}\\ 
 +====4 中断==== 
 +由模块oc8051_int管理中断处理。 该模块截取中断,定义中断程序的地址并向下一个模块发送中断请求。 如果中断被启用且没有更高(或相同)优先级的任何一个已经处理,则模块设置int信号并将中断程序地址写入int_v总线。 该中断请求被发送到oc8051_op_select模块,该模块停止当前程序的执行并开始执行LCALL指令。 当中断程序结束时(使用RETI指令),oc8051_decoder设置reti信号并与oc8051_int模块通信中断处理完成,因此程序可以在此优先级上中断\\ 
 +{{::​oc8051-中断.gif|}} 
 +====仿真和移植==== 
 +{{::​使用quartus和modelsim仿真oc8051.pdf|}} 
 +====参考来源==== 
 +  * opencores的设计文档{{::oc8051_design.doc|}} ​\\ 
 +  ​* ​李全利老师主编的《单片机原理及接口技术》 \\  
 +  ​* ​网友oldbeginner的开源软核学习笔记:http://​xilinx.eetop.cn/​space.php?​uid=1214938&​op=bbs \\ 
 +  ​* ​网友leishangwen的《DE2上使用OC8051运行点灯程序》:https://​download.csdn.net/​download/​leishangwen/​5173363 \\ 
 +  ​* ​由于水平所限,难免有不对之处,欢迎指正。 \\