
CPU设计实战
文章平均质量分 90
记录自己根据cpu设计实战以及自己动手做cpu这两本书从0实现一个cpu的过程
爱学习的小火花
大学生咸鱼
展开
-
CPU设计实战-FPGA基础操作学习
1.排查外设的硬件问题(更换硬件器件进行测试)2.clk与rst3.主从设备之间有没有正常联系(M-S,看最关键的直接输出的信号)4.协议检查:对协议中的关键信号进行检查如状态机信号——影响状态机的控制信号——一步一步推比如到计数器之类(state)5.读写的数据是否正确(data)6.用假数据测试,用简单的数据如12345678去测试可以方便的排查地址问题(触发信号trgger)前提:手册读懂。原创 2024-03-28 10:50:27 · 654 阅读 · 0 评论 -
CPU设计实战-外设接口介绍与测试
内置寄存器,BASE地址由外设所在设备接口处决定,这样就可以确定每个寄存器的地址;要使用输出先要使能,要用中断也先要使能;原创 2024-03-27 13:42:17 · 1251 阅读 · 0 评论 -
CPU设计实战-Wishbone总线接口
需要注意的是:WE读写使能信号:低位表示读操作,高位表示写操作SEL数据总线选择信号:用于选择总线上哪些bit是有效的,宽度为位宽/总线粒度(一般为一个字节)CYC总线周期信号:代表总线正在被占用(不一定是总线操作),在总线使用时须持续有效STB总线选用信号:有效时代表发起一次总线操作在发起一次总线操作后,这两个信号都要有效ACK操作结束信号:操作结束给一个有效位。原创 2024-03-20 20:00:44 · 1577 阅读 · 1 评论 -
CPU设计实战—异常处理指令
异常有点像中断,处理完还要回到原来的状态,所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理:1.外部硬件中断2.复位异常3.系统调用异常(发生在译码阶段)4.溢出异常(发生在执行阶段)5.自陷指令异常(发生在执行阶段因为需要进行条件判断)6.无效指令异常(发生在译码阶段)为了不破坏原程序的执行,异常指令之前的指令都要确保执行完成,而异常指令和其之后的指令需要取消。这要求。可会有例外吗?由于流水线的特性,。原创 2024-03-19 17:12:41 · 1601 阅读 · 1 评论 -
CPU设计实战-协处理器访问指令的实现
读操作需要提前去读CP0寄存器的值并传递回来,而写操作需要把使能以及写入值与地址传递到CP0.此外新引入的寄存器同样会发生。原创 2024-03-09 16:08:38 · 1600 阅读 · 2 评论 -
CPU设计实战-加载和存储指令(2)
将回写阶段指令对LLbit寄存器的操作信息(是否进行写LLbit操作以及写入的值)前推到访存阶段,访存阶段依据这些情况,确定正确的LLbit寄存器的值,所以MEM/WB模块的输出信号wb_LLbit_we、wb_LLbit_value也要送到MEM模块,就是用来解决数据相关问题的。需要注意的是,由于对LLbit寄存器的修改是在回写阶段最后的时钟上升沿进行的,如果直接采用LLbit模块给出的LLbit寄存器的值,可能不是正确的值,因为此时。,然后符号扩展至32位,保存到地址为rt的通用寄存器中。原创 2024-03-07 21:49:30 · 1253 阅读 · 1 评论 -
CPU设计实战-加载存储指令(1)
如下图:swl指令同样面临一个字的寄存器值如何写入到内存中,首先同样的读寄存器的地址不能是非地址对齐的,要留空最后两位,然后根据加载地址去判断。如后两位为00时,如n=0时,全部写入;当后两位01,与加载指令不同的是,原创 2024-03-07 16:28:09 · 1685 阅读 · 1 评论 -
CPU设计实战-乘除法设计实现(1)
OpenMIPS采用的是一-种改进的方法: 假如位于流水线第n阶段的指令需要多个时钟周.期,进而请求流水线暂停,那么需保持取指令地址PC的值不变,同时保持流水线第n阶段、第n阶段之前的各个阶段的寄存器不变,而第n阶段后面的指令继续运行。为此,设计添加CTRL模块,其作用是接收各阶段传递过来的流水线暂停请求信号,从而控制流水线各阶段的运行。因为只有译码、执行阶段可能会有暂停请求,取指、访存阶段都没有暂停请求,因为指令读取、数据存储器的读/写操作都可以在--个时钟周期内完成。原创 2024-03-04 20:30:36 · 1565 阅读 · 1 评论 -
CPU设计实战-简单算术操作指令的实现
CPU设计实战-简单算术操作指令的实现原创 2024-03-02 13:16:13 · 2173 阅读 · 1 评论 -
CPU设计实战-移动操作指令的实现
(1)在译码阶段依据指令,给出运算类型alusel_ o、 运算子类型aluop_ o的值,同时因为有要写入的目的寄存器,所以wreg. o为WriteEnable, wd o为指令中rd的值,也就是目的寄。MEM/WB模块输出的对HI、LO寄存器的写信息将直接送到HILO模块,包括: wb_ whilo、 wb_ _hi、 wb_ lo,后者据此修改HI、LO寄存器的值。理解指令:movn和movz是根据rt的值来判断是否将rs寄存器的值赋值到rd中,后四个指令都是对hi和lo寄存器进行读写。原创 2024-03-01 17:19:09 · 1129 阅读 · 0 评论 -
CPU设计实战-逻辑,移位操作与空指令的实现
主要还是因为cpu的五级流水线结构,如下图可以看到,第一条指令的结果要在回写阶段才能写入一号寄存器,而第二条指令在译码阶段就已经开始读取一号寄存器的值了,这时并没有读到最新更新的值。来看看译码模块的代码是怎么实现的,其实和之前寄存器模块处理相隔两条执行的相关问题的方法一样,如果传递过来的数据就是译码阶段要读的数据(即目的寄存器地址和读取寄存器地址一样),就直接把传递过来的值给到译码阶段的输出。顾名思义就是在新的数据还未写入寄存器时就去读取了寄存器的值,这样导致读取的值是原来的旧值而不是最新的值。原创 2024-02-29 18:04:42 · 1954 阅读 · 0 评论 -
CPU设计实战-第一条指令ori的实现即最简单的五级流水线的实现
defines.v此文件定义了下面模块中所用到一些宏定义,如常用的数据宽度,数据长度以及指令码的定义。使用头文件只需在模块最前面加上`include"defines.v"//全局//指令//AluOp//AluSel//指令存储器inst_rom//通用寄存器regfile。原创 2024-02-01 15:21:18 · 1775 阅读 · 3 评论 -
CPU设计实战-verilog实现MIPS下CPU中的寄存器堆
首先我们要明白一个指令在cpu中是怎么执行的,大概的执行顺序如下:首先我们得知道当前执行什么指令吧,那么当前执行的指令存储在哪里呢,在PC(程序计数器,用于存储当前指令的地址)中。由于PC中存储的指令是虚地址,所以还需要输送到MMU中作虚实地址的转换(一般我们设计的简单的CPU不含有虚实地址)。拿到当前指令的物理地址后,我们需要根据这个地址去指令RAM(各种指令的RAM都在这里)中去取出对应的32位指令码。原创 2024-01-27 15:58:42 · 1454 阅读 · 3 评论 -
CPU设计实战-基于IP核的RAM实现
新建工程后打开IP核搜RAM并双击下面解释每个选项的含义对IP核进行命名选择存储器类型single:一个地址,只能进行一组读写,不能同时读写simpel:两个地址,一组读一组写true:两个地址,每组都可以分别读写选择位数和深度(有多少个)存储器深度(Memory Depth)是指存储器中可以存储数据的地址数量,或者说存储器能够存储的数据元素的个数。它是描述存储器容量的一个方面,通常用于说明存储器的大小。原创 2024-01-28 12:49:12 · 642 阅读 · 1 评论 -
cpu设计实战-verilog实现简单MIPS中CPU的ALU(1)
分析可知,ALU内部包含做加减操作、比较操作、移位操作和逻辑操作的逻辑,ALU的输人同时传输给这些逻辑,各逻辑同时运算,最后通过一个多路选择电路将所需的结果选择出来作为ALU的输出。假如我们现在就是需要执行op_slt这个操作,那么输入选择信号alu_control为001000_000000(之前说了它是独热码,这也是为什么用独热码编码的原因),此时op_slt的值为1,那么此时整个的输出就是slt_result;根据下图可以看到,常用的指令的大部分是对两个寄存器中的数值进行操作,最终输出一个。原创 2024-01-24 18:43:52 · 2361 阅读 · 0 评论 -
CPU设计实战-最小SOC的实现
顶层模块用于对之前文章里介绍的五级流水线的各个模块进行例化,也就是连线,那么顶层模块的输入输出接口如何呢?首先输入要有时钟复位信号,还要有一个来接收指令存储器里的数据记为rom_data_i输出因为要去读取指令存储器中的数据,所以要输出读地址以及一个使能信号。原创 2024-02-28 14:14:45 · 1165 阅读 · 1 评论