CPU设计(单周期和流水线)

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料)


微信公众号:创享日记
发送关键词:cpu
获取CPU设计源文件(不看单周期和流水线)


文章目录

    • 设计的功能描述(含所有实现的指令描述,以及单周期/流水线CPU频率)
    • 单周期模块作用
    • 流水线模块作用
    • 流水线划分


设计的功能描述(含所有实现的指令描述,以及单周期/流水线CPU频率)

add:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后相加之后将结果写入目的寄存器中。

sub:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后相减之后将结果写入目的寄存器中。

and:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行与运算之后将结果写入目的寄存器中。

or:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行或运算之后将结果写入目的寄存器中。

xor:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行异或运算之后将结果写入目的寄存器中。

sll:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后将操作数1逻辑左移操作数2大小的位数之后将结果写入目的寄存器中。

srl:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后将操作数1逻辑右移操作数2大小的位数之后将结果写入目的寄存器中。

sra:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后将操作数1算术右移操作数2大小的位数之后将结果写入目的寄存器中。

addi:将指令中指明的一一个包含操作数的寄存器中的操作数读出,然后将该操作数与指令中指明的立即数相加之后将结果写入目的寄存器中。

andi:将指令中指明的一个包含操作数的寄存器中的操作数读出,然后将该操作数与指令中指明的立即数做与运算之后将结果写入目的寄存器中。

ori:将指令中指明的一个包含操作数的寄存器中的操作数读出,然后将该操作数与指令中指明的立即数做或运算之后将结果写入目的寄存器中。

xori:将指令中指明的一个包含操作数的寄存器中的操作数读出,然后将该操作数与指令中指明的立即数做异或运算之后将结果写入目的寄存器中。

slli:将指令中指明的一个包含操作数的寄存器中的操作数读出,然后将该操作数逻辑左移指令中指明的立即数的大小的位数之后将结果写入目的寄存器中。

srli:将指令中指明的一个包含操作数的寄存器中的操作数读出,然后将该操作数逻辑右移指令中指明的立即数的大小的位数之后将结果写入目的寄存器中。

srai:将指令中指明的一个包含操作数的寄存器中的操作数读出,然后将该操作数算术右移指令中指明的立即数的大小的位数之后将结果写入目的寄存器中。

lw:以指令中指明的包含操作数的寄存器中的操作数和指令中指明的立即数相加,然后读出以此相加结果为地址的存储单元的值,并将其写入目的寄存器中。

ialr:将指令中指明的包含操作数的寄存器中的操作数和指令中指明的立即数相加作为下一次PC的值,然后将当前PC的值加4之后得到的值写入目的寄存器中。

sw:以指令中指明的包含操作数的寄存器1中的操作数和指令中指明的立即数相加,然后将指令中指明的包含操作数的寄存器2中的操作数写入以此相加结果为地址的存储单元中。

beq:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行比较,若操作数1与操作数2相等,则将当前的PC地址加上指令中指明的立即数的结果作为下一次的PC的值,否则,就将当前的PC地址加上4的结果作为下一次的PC的值。

bne:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行比较,若操作数1与操作数2不相等,则将当前的PC地址加上指令中指明的立即数的结果作为下一次的PC的值,否则,就将当前的PC地址加上4的结果作为下一次的PC的值。

blt:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行有符号比较,若操作数1小于操作数2,则将当前的PC地址加上指令中指明的立即数的结果作为下一次的PC的值,否则,就将当前的PC地址加上4的结果作为下一次的PC的值。

bge:将指令中指明的两个包含操作数的寄存器中的操作数读出,然后进行有符号比较,若操作数1大于或等于操作数2,则将当前的PC地址加上指令中指明的立即数的结果作为下一次的PC的值,否则,就将当前的PC地址加上4的结果作为下一次的PC的值。

lui:将指令中指明的立即数做符号拓展成32位之后的结果写入目的寄存器中。

jal:将当前PC的值和指令中指明的立即数相加作为下一次PC的值,然后将当前PC的值加4之后得到的值写入目的寄存器中。

单周期CPU频率25MHz
流水线CPU频率90MHz



单周期模块作用

PC:将下一条指令的地址值传到imem模块。

Next. _pc:得到下一-次的pc值并传到PC模块。

