Dais-CMH+实验箱扩展指令实现

2023-11-03 09:10

本文主要是介绍Dais-CMH+实验箱扩展指令实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 设计原理

算术运算

将需要计算的数放入指定寄存器中后调用不同的微操作就可以实现不同的算术运算,需要修改的仅仅是一行代码,下面以减法为例,只需要令CBA=010AN=1,S1=1,S2=1,DR0=1就可以实现DR1-DR2,并且将计算结果放入R0,即微操作为40 26 02 80。

逻辑运算

逻辑运算依旧借助于ALU实现,所以基本流程也是将需要进行逻辑运算的数放入DR1和DR2,然后修改CBA,CN,M,S0,S1,S2,S3就可以实现多种操作,下面不再给出整个微程序。

可以实现的指令

AND,OR,NOT

AND微操作40 17 02 80

OR微操作40 1D 02 80

NOT微操作40 00 02 80

移位运算

移位运算通过74LS299芯片实现,首先将需要进行移位的数值放入299芯片,即置数,然后通过控制S0,S1实现操控299实现左移和右移,通过控制M实现带进位左移和带进位右移。

移位运算的实现需要三步,第一步是将需要移位的数放入299,即A0 0C 00 90;第二步是进行移位操作,即60 04 00 50;第三步是将运算后的数取出放入寄存器,即60 00 02 80。

CALL、RET指令

微程序执行过程中执行到CALL指令时会跳转到CALL指令给出的子程序地址,即将CALL指令给出的子程序入口地址放入PC,再进行PC->AR,执行子程序,但是在跳转到子程序执行之前需要将本来要执行的下一指令的地址保存起来,然后当执行完子程序需要返回时,需要将保存的地址拿出,放入PC,再返回执行,这样就可以实现执行完子程序后继续执行原有程序的功能。

MUL、BZC指令

乘法指令通过连加实现,即将被乘数与乘数放在内存中,先将乘数取出放入R0,作为计数,即表示需要连加多少次才能实现乘法,然后将被乘数取出放入DR1和DR2,进行加法运算,将得出的结果再放入储存被乘数的内存地址中,即表示执行完乘法运算后,被乘数没有被保留,如果要保留被乘数的话,由于寄存器只有R0,DR1,DR2可用,所以需要将中间结果放入某个内存地址,其必然会更繁琐,减慢速度。接下来将R0-1再放入R0,然使用P(Z)标注测试,如果乘数变为0,表示连加完成,否则通过修改PC使其再次执行连加运算,直到R0为全0,即跳出循环,完成乘法。乘法指令这里使用的是简单方法,容易实现但效率不高,更合理的方法在下面。

 

HLT指令

HLT即停机指令,即执行到该指令就停止,不再执行其他指令,可以使其下地址执行本身地址即可。

微指令实现

例:M2C 00 00 00 34

JMP指令

JMP指令可以实现跳转到指定位置,具体实现为将JMP给出的地址放入AR,取出在RAM存储的需要跳转到的位置,放入PC,再次取指执行就可以了,JMP为无条件跳转,而且跳转后由于未保存本来要执行的下一条地址,所以无法返回。

微指令实现

20 00 60 __    ;PC→AR,PC+1

00 C0 20 80    ;RAM→PC

  1. 机器指令程序和微程序码点表

减法

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  40 09          ;LDA DR1,09H        ;

P02  60 0A          ;SUB DR1,0AH        ;

;------------以下为数据空间------------

P09  AA

P0A  55

 

M00  00 00 00 80    ;

M01 20 00 60 40    ;PC→AR,PC+1

M02 00 80 10 12    ;RAM→IR

M03 00 80 40 20    ;RAM→AR

M04 00 80 04 70    ;RAM→DR1 

M05 00 80 40 E8    ;RAM→AR    (0AH)->AR

M06 00 80 08 E0    ;RAM→DR2

M07  40 26 02 80    ;DR1-DR2->R0

M08  00 00 00 80    ;

M09  00 00 00 80    ;

M0A  20 00 60 C0    ;

M0F  00 00 00 80    ;

M10  00 00 00 80    ;

M11  00 00 00 80    ;

M12  00 00 00 80    ;

M13  00 00 00 80    ;

M14  00 00 00 80    ;

M15  00 80 08 E0    ;

