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

前言

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

副:评论区的视频介绍链接失效

新B站介绍视频

『手搓CPU第一期』记录用logisim进行仿真以及准备FPGA验证_哔哩哔哩_bilibili

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

也欢迎各位提出意见



[修改于 8天10时前 - 2024/11/26 23:50:16]

来自:计算机科学 / 计算机电子学
11
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
岩倉凛IwakuraRin 作者
10天9时前 IP:美国
939756

22222222222222222222222.png

今天晚上把指令重新进行了优化 去掉了Cl/Pr的功能 多余4位作为后续可拓展指令,原来按照x86架构的想法写的寄存器所以把prcl写进去了,后来觉得根本就没必要(

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith
10天1时前 IP:广东
939757

mips和x86都是32位的, 其实如果用软件模拟或者FPGA实现, 32位是最简单的

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
岩倉凛IwakuraRin作者
9天22时前 IP:江苏
939759
引用smith发表于2楼的内容
mips和x86都是32位的, 其实如果用软件模拟或者FPGA实现, 32位是最简单的

以前有试着用fpga去写rv32 但是听了两节课之后就没坚持下来,另外我跟着做的两节课还原的x86和mips都是八位的处理器 但是用的32位指令集

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
3DA502
9天12时前 IP:河南
939782

推荐一个学习网站 https://nandgame.com/ 把CPU设计成一个闯关游戏,从最基础的与非门开始构建

最简单并且功能完善,具有实用价值的是 J1,一个面向forth语言的堆栈处理器,

鸡肋的一点是,用forth写代码比用逻辑搭这个CPU都累人,forth 真的是和汇编同等的低级语言

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
岩倉凛IwakuraRin作者
9天6时前 IP:江苏
939792
引用3DA502发表于4楼的内容
推荐一个学习网站 XXXXXXXXXXXXXXXXXXXX/ 把CPU设计成一个闯关游戏,从最基础

感谢推荐 相似的游戏还有steam上的图灵完备 那个也是从最基本的门电路开始搭建 还有沙盒模式可以随便写cpu 我印象里好像还可以导出verilog语言,不过有点小贵 我花了70大洋原价买的

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
岩倉凛IwakuraRin作者
9天6时前 IP:江苏
939793

B站同步发布了介绍视频

视频链接

【高中生自制CPU以及cpu架构『第一期 记录logisim以及vivado仿真过程』-哔哩哔哩】 https://b23.tv/bHmpc4e

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith
9天0时前 IP:广东
939800

建议是初学者不要尝试设计冯诺依曼架构, 即代码和数据放在一块的, 会非常坑爹,我用Verilog实现已经非常头疼了,用器件搭建会更加头痛

实现哈佛架构, 即代码和数据分开的, 会简单也便于处理一些

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
岩倉凛IwakuraRin作者
8天5时前 IP:美国
939828

CPU架构图.png

架构示意图如图所示

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith
6天19时前 IP:广东
939886
引用岩倉凛IwakuraRin发表于8楼的内容
架构示意图如图所示

这个还不能执行跳转指令

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
岩倉凛IwakuraRin作者
6天16时前 IP:江苏
939898
引用smith发表于9楼的内容
这个还不能执行跳转指令

这张图没画完全 重新补一张 这次重新做了些修改Image_40690006807965.png

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zjsx8192
1时39分前 IP:广东
940111
引用3DA502发表于4楼的内容
推荐一个学习网站 XXXXXXXXXXXXXXXXXXXX/ 把CPU设计成一个闯关游戏,从最基础

这个到ALU好像就不好闯了,和前面的关联不大

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

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

主体类型:个人
所属领域:无
认证方式:手机号
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)}}