当前位置: 首页 > article >正文

简易CPU设计入门:算术逻辑单元(一)

项目代码下载

请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。

CSDN文章:下载本项目代码

上述链接为本项目所依据的版本。

在讲解过程中,我还时不时地发现自己在讲解与注释上的一些个错误。有时,我还会添加一点新的资料。在这里,我将动态更新的代码版本发在下面的链接中。

Gitee项目:简易CPU设计入门项目代码:

讲课的时候,我主要依据的是CSDN文章链接。然后呢,如果你为了获得我的最近更新的版本,那就请在Gitee项目链接里下载代码。

准备好了项目源代码以后,我们接着去讲解。

本节前言

在前面的几节,我讲解了关于内存读写的问题。从本节开始,我来讲解算术逻辑单元。

本节的代码,位于【......cpu_me01\code\ALU\】路径里面。主要讲解的代码,是【ALU.v】代码文件。

一.    代码文件概览

我们来看一下,本节前言所述的路径中的代码文件。

图1

如图所示,一共是有12个文件。有一个文件叫做【ALU.v】,其余的11个文件,都带有【cell】字样。【ALU.v】,它算是一种连接性质的文件,也算是一种概述性质的代码文件。而其余的11个文件,则是属于执行具体的算术逻辑操作的代码文件。

(1)add_cell.v

这个代码文件,它执行加法运算。

(2)sub_cell.v

这个代码文件,它执行减法运行

(3)multi_cell.v

这个代码文件,它执行乘法运算。

(4)div_cell.v

这个代码文件,它执行除法运算。

(5)mod_cell.v

这个代码文件,它执行取余数运算,也叫做求模运算。

(6)and_cell.v

这个代码文件,它执行按位与运算。

(7)or_cell.v

这个代码文件,它执行按位或运算。

(8)not_cell.v

这个代码文件,它执行按位取反运算。

(9)xor_cell.v

这个代码文件,它执行按位异或运算。

(10)left_shift_cell.v

这个代码文件,它执行逻辑左移运算。

(11)right_shift_cell.v

这个代码文件,它执行逻辑右移运算。

这11种算术逻辑运算,结合着前面讲的寄存器读写,内存读写,其实是可以做出来许多的指令的。

以两个数相加为例,可以让两个寄存器相加,结果放在一个寄存器里面。

可以让一个寄存器和一个内存单元里面的数相加,结果可以放在寄存器里面,也可以放在内存单元里面。放在内存单元里面,形成一种指令。放在寄存器里面,可以形成另一种指令。

本系统虽然小,但是,仍然可以形成许多种指令。然而,我仅仅是构建了4个指令。如果你有兴趣的话,完全可以在本本系统的基础上,很方便地增加几条指令。

二.    ALU.v 中的端口声明

本节,我们主要是来讲解【ALU.v】代码文件。我们先来看一看这个文件的信号声明部分。

图2

图2所示,便是【ALU】模块的端口声明部分。

第3行和第4行代码,它们是系统时钟和系统复位信号。这俩系统,算是老朋友了。它们是从控制中心连接过来的。

第10行到第12行,它们位于本模块中的,与三大内部信号总线相连的总线变量。每一个总线变量,都是16比特的。。

第14行,它也是一个总线类型的变量,我将其称作是【成功完成信号】。每当一个算术逻辑操作完成了,就可以发布成功完成信号。发布完成信号,是通过【work_ok_inner】总线变量,将完成信号写入【work_ok_inner】来实现的。

第6行到第8行,是三个操作数,分别是操作数0【oprand0】,操作数1【oprand1】和操作数2【oprand0】。这三个操作数,实际上,对应的,是控制中心里面的三个内部寄存器。

我们来看一下控制中心模块里面的一部分端口声明。

图3,控制中心里面的部分端口声明代码

图3所示,是控制中心里面的三个端口声明代码,这三个端口,与【ALU】里面的三个端口是同名的。其实它们也是连在一起的。

我们接着看控制中心的代码。

图4,控制中心里面的代码