M16  00 80 08 E0    ;

M17 00 80 08 E0    ;RAM→DR2

可以实现的指令

ADD,SUB,ADC,SBC

依旧将需要计算的数放入DR1和DR2,最后修改的只是进行计算的那一行微操作。

ADD微操作50 29 02 80

SUB微操作40 26 02 80

ADC微操作50 09 02 80

SBC微操作50 06 02 80

299右移

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  40 09          ;LDA R0,09H        ;

P02  60             ;RR   R0       ;

;------------以下为数据空间------------

P09  55

 

M00  00 00 00 80    ;

M01 20 00 60 40    ;PC→AR,PC+1

M02 00 80 10 12    ;RAM→IR

M03  00 80 40 20    ;RAM-AR,QU09

M04  00 80 04 80    ;RAM-DR1

M08  A0 0C 00 90    ;DR1-299,TO 09

M09  60 04 00 50    ;<<1 55-54

M0A  60 00 02 80    ;299-DR

M0B  20 00 60 A0    ;

M0C  20 00 60 C0    ;

M0D  00 00 00 80    ;

M0E  20 00 60 10    ;PC-AR ,TO 08

M0F  00 00 00 80    ;

M10  60 00 02 80    ;299-DR1

M11  00 00 00 80    ;

M12  00 00 00 80    ;

M13  00 00 00 80    ;

M14  00 00 00 80    ;

M15  00 80 08 E0    ;

M16  00 80 08 E0    ;

M17  00 80 08 E0    ;

可以实现的指令

SHR,SHL

SHR微操作60 04 00 50

SHL微操作60 08 00 50

CALL、RET指令

;CALL

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  40 0B          ;LDA R0,0BH        ;

P02  60             ;SUB   R0       ;

P03  80 23          ;CALL 23H        ;

P05  60             ;SUB   R0       ;

;------------->->->->->->->------------

P0A  55

P0B  AA

P0C  55

;------------->->->------------

P23  A0 0A          ;LDA 0A,DR1

P25  90 0A         ;ADD 0A,DR1

P27  70            ;RET

 

 

M00  00 00 00 80    ;->->->

M01  20 00 60 40    ;PC->AR,PC+1

M02  00 80 10 12    ;RAM->IR

M03  00 80 40 20    ;RAM->AR

M04  00 80 02 80    ;RAM->R0

M05  80 00 04 60    ;R0->DR1

M06  50 2F 02 80    ;DR1-1->R0

M07  50 29 02 80    ;

M0D  60 04 00 48    ;299

M0E  00 00 00 A0    ;PC->AR,PC+1

M0F  00 00 00 58    ;PC->AR,PC+1

M10  60 08 00 48    ;

M11  00 80 08 48    ;RAM->DR2

M12  E0 00 04 C8    ;SP->DR1

M13  42 2F 00 28    ;DR1-1->SP

M14  40 2F 40 84    ;DR1-1->AR qu 21

M15  40 55 20 80    ;DR2->PC

M16  00 80 40 E8    ;RAM->AR

M17  00 80 04 80    ;RAM->DR1

M18  00 80 40 98    ;RAM->AR

M19  40 A3 01 80    ;DR1+DR1->RAM

M1A  E0 00 04 D8    ;SP->DR1

M1B  42 00 00 38    ;DR1+1->SP

M1C  40 20 40 B8    ;DR1->AR

M1D  00 C0 20 80    ;RAM->PC

M1E  00 00 00 80    ;(CY.Z=0->->)

M1F  00 00 80 72    ;(CY.Z=1)

M20  00 00 02 81    ;SW->Rd

M21  20 80 01 A8    ;Rd->299    qu 15

M22  20 00 60 20    ;PC->AR,PC+1

M23  20 00 60 88    ;PC->AR,PC+1

M24  20 00 60 10    ;PC->AR,PC+1

M25  04 00 00 8E    ;0->ED,

M26  20 00 60 50    ;PC->AR,PC+1

M27  20 00 60 1C    ;PC->AR,PC+1

M28  20 00 40 30    ;PC->AR

M29  04 40 00 80    ;1->EA,

M2A  A0 0C 00 B0    ;Rd->299

M2B  04 00 00 80    ;0->EA,

M2C  A0 0C 00 F0    ;Rd->299

