尝试写一个简单的4位处理器 架构
岩倉凛IwakuraRin2024/11/24原创 计算机电子学 IP:美国

前言

从今年年初的时候开始入坑数字电路直至现在已经快一年了,期间我曾尝试使用LogicCircuit软件以及logisim等软件,跟随教程绘制了x86以及mips架构等8位处理器,最近突发奇想,也想自己写一枚处理器,原本想写一枚32位的架构,后考虑到对我这种入门不久的来说难度还是太大了,于是准备写一个4位的CPU来练练手

CPU介绍

指令格式 (16 位指令集)

15-12 位 (Opcode):操作码,用于指定操作类型,支持立即数加载、减法、跳转指令及 RAM 操作功能。

11-8 位 (ALU 输入 A):连接到 ALU 的 A 输入,也可用作跳转指令的目标地址。

7 位 (ALU 输出选择):选择 ALU 的输出目标,0 表示存入寄存器组,1 表示写入 RAM。

6 位 (寄存器 CP/CR):控制寄存器是否需要触发清除 (CP) 或复位 (CR)。

5 位 (寄存器 Cl/Pr):控制寄存器是否需要清零 (Cl) 或置满 (Pr)。

4 位 (空指令):保留位,暂未定义功能,需设为 0。

3-1 位 (寄存器选择):使用 3-to-4 解码器选择目标寄存器。若寄存器信号为 100,默认选择寄存器 1,并强制使能 EN 信号。

0 位 (空指令):保留位,暂未定义功能,需设为 0。

Opcode 功能说明 (15-12 位)

0000:将立即数加载到 ALU 的 A 输入。

0001:执行 ALU 减法或加法操作。

0010:控制寄存器的读写信号。

0100:实现程序的跳转操作。

1000:用于控制 RAM 的读写操作。

支持的指令

Jump (跳转指令)

Opcode (15-12 位): 0100

功能: 实现程序的跳转操作。这个指令通过指定 ALU 输入 A 的值作为目标地址来改变程序流。跳转操作常用于实现条件跳转或无条件跳转。

Add (加法/减法操作)

Opcode (15-12 位): 0001

功能: 执行 ALU 的加法或减法操作。指令通过 ALU 输入 A 和 B 完成加法或减法运算,结果会根据 ALU 输出选择写入寄存器组或 RAM。

Load Immediate (立即数加载)

Opcode (15-12 位): 0000

功能: 将一个立即数加载到 ALU 的 A 输入端。该操作通常用于初始化或设置寄存器值。

Register Control (寄存器控制)

Opcode (15-12 位): 0010

功能: 控制寄存器的读写信号,可以通过该指令控制寄存器的读取或写入操作。通过与寄存器选择信号一起使用,可以实现灵活的寄存器操作。

RAM Control (RAM 控制)

Opcode (15-12 位): 1000

功能: 用于控制 RAM 的读写操作。该指令通过 ALU 输入选择 RAM 地址,并执行数据的读写。

Clear/Set Register (寄存器清除/置满)

功能:

寄存器清除 (Cl): 清除寄存器内容。由控制信号 寄存器 Cl/Pr (5 位) 决定。

寄存器置满 (Pr): 将寄存器置满特定值。由控制信号 寄存器 Cl/Pr (5 位) 决定。

Clear/Reset Register (寄存器清除/复位)

功能:

寄存器清除 (CP): 通过寄存器的清除控制信号清除寄存器内容。

寄存器复位 (CR): 将寄存器重置为初始状态,通过控制信号决定。

Register Selection (寄存器选择)

功能:
使用 3-to-4 解码器根据指令中的寄存器选择字段 (3-1 位) 选择目标寄存器,并通过控制信号使能该寄存器。

logisi设计图

下图为整体的设计

  Screenshot 2024-11-24 160527.png

接下来具体介绍部分模块

Screenshot 2024-11-24 160635.png
上图为REG(寄存器组)模块 通过点对点连接直接连接到ALU部分 当ALU完成运算后会把运算结果同时给予给四个寄存器,但是只有在W信号为高电平(1)时,相对应的寄存器才会把收到的计算结果写入,否则即使收到ALU计算机结果也不会写入寄存器中(当然也可以把数据写到RAM)

Screenshot 2024-11-24 160549.png

上图为ALU模块,当收到立即数指令之后,指令集中会有四位输出给予给ALU的A输入,然后再将A直接通过ALU输出给寄存器组模块,当需要完成1+2的操作时,需要将寄存器组的内容取出然后输出给ALU B输入,然后再与立即数2进行相加操作。对于例如5+5的操作,每次都需要先把第一个加数写入寄存器后再拿出来和另一个立即数进行相加运算(个人感觉繁琐了),原本准备设计一个专用寄存器给ALU进行运算而不调用寄存器组,后来觉得太麻烦就把这个想法抛弃了。 Screenshot 2024-11-24 161728.png

上图我们介绍一下转跳指令,当指令为0010,即为转跳指令时,用于立即数输入的四位指令会变成转跳指令,其四位输出会作为转跳指令输出给PC程序计数器而不是ALU模块。


以上就是整个CPU架构的介绍了,现在整个u都还有很多bug,例如ram部分我到现在才发现它的输出没连(bushi

也欢迎各位提出意见



来自:计算机科学 / 计算机电子学
0
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
岩倉凛IwakuraRin
进士 机友 笔友
文章
7
回复
103
学术分
0
2022/03/19注册,19分46秒前活动

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:江苏
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}