图4的红色框线所示的代码,声明了一个向量数组。这个数组,便是控制中心模块声明的四个内部寄存器,它们中的每一个都是16位的。每一个内部寄存器,它的最高有效位是位15,最低有效位是位0 。

图5,控制中心中的代码

从图5来看,在控制中心里面,三个内部寄存器与图3中的三个端口是绑定在一起了。

我们再来看控制中心的模块实例化代码。

图6,控制中心里面的模块实例化代码

图6里面,在第573行到575行,是将图3中的,控制中心里面的三个端口,与【ALU】模块中的三个同名端口进行了连接。

然后呢,既然是说,我展示了模块实例化代码,那么,顺便地,我也将图6所示的其余的,位于控制中心的信号展示一下,以展示控制中心模块与【ALU】模块的连接情况。

图7,控制中心里面的部分端口声明

图7中的第3行和第4行代码,对应着图6中的571行和572行的端口连接代码。

图8,控制中心里面的部分端口声明

图8里面的上面的红色框线所示的三个端口,与图6的576行到578行的端口连接代码,是相对应的。

图8里面的下边的红色框线所示的端口,与图6的579行的端口连接代码,是相对应的。

这样一来,关于控制中心与【ALU】模块的模块实例化与端口连接的问题,我也讲完了。

三.    ALU 模块与算术逻辑操作的连接

在图2里面,我们展示了 ALU 模块的端口声明部分。

在图2所示的代码,再往下看,是 ALU 模块与各个算术逻辑操作的模块实例化与端口连接。它们的端口连接方法都是一致的,只是实例化的模块名不一致而已。

作为示例,我们来看一看加法操作的模块实例化。

图9

图9所示的连接端口,与图2中的声明端口,名称都是一样的。实际上, ALU 模块,仅仅是起到了一个连接作用,它是将各个算术逻辑操作模块暂时地汇总一下,并作为一个中转站,来与控制中心模块连接起来。

我们也可以不去设置 ALU 模块,直接让控制中心与各个算术逻辑模块相连接,也可以。不过,我这里,还是设置了 ALU 模块,来中转了一下子,以便使逻辑关系更为清晰。

图9展示了 ALU 模块与 add_cell 模块的连接。

在 ALU 模块里面,它包含了 ALU 模块与【add_cell】模块,【sub_cell】模块,【multi_cell】模块,【div_cell】模块,【mod_cell】模块,【and_cell】模块,【or_cell】模块,【not_cell】模块,【xor_cell】模块,【left_shift_cell】模块和【right_cell】模块的连接。一共连接了11个算术逻辑操作模块。

结束语

以上的讲解,大概就是我们本节的内容了。

祝愿大家学习愉快。


http://www.kler.cn/a/472660.html

相关文章:

  • 【杂谈】-50+个生成式人工智能面试问题(一)
  • uniapp实现后端数据i18n国际化
  • selenium合集
  • springboot 集成 etcd
  • poi-tl+kkviewfile实现生成pdf业务报告
  • 阿尔法linux开发板ping不通百度
  • 技术选型深度解析:Qt、PyQt与Vue在界面开发中的权衡与抉择
  • Linux 文件的特殊权限—ACL项目练习
  • 协方差矩阵
  • 网络设备安全
  • allure报告修改默认语言为中文
  • 爬虫学习记录
  • STM32-笔记38-I2C-oled实验
  • Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
  • 10. C语言 函数详解
  • WPS-JS宏快速上手
  • Docker 容器自动化管理之脚本(Script for Docker Container Automation Management)
  • 【linux系统之redis6】redis的安装与初始化
  • 如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性
  • 联邦学习LoRA:推理合并权重公式:以及变体
  • 如何让用户在网页中填写PDF表格?
  • 【HTML+CSS+JS+VUE】web前端教程-1-VScode开发者工具快捷键
  • uniapp使用sm4加密
  • 创建管理表
  • Linux vi/vim 编辑器:功能强大的文本处理工具
  • 力扣刷题:数组OJ篇(上)