M2D  A0 00 04 58    ;Rd->DR1

M2E  A0 0C 00 08    ;Rd->299

M2F  20 00 60 D8    ;PC->AR,PC+1

M30  00 00 00 80    ;

M31  E0 00 04 4C    ;SP->DR1

M32  42 00 00 CC    ;DR1+1->SP

M33  40 20 40 6C    ;DR1->AR

M34  80 00 04 AC    ;Rs->DR1

M35  50 06 00 18    ;DR1-DR2

M36  00 C0 20 80    ;RAM->PC

M37  00 00 00 80    ;

M38  00 80 02 80    ;RAM->Rd

M39  00 00 00 80    ;

M3A  00 00 00 80    ;

M3B  00 00 00 80    ;

M3C  00 00 08 C9    ;SW->DR2

M3D  40 6F 20 3C    ;DR1-1->PC

M3E  20 00 04 BC    ;PC->DR1

M3F  04 40 00 7E    ;1->ED,

 

MUL、BZC指令

;乘法

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  400B          ;LDA  R0,0BH       ;

P02  700A          ;LDA  DR1,0AH       ;

P04  800A          ;ADD  0AH       ;

P06  A0             ;SUB   R0       ;

P07  90             ;BZC             ;

;------------->->->->->->->------------

P0A  03

P0B  02

P0C  55

 

 

 

M00  00 0000 80    ;

M01  20 0060 40    ;PC-AR,PC+1

M02  00 8010 12    ;RAM-IR

M03  00 8040 20    ;RAM-AR

M04  00 8002 80    ;RAM--R0

M05  80 0004 60    ;R0-DR1

M06  50 2F02 80    ;DR1-1->R0

M07  50 2902 80    ;

M0D  60 0400 48    ;299->->

M0E  20 0004 5C    ;PC->DR1 ==3A

M0F  20 0060 68    ;PC->AR,PC+1

M10  60 0800 48    ;

M11  00 8040 48    ;RAM->AR

M12  40 A301 80    ;DR1+DR1->RAM

M13  80 0004 28    ;R0->DR1

M14  50 2F02 F8    ;DR1-1->R0

M15  40 5520 80    ;

M16  00 8040 E8    ;RAM-AR

M17  00 8004 80    ;RAM-DR1

M18  00 8040 98    ;RAM->AR

M19  40 A301 80    ;DR1+DR1->RAM

M1A  E0 0004 D8    ;SP->DR1

M1B  42 0008 38    ;DR1+1->SP

M1C  40 2040 B8    ;DR1->AR

M1D  00 C020 80    ;RAM->PC

M1E  00 0000 80    ;(CY.Z=0->->)

M1F  00 0080 72    ;(CY.Z=1)

M20  00 0002 81    ;

M21  A0 0C00 C0    ;

M22  20 0060 20    ;

M23  20 0060 88    ;

M24  20 0060 10    ;

M25  04 0000 8E    ;

M26  20 0060 50    ;PC->AR,PC+1

M27  20 0060 1C    ;PC->AR,PC+1

M28  20 0040 30    ;PC->AR

M29  04 4000 80    ;

M2A  A0 0C00 B0    ;Rd->299

M2B  04 0000 80    ;

M2C  A0 0C00 F0    ;Rd->299

M2D  A0 0004 58    ;Rd->DR1

M2E  A0 0C00 08    ;Rd->299

M2F  20 0060 D8    ;PC->AR,PC+1

M30  00 0000 80    ;

M31  E0 0004 4C    ;SP->DR1

M32  42 0000 CC    ;DR1+1->SP

M33  40 2040 6C    ;DR1->AR

M34  80 0004 AC    ;

M35  50 0600 18    ;

M36  00 C020 80    ;

M37  00 0000 80    ;

M38  00 8002 80    ;

M39  00 0000 80    ;

M3A  40 6F04 DC    ;DR1-1->DR1   F0

M3B  40 6F04 3C    ;DR1-1->DR1

M3C  40 6F04 BC    ;DR1-1->DR1

M3D  40 6F20 F0    ;DR1-1-DR1

M3E  40 6F20 F0    ;DR1-1->PC

M3F  04 4000 7E    ;

这篇关于Dais-CMH+实验箱扩展指令实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337127

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja