8位二进制cpu的设计和制作(二)

四、8位二进制cpu的设计和制作

1、程序计数器和内存

在这里插入图片描述
2、微程序控制
程序计数器PC
在这里插入图片描述
产生二进制文件ins.bin。用于导入微控制模块的ROM

import os            #os库是Python标准库,包含几百个函数,常用路径操作、进程管理、环境参数等几类。os.path子库以path为入口,用于操作和处理文件路径。
                     # 路径操作:os.path子库,处理文件路径及信息

dirname = os.path.dirname(__file__)          #函数op.dirname(path)返回path中的目录名称,函数os.path.dirname(__file__)可以获取当前运行脚本的绝对路径  
filename = os.path.join(dirname, 'ins.bin')  #函数op.join(path, *paths)组合path与paths,返回一个路径字符串
print(dirname)
print(filename)
                                             #幂 运算,10**21 表示1021次方
WE_A = 2 ** 0  # 1
CS_A = 2 ** 1  # 1x

WE_B = 2 ** 2  # 1xx
CS_B = 2 ** 3

WE_C = 2 ** 4  # 1xx
CS_C = 2 ** 5

ALU_ADD = 0
ALU_SUB = 2 ** 6
ALU_OUT = 2 ** 7

WE_M = 2 ** 8
CS_M = 2 ** 9

WE_PC = 2 ** 10
EN_PC = 2 ** 11
CS_PC = 2 ** 12

HLT = 2 ** 15

micro = [                                    #python中的一维数组:list1=[1,2,3];二维数组:tuple1 = ([1,2,3],[4,5,6],[7,8,9])
    CS_M | CS_A | WE_A | WE_PC | EN_PC | CS_PC,      #python按位与或非|&~
    CS_M | CS_B | WE_B | WE_PC | EN_PC | CS_PC,
    ALU_SUB | ALU_OUT | CS_C | WE_C,
    CS_C | WE_M | CS_M | WE_PC | EN_PC | CS_PC,
    HLT,
]

with open(filename, 'wb') as file:                  #当with as代码块结束时,程序自动关闭打开的文件。wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    for value in micro:                               #遍历序列micro的项目
        result = value.to_bytes(2, byteorder='little')   #函数value.to_bytes(2, byteorder='little')返回整数value所表示的有2元素的字节数组
        file.write(result)                               #返回写入的字符长度 向文件写入数据(要写入文件的字符串)
        print(value, result)

print('Finish compile!!!')

result = HLT.to_bytes(2, byteorder='big')
print(result)

关键库函数

to_bytes()

int.to_bytes(length, byteorder, *,signed=False)返回一个整数的字节数组,是Python3.1新增加的功能

参数含义:
length: 整数字节数,如果不能用给定的字节数来表示则会引发OverflowError
byteorder: 确定用于表示整数的字节顺序,byteorder为’big’表示最高位字节放在字节位开头。byteorder为’little’表示最高位字节放在字节数组的末尾。
signed: 是否使用二进制补码来表示整数,如果signed为False并且给出的是负整数,则会引发OverflowError。默认值为False

>>> a = 1024
>>> a.to_bytes(2, byteorder='big')
b'\x04\x00'
>>> a.to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> a.to_bytes(10, byteorder='big', signed=True)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> b = -1024
>>> b.to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>>> c = 1000
>>> c.to_bytes((c.bit_length()+7)//8, byteorder='little')
b'\xe8\x03'

运行结果:

[Running] python -u "c:\Users\李杰\Desktop\computer-main\computer-main\cpu\19 微程序控制\ins.py"
c:\Users\���\Desktop\computer-main\computer-main\cpu\19 ΢�������
c:\Users\���\Desktop\computer-main\computer-main\cpu\19 ΢�������\ins.bin
7683 b'\x03\x1e'
7692 b'\x0c\x1e'
240 b'\xf0\x00'
7968 b' \x1f'
32768 b'\x00\x80'
Finish compile!!!
b'\x80\x00'

[Done] exited with code=0 in 0.26 seconds

Python-数字总结(操作符、方法、内置函数、模块[四舍五入、分数]

在这里插入图片描述

2、逻辑运算

8位的数据A和B相结果输出到O
在这里插入图片描述
8位的数据A和B相结果输出到O
在这里插入图片描述
8位的数据A和B相异或结果输出到O
在这里插入图片描述

当然也可以像前面的与,或,异或;换一个非门
在这里插入图片描述

3、程序状态字(溢出位,奇偶校验位,奇偶标志位,此位为1是奇数,为0是偶数)

在这里插入图片描述

4、寄存器控制器(控制寄存器的读写)

两位控制读写原理:寄存器中CS,DS,SS,ES,VEC,T1,T2,A,B,C,D,DI,SI,SP,BP,MSR,MAR,MDR,MC,IR,DST,SRC这些的两位读写控制,低位是写端值,高位时读与写异或后的值。
这两位读写控制位输送给一字节的寄存器读写模式控制端IO
一字节的寄存器读写模式控制端IO将2位数据,一位输送给WE,另一位输送给CS
WE:一字节的寄存器读写模式的选择(信号)按钮
CS:cs信号等于1时,一字节的寄存器能被触发;cs信号等于0时,一字节的寄存器不能被触发

在这里插入图片描述

5、CPU框架

在这里插入图片描述

6、CPU控制器

cpu的组成:1、寄存器,用来暂存指令数据等处理对象;2、控制器,把内存上的指令、数据等读入寄存器;3、运算器,负责运算从内存读入寄存器的数据;4、时钟,负责发出CPU开始计时的时钟信号。

8位二一选择器:8位输入A与B,en=1,输出A端的8位数据:en=0,输出B端的8位数据

CPU控制器读内存的指令寄存器的指令来控制CPU

在这里插入图片描述

五、笔记

在这里插入图片描述

引脚标识的一般含义
A: 8位二进制加法器的8位输入
B: 8位二进制加法器的8位输入
O:8位二进制加法器的8位结果输出端(需要使能位使能)
S:8位二进制加法器的8位结果输出端(不需要使能位使能)
CO:8位二进制加法器的输出进位值
CI:8位二进制加法器的输入进位值

OP:取反器的使能(信号)按钮
CP:D边沿触发器的上升沿触发(信号)按钮

DI:一字节存储器的数据输入端
DO:一字节存储器的数据输出端
Clear:一字节存储器的清零(信号)按钮
Pre:一字节存储器的预设输入端
DO:一字节存储器的的数据输出端
EN:一字节存储器的允许触发(信号)按钮

CL:一字节的寄存器的清零(信号)按钮
W:一字节的寄存器的读模式设置(信号)按钮
R:一字节的寄存器的数据输出使能(信号)按钮(前提已经按动了寄存器的读模式(信号)按钮)
WE:一字节的寄存器读写模式的选择(信号)按钮
CS:cs信号等于1时,一字节的寄存器能被触发;cs信号等于0时,一字节的寄存器不能被触发
IO:一字节的寄存器读写模式控制端,将2位数据,一位输送给WE,另一位输送给CS,
-----最终低位为1时,寄存器为写模式;此时高位必须为1,以允许时钟触发写入数据
-----------------为0时,寄存器为读模式;此时高位必须为1,以允许输出数据
即11写,10读

W:16位的高位交叉编址存储器的数据输入使能(信号)按钮
R:16位的高位交叉编址存储器的数据输出使能(信号)按钮
A:16位的高位交叉编址存储器的地址总线

ALU:算术逻辑单元的与,或,异或,非的四选一的结果输出端
PWS:算术逻辑单元计算前后溢出位,奇偶校验位,奇偶标志位的值的输出端,共4位最高位恒为0
OP:算术逻辑单元用于与,或,异或,非的四选一的输入数据端
CL:清零算术逻辑单元计算前后溢出位,奇偶校验位,奇偶标志位的值
CP:触发更新算术逻辑单元计算前后溢出位,奇偶校验位,奇偶标志位的值

PC或EN:程序计数器的3位输入,这3位输入可以决定读写模式选择和开启关闭循环累加:
-----------1)是否启动用程序计数器,程序计数器会用DI端的值更新计数器的当前计数值,再每个时钟加1(2位)
-----------2)控制对当前计数值的读写(0~1位)
例子:a、PC或EN=111(B)就是开启计数器的当前计数值,处于写模式,计数器的加1计算器开启,即加1计算器可以用时钟触发加1

b、
磁盘RAM计数器EN端的三位输入位为010,高位0代表计数器关闭循环累加,低2位10代表计数器读写模式选择读,低2位是PC的寄存器的两位读写控制位(11写,10读),高1位是选择PC输入数据到PC寄存器,还是选择PC加法器输出数据到PC寄存器(1输出,0输入)。
磁盘RAM计数器EN端的三位输入位为011,高位0代表计数器关闭循环累加,低2位11代表计数器读写模式选择写
磁盘RAM计数器EN端的三位输入位为111,高位1代表计数器开启循环累加,低2位11代表计数器读写模式选择写

I1:CPU控制器的–输入:指令寄存器的8位输出
I2:CPU控制器的–输入:目的操作寄存器的8位输出
I3:CPU控制器的–输入:源操作寄存器的8位输出
SYC:CPU控制器的32位微指令中的4位地址位
A:CPU控制器的–输出:输出:指令寄存器的8位输出+恒为0位,溢出位,奇偶校验位,奇偶标志位+程序计数器的低4位
D:CPU控制器的–输入:内存的某个32位存储单元
HLT:CPU控制器的–输出:控制时钟信号的打开和关闭

8位二进制CPU的设计和实现CPU基本电路的实现1
8位二进制CPU的设计和实现CPU微机架构的实现2
8位二进制CPU的设计和实现3

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 深入掌握CPU的工作原理,包括ALU、控制器、寄存器、存储器等部件的工作原理; 2. 熟悉和掌握指令系统的设计方法,并设计简单的指令系统; 3. 理解和掌握小型计算机的工作原理,以系统的方法建立起整机概念; 4. 理解和掌握基于VHDL语言和TEC-CA硬件平台设计模型机的方法。 设计要求   参考所给的16位实验CPU设计与实现,体会其整体设计,并理解该CPU的工作原理。在此基础上,对该16位的实验CPU(称为参考CPU)进行改造,以设计得到一个8位CPU。总的要求是将原来16位的数据通,改成8位的数据通,总的要求如下: 将原来8位的OP码,改成4位的OP码; 将原来8位的地址码(包含2个操作数),改成4位的地址码(包含2个操作数)。   在上述总要求的基础上,对实验CPU的指令系统、ALU、控制器、寄存器、存储器进行相应的改造。具体要求如下: 修改指令格式,将原来指令长为16位的指令格式改成8位的指令长格式; 设计总共16条指令的指令系统。此指令系统可以是参考CPU指令系统的子集,但参考CPU指令系统中A组和B组中的指令至少都要选用2条。此外,常见的算术逻辑运算、跳转等指令要纳入所设计的指令系统; 设计8位的寄存器,每个寄存器有1个输入端口和2个输出端口。寄存器的数量受控于每一个操作数的位数,具体要看指令格式如何设计设计8位的ALU,具体要实现哪些功能与指令系统有关。设计时,不直接修改参考CPU的VHDL代码,而是改用类似之前基础实验时设计ALU的方式设计设计8位的控制逻辑部件,具体结合指令功能、硬布线逻辑进行修改; 设计8位的地址寄存器IR、程序计数器PC、地址寄存器AR; 设计8位的存储器读写部件。由于改用了8位的数据通,不能直接采用DEC-CA平台上的2片16位的存储芯片,需要按照基础实验3的方法设计存储器。此种方法不能通过DebugController下载测试指令,因此测试指令如何置入到存储器中是一个难点。设计时,可以考虑简单点地把指令写死在存储器中(可用于验证指令的执行),然后用只读方式读出来;或者考虑在reset的那一节拍里,实现存储器中待测试指令的置入; (可选项)设计8位的数据寄存器DR; (可选项)不直接设计存储器RAM,而是采用DEC-CA平台上的2片16位的存储芯片.在实现了第9个要求的基础上,实现由Debugcontroller置入待测试指令; (可选项)顶层实体,不是由BDF方式画图实现,而是用类似基础实验4(通用寄存器组)中设计顶层实体的方式,用VHDL语言来实现。 (可选项)自己设想   利用设计好的指令系统,编写汇编代码,以便测试所有设计的指令及指令涉及的相关功能。设计好测试用的汇编代码后,然后利用Quartus II软件附带的DebugController编写汇编编译规则。接着,利用DebugController软件把汇编编译之后的二进制代码置入到所采用的存储器中,并对设计好的8位CPU进行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值