分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
基于微程序设计的嵌入式CISC CPU模型的实现
一、课程设计的题目
A类:输入包含10个整数(8位二进制补码表示)的数组M(采用RAM),输出最小的负数。
二、嵌入式CISC模型机数据通路框图
三、微程序控制器(CISC模型机)的逻辑结构框图
说明:
在T4内形成微指令的微地址,并访问控制存储器,在T2的上边沿到来时,将读出的微指令打入微指令寄存器,即图中的微命令寄存器和微地址寄存器。
四、模型机的指令系统和指令格式
(1)I/O指令
输入(IN1)指令采用单字节指令,其格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
× × |
Rd |
输出(OUT1)
7 6 5 4 |
3 2 |
1 0 |
操作码 |
Rs |
× × |
Rs指源寄存器,Rd指目的寄存器。
(2)自增指令
7 6 5 4 |
3 2 |
1 0 |
操作码 |
× × |
Rd |
(3)转移指令
条件转移指令(JB、JN)和无条件转移指令(JMP)采用单字节指令
7 6 5 4 |
3 2 |
1 0 |
操作码 |
× × × × |
|
地 址 |
说明:“地址”中的值就是要转移的地址值
(4)比较指令(CMP)和MOV指令
比较指令(CMP)和MOV1采用单字节指令,格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
Rs |
Rd |
MOV采用双字节指令,格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
× × |
Rd |
地 址 |
(5)寄存器间传送指令
MOV3采用单字节指令,格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
Rs |
Rd |
MOV采用双字节指令,格式如下:
(6)寄存器间址寻址送指令
MOV1采用单字节指令,格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
[Rs] |
Rd |
MOV2采用单字节指令,格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
Rs |
[Rd] |
(7)负数测试指令
TEST采用单字节指令,格式如下:
7 6 5 4 |
3 2 |
1 0 |
操作码 |
× × |
Rd |
由此可见,共有12条基本指令,下表列出了每条指令的格式、汇编符号和指令功能。
助记符号 |
指令格式 |
功能 |
||||||
TEST Rd |
|
测试 Rd 寄存器中的值是否为负数 |
||||||
MOV3 Rs ,Rd |
|
(Rs)→(Rd) |
||||||
IN1 Rd |
|
将数据存到 Rd 寄存器 |
||||||
MOV Rd, data |
|
data→Rd |
||||||
MOV1 [Rs], Rd |
|
[Rs]→(Rd) |
||||||
MOV2 Rs, [Rd] |
|
(Rs)→[Rd] |
||||||
CMP Rs, Rd |
|
(Rs) – (Rd),锁存 CY 和 ZI |
||||||
JB addr |
|
若小于,则 addr→PC |
||||||
JN addr |
|
若为负,则 addr→PC |
||||||
INC Rd |
|
(Rd) + 1→Rd |
||||||
JMP addr |
|
addr→PC |
||||||
OUT Rs |
|
(Rs)→LED |
说明:
①对Rs和Rd的规定:
Rs或Rd |
选定的寄存器 |
0 0 |
R0 |
0 1 |
R1 |
1 0 |
R2 |
1 1 |
R3 |
②模型机规定数据的表示采用定点整数补码表示,单字长为8位,其格式如下:
7 |
6 5 4 3 2 1 0 |
符号位 |
尾数 |
五、机器指令的微程序流程图
六、嵌入式CISC模型机的顶层电路图
七、汇编语言源程序
同给出的题目编写汇编语言源程序。算法思想为:R0寄存器初始化为1,R1寄存器初始化为11,R3寄存器存入输入的数据,然后将R3中的数存入以R0寄存器中的数为地址的RAM中,R0寄存器自增一,再和R1寄存器中的数进行比较,如果小于则再输入下一个数,如此循环十次,把输入的十个数存入RAM中。当R0寄存器中数和R1中相等时,则进入负数判定和负数间的比较。
R0寄存器初始化为1,R1寄存器初始化为11,R2寄存器初始化为FF(即-1)。把RAM中以R0中的数为地址的的数取出来放在R3中,然后R0自增一,为取下一个数做准备,同时判断是否已经取完了十个数。接下来测试R3中的数时候为负数,如果不是则跳到L1处从RAM中取下一个数。如果是负数,则和R2中的数进行比较。如果R3中的数比R2中的数大,则跳到L1处从RAM中取下一个数,否则将R2中的数替换为R3中的数。即,每次比较完后R2中都保存的是最小的负数。如此循环十次,最后输出R2中的数,即最小的负数。
MOV R0,1 /将立即数1→R0 MOV R1,11 /将立即数11→R1(R2用于计数)L1: IN1 R3 /R3保存输入的数据 MOV2 R3,[R0] /写RAM,地址保存在R0中 INC R0 /R0自加一 CMP R0,R1 /将R1中的数与R0中的数进行比较,锁存CY/FC和ZI/FZ JB L1 /小于,则转到L1处执行 MOV R0,1 /将立即数1→R0 MOV R1,11 /将立即数11→R0 MOV R2,FFH /将立即数FFH→R0L2: MOV1 [R0],R3 /读RAM,地址保存在R0中 INC R0 /R0中的数自加一 CMP R1,R0 /将R1中的数与R0中的数进行比较,锁存CY/FC和ZI/FZ JB L5 /小于,则转到L5处执行 TEST R3 /测试R3中的数是否为负数 JN L3 /R3中的数是负数时,则跳到L3执行 JMP L2 /无条件转到L2处执行,继续从RAM中取下一个数L3: CMP R3,R2 /将R3中的数与R1中的数进行比较,锁存CY/FC和ZI/FZ JB L4 /小于,则转到L4处执行 JMP L2 /无条件转到L2处执行,继续从RAM中取下一个数L4: MOV3 R3,R2 /把R3中的数保存到R2中,R2一直保存的是最小的负数 JMP L2 /无条件转到L2处执行L5: OUT1 R2 /输出R2中的最小负数 JMP L5 /循环输出
八、机器语言源程序
根据设计的指令格式,将汇编语言源程序手工转换成机器语言源程序,并将其设计到模型机中的ROM中去。汇编语言源程序对应的机器语言源程序如下:
//助记符 地址(十六进制) 机器代码 机器代码十六进制 功能 MOV R0,1 00 01110000 70 1→R0 01 00000001 01 MOV R1,11 02 01110001 71 11→R1 03 00001011 0B L1: IN1 R3 04 01100011 63 (SW)→R3 MOV2 R3,[R0] 05 10011100 9C R3→[R0] INC R0 06 11010000 D0 (R0)+1→R0 CMP R0,R1 07 10100001 A1 (R0)-(R1) JB L1 08 10110000 B0 L1→PC 09 00000100 04 MOV R0,1 0A 01110000 70 1→R0 0B 00000001 01 MOV R1,11 0C 01110001 71 11→R1 0D 00001011 0B MOV R2,FFH 0E 01110010 72 FF→R2 0F 11111111 FF L2: MOV1 [R0],R3 10 10000011 83 [R0]→R3 INC R0 11 11010000 D0 (R0)+1→R0 CMP R1,R0 12 10100100 A4 (R1)-(R0) JB L5 13 10110000 B0 L5→PC 14