imem:存储指令的模块。

decoder:译码单元,将输入的指令拆分,得到相应的操作数或是符号拓展后立即数,供后面的模块使用。

control:通过输入的指令得到相应的各个控制信号取值并输出到其他模块。

execute:将相应的操作数进行对应的计算得到结果并输出到需用的模块。

dram:存储单元。

compare:进行比较指令的比较操作,并输出决定是否跳转的信号。



流水线模块作用

PC:将下一条指令的地址值传到irom模块。

Next_pc:得到下一次的pc值并传到PC模块。

irom:存储指令的模块。

jump_ test:检测是否是跳转指令,并决定是否暂停。

IF_ID_ reg: 将IF阶段的部分信号传到ID阶段。

decoder:译码单元,将输入的指令拆分,得到相应的操作数或是符号拓展后立即数,供后面的模块使用。

control:通过输入的指令得到相应的各个控制信号取值并输出到其他模块。

conf_ test:冲突的检测模块,检测是否出现数据冲突,并输出相应的冲突信号以及发生冲突后应该从寄存器中读出的正确值。

ID_ EX_ reg: 将ID阶段的部分信号传到EX阶段。

execute:将相应的操作数进行对应的计算得到结果并输出到需用的模块。

compare:进行比较指令的比较操作,并输出决定是否跳转的信号。

EX_MEM_reg:将EX阶段的部分信号传到MEM阶段。

dram:存储单元。

MEM_WB._reg:将MEM阶段的部分信号传到WB阶段。



流水线划分

在这里插入图片描述
IF阶段:完成下一次pc取值的计算,并根据当前pc值把相应指令从irom模块中取出然后输出到后续的阶段;再者还有对跳转指令的检测,决定是否暂停。

ID阶段:接收IF阶段取得的指令,然后将指令中的有效信息提取出来,例如I型指令的立即数符号拓展值、R型指令的操作数等等,并得到各个控制信号的取值然后输出到后续的模块,再者检测是否出现数据冲突,并进行相应的处理。

EX阶段:接收ID阶段传来的一些控制信号和相应的操作数,并据此进行相应的计算或比较操作,得到结果后输出到MEM阶段。

MEM阶段:对DRAM进行读或写的操作。

WB阶段:将前面阶段得到的数据根据控制信号选择之后写入相应的寄存器中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用AWS Lambdas扩展技术堆栈

面对现实吧。 调试性能问题很困难,但更难解决。 假设您发现了令人反感的代码,这些代码正在拖慢您的应用的运行速度。 最终会有一段时间,您发现该代码减速是同步的或线性执行的。 解决这些有问题的代码段的最有效方法之一是将最重的工作负载委…

前馈-反馈控制系统设计(过程控制课程设计matlab/simulink)

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送关键词:前馈…

感应电机直接转矩控制系统的设计与仿真(运动控制matlab/simulink)

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送关键词:直接…

【2】C++语法与数据结构之MFC_CList学生管理系统_链表内排序_函数指针

MFC中CList类库的遍历 #include <iostream> #include "List.h" using namespace std; void main() {CList list;list.AddHead(33);list.AddHead(88);list.AddHead(99);POSITION pos list.GetHeadPosition();cout << "正向&#xff1a;" <…

neo4j cypher_neo4j / cypher:悬挂查询参数

neo4j cypher一直以来&#xff0c;我一直在使用neo4j的密码查询语言&#xff0c; 迈克尔一直在告诉我在查询中使用参数&#xff0c;但是查询的性能始终可以接受&#xff0c;因此我没有必要。 但是&#xff0c;最近我正在研究一个数据集&#xff0c;并使用类似于以下的代码创建了…

双容水箱液位模糊PID控制系统设计与仿真(Matlab/Simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;双容模糊 获…

基于单片机步进电机控制器设计(正转反转指示灯挡位)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;单片机步进…

【3】C++语法与数据结构之MFC_CList学生管理系统_链表外排序_函数指针

注意&#xff1a;此时排序规则函数定义为全局函数 C中定义CStudent类 文件名&#xff1a;Student.h #pragma once #include <afxtempl.h> typedef struct SUser {int nNumb;char sName[20];float fMath; }DATA;typedef bool(*BY_FUNC)(DATA& q,DATA& m);class…

Java中Long到Int的精确转换

JDK 8附带所有令人眼前一亮的 东西 &#xff08; lambda表达式 &#xff0c; 流 &#xff0c; Optional &#xff0c;新的Date / Time API等&#xff09;来分散我的注意力 &#xff0c;我并没有过多注意添加方法Math.toIntExact&#xff08;&#xff09; 。 但是&#xff0c;这…

基于单片机的交通灯控制系统设计

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;单片机交通…

【4】C++语法与数据结构之自己实现MFC的CList类库_学生管理系统

本文通过自己实现的CList双向链表数据结构来完成学生管理系统&#xff0c;同样采用链表外排序。 注意&#xff1a;此时排序规则函数仍然定义为全局函数 自己定义CList类 文件名&#xff1a;List.h -注意&#xff1a; POSITION不是VS默认的类型&#xff0c;而是重新定义为vo…

36个精美完整网站网页完整源码HTML+CSS+JS

以下列举前9个效果图&#xff0c;源码详见微信公众号下载 ①效果图 ②效果图 ③效果图 ④效果图 ⑤效果图 ⑥效果图 ⑦效果图 ⑧效果图 ⑨效果图 微信公众号&#xff1a;创享日记 发送&#xff1a;36 获取全部完整源码&#xff08;打开.html文件均即可用&…

【5】C++语法与数据结构之STL_list学生管理系统_链表内排序_函数指针

本文通过STL类库的list数据结构来完成学生管理系统&#xff0c;采用链表内排序&#xff0c;通过list类库自带sort函数进行排序。 注意&#xff1a;此时排序规则函数定义为类静态成员函数&#xff0c;等价于全局函数函数指针定义为 BY_FUNC ps[] { CStudent::byNumb,CStudent:…

ajax异步监控_监控整页(非AJAX),需要通知

ajax异步监控最近&#xff0c;在JSF中处理新图表和图表“导出服务”时&#xff0c;我遇到了一个非常普遍的问题。 当您执行长时间运行的任务&#xff08;操作&#xff09;时&#xff0c;您希望在开始时显示一个状态“请稍候……”对话框&#xff0c;并在响应到达时结束时关闭此…

公司产品移动端网页-前端网页设计技术精美网站源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;产品网页 获取完整源码&#xff08;打开即可用&#xff09; 效果①主页首页 /*页面重置*/ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,f…

【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针

本文通过STL类库的list数据结构来完成学生管理系统&#xff0c;采用链表外排序&#xff0c;通过函数指针实现。 注意&#xff1a;此时排序规则函数定义为类静态成员函数&#xff0c;等价于全局函数函数指针定义为 BY_FUNC ps[] { CStudent::byNumb,CStudent::byName,CStudent…

创建一个坚固的备份系统

在Foreach&#xff0c;我们拥有Synology RS815 来存储所有备份。 这些备份来自我们网络中的不同来源&#xff0c;例如路由器&#xff0c;交换机&#xff0c;数据库服务器&#xff0c;Web服务器&#xff0c;应用程序日志文件&#xff0c;邮件服务器等等。 Synology NAS使配置这…

班级网站-前端网页技术精美完整源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;班级网站 获取完整源码&#xff08;打开即可用&#xff09; 效果图①首页主页 效果图②关于页面 效果图③联系方式及留言 效果图④我们的画廊展示 其余及源码详见微信公众号下载&#xff01; <!DOCTYPE html> <html…

医药协会网站-前端网页技术设计HTML+CSS精美完整网页网站源码

微信公众号&#xff1a;创享日记 发送&#xff1a;医药协会网站 获取完整源码 效果图预览①主页首页 效果图预览②资源下载中心 效果图预览③登录/注册 效果图预览④文章资讯详情 效果图预览⑤文章资讯列表 效果图预览⑥留言板 效果图预览⑦图文列表 效果图预览⑧图文详情 源码…

数字通信系统仿真的MATLAB实现(QPSK)

关注公号【逆向通信猿】更精彩!!! 仿真结果 本文以QPSK为调制体制进行仿真,以下结果为比特信噪比Eb/N0=10dB(此时符号信噪比Es/N0=13dB,SNR信噪比=3.98dB,换算关系在代码中为第44行)时的各步骤结果图