爱学习的小火花
码龄4年
关注
提问 私信
  • 博客:31,437
    31,437
    总访问量
  • 22
    原创
  • 293,003
    排名
  • 389
    粉丝
  • 0
    铁粉

个人简介:大学生咸鱼

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:江苏省
  • 加入CSDN时间: 2021-02-23
博客简介:

m0_55502433的博客

查看详细资料
  • 原力等级
    当前等级
    3
    当前总分
    294
    当月
    1
个人成就
  • 获得490次点赞
  • 内容获得19次评论
  • 获得515次收藏
  • 代码片获得339次分享
创作历程
  • 22篇
    2024年
成就勋章
TA的专栏
  • CPU设计实战
    16篇
  • verilog学习
    5篇
兴趣领域 设置
  • 编程语言
    c语言汇编
  • 开发工具
    githubvimvscodevisual studio code
  • 嵌入式
    单片机mcu嵌入式硬件
  • 硬件开发
    fpga开发硬件架构
创作活动更多

2024 博客之星年度评选报名已开启

博主的专属年度盛宴,一年仅有一次!MAC mini、大疆无人机、华为手表等精美奖品等你来拿!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

CPU设计实战-FPGA基础操作学习

1.排查外设的硬件问题(更换硬件器件进行测试)2.clk与rst3.主从设备之间有没有正常联系(M-S,看最关键的直接输出的信号)4.协议检查:对协议中的关键信号进行检查如状态机信号——影响状态机的控制信号——一步一步推比如到计数器之类(state)5.读写的数据是否正确(data)6.用假数据测试,用简单的数据如12345678去测试可以方便的排查地址问题(触发信号trgger)前提:手册读懂。
原创
发布博客 2024.03.28 ·
617 阅读 ·
12 点赞 ·
0 评论 ·
5 收藏

CPU设计实战-外设接口介绍与测试

内置寄存器,BASE地址由外设所在设备接口处决定,这样就可以确定每个寄存器的地址;要使用输出先要使能,要用中断也先要使能;
原创
发布博客 2024.03.27 ·
1182 阅读 ·
19 点赞 ·
0 评论 ·
19 收藏

CPU设计实战-Wishbone总线接口

需要注意的是:WE读写使能信号:低位表示读操作,高位表示写操作SEL数据总线选择信号:用于选择总线上哪些bit是有效的,宽度为位宽/总线粒度(一般为一个字节)CYC总线周期信号:代表总线正在被占用(不一定是总线操作),在总线使用时须持续有效STB总线选用信号:有效时代表发起一次总线操作在发起一次总线操作后,这两个信号都要有效ACK操作结束信号:操作结束给一个有效位。
原创
发布博客 2024.03.20 ·
1458 阅读 ·
15 点赞 ·
1 评论 ·
20 收藏

CPU设计实战—异常处理指令

异常有点像中断,处理完还要回到原来的状态,所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理:1.外部硬件中断2.复位异常3.系统调用异常(发生在译码阶段)4.溢出异常(发生在执行阶段)5.自陷指令异常(发生在执行阶段因为需要进行条件判断)6.无效指令异常(发生在译码阶段)为了不破坏原程序的执行,异常指令之前的指令都要确保执行完成,而异常指令和其之后的指令需要取消。这要求。可会有例外吗?由于流水线的特性,。
原创
发布博客 2024.03.19 ·
1488 阅读 ·
20 点赞 ·
1 评论 ·
20 收藏

BUG解决-Modelsim打开许可证件不可用

原因2:在Mentor Graphics手动配置下许可文件。原因1:如果安装了虚拟机需要把虚拟网卡ban掉。我采用第二种方法成功了。
原创
发布博客 2024.03.14 ·
985 阅读 ·
11 点赞 ·
2 评论 ·
6 收藏

verilog数字系统设计教程(夏闻宇)|第一章-第六章

小括号中表示在本模块中与之连接的线路。
原创
发布博客 2024.03.12 ·
2883 阅读 ·
42 点赞 ·
1 评论 ·
55 收藏

CPU设计实战-协处理器访问指令的实现

读操作需要提前去读CP0寄存器的值并传递回来,而写操作需要把使能以及写入值与地址传递到CP0.此外新引入的寄存器同样会发生。
原创
发布博客 2024.03.09 ·
1534 阅读 ·
39 点赞 ·
2 评论 ·
46 收藏

CPU设计实战-加载和存储指令(2)

将回写阶段指令对LLbit寄存器的操作信息(是否进行写LLbit操作以及写入的值)前推到访存阶段,访存阶段依据这些情况,确定正确的LLbit寄存器的值,所以MEM/WB模块的输出信号wb_LLbit_we、wb_LLbit_value也要送到MEM模块,就是用来解决数据相关问题的。需要注意的是,由于对LLbit寄存器的修改是在回写阶段最后的时钟上升沿进行的,如果直接采用LLbit模块给出的LLbit寄存器的值,可能不是正确的值,因为此时。,然后符号扩展至32位,保存到地址为rt的通用寄存器中。
原创
发布博客 2024.03.07 ·
1204 阅读 ·
21 点赞 ·
1 评论 ·
17 收藏

CPU设计实战-加载存储指令(1)

如下图:swl指令同样面临一个字的寄存器值如何写入到内存中,首先同样的读寄存器的地址不能是非地址对齐的,要留空最后两位,然后根据加载地址去判断。如后两位为00时,如n=0时,全部写入;当后两位01,与加载指令不同的是,
原创
发布博客 2024.03.07 ·
1560 阅读 ·
24 点赞 ·
1 评论 ·
24 收藏

CPU设计实战-乘除法设计实现(1)

OpenMIPS采用的是一-种改进的方法: 假如位于流水线第n阶段的指令需要多个时钟周.期,进而请求流水线暂停,那么需保持取指令地址PC的值不变,同时保持流水线第n阶段、第n阶段之前的各个阶段的寄存器不变,而第n阶段后面的指令继续运行。为此,设计添加CTRL模块,其作用是接收各阶段传递过来的流水线暂停请求信号,从而控制流水线各阶段的运行。因为只有译码、执行阶段可能会有暂停请求,取指、访存阶段都没有暂停请求,因为指令读取、数据存储器的读/写操作都可以在--个时钟周期内完成。
原创
发布博客 2024.03.04 ·
1492 阅读 ·
30 点赞 ·
1 评论 ·
18 收藏

自己动手写CPU-雷思磊书籍配套资源代码

发布资源 2024.03.02 ·
zip

CPU设计实战-简单算术操作指令的实现

CPU设计实战-简单算术操作指令的实现
原创
发布博客 2024.03.02 ·
1969 阅读 ·
21 点赞 ·
1 评论 ·
31 收藏

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 ·
1091 阅读 ·
20 点赞 ·
0 评论 ·
20 收藏

CPU设计实战-逻辑,移位操作与空指令的实现

主要还是因为cpu的五级流水线结构,如下图可以看到,第一条指令的结果要在回写阶段才能写入一号寄存器,而第二条指令在译码阶段就已经开始读取一号寄存器的值了,这时并没有读到最新更新的值。来看看译码模块的代码是怎么实现的,其实和之前寄存器模块处理相隔两条执行的相关问题的方法一样,如果传递过来的数据就是译码阶段要读的数据(即目的寄存器地址和读取寄存器地址一样),就直接把传递过来的值给到译码阶段的输出。顾名思义就是在新的数据还未写入寄存器时就去读取了寄存器的值,这样导致读取的值是原来的旧值而不是最新的值。
原创
发布博客 2024.02.29 ·
1912 阅读 ·
55 点赞 ·
0 评论 ·
56 收藏

CPU设计实战-最小SOC的实现

顶层模块用于对之前文章里介绍的五级流水线的各个模块进行例化,也就是连线,那么顶层模块的输入输出接口如何呢?首先输入要有时钟复位信号,还要有一个来接收指令存储器里的数据记为rom_data_i输出因为要去读取指令存储器中的数据,所以要输出读地址以及一个使能信号。
原创
发布博客 2024.02.28 ·
1124 阅读 ·
29 点赞 ·
1 评论 ·
26 收藏

CPU设计实战-第一条指令ori的实现即最简单的五级流水线的实现

defines.v此文件定义了下面模块中所用到一些宏定义,如常用的数据宽度,数据长度以及指令码的定义。使用头文件只需在模块最前面加上`include"defines.v"//全局//指令//AluOp//AluSel//指令存储器inst_rom//通用寄存器regfile。
原创
发布博客 2024.02.01 ·
1703 阅读 ·
37 点赞 ·
3 评论 ·
28 收藏

CPU设计实战-基于IP核的RAM实现

新建工程后打开IP核搜RAM并双击下面解释每个选项的含义对IP核进行命名选择存储器类型single:一个地址,只能进行一组读写,不能同时读写simpel:两个地址,一组读一组写true:两个地址,每组都可以分别读写选择位数和深度(有多少个)存储器深度(Memory Depth)是指存储器中可以存储数据的地址数量,或者说存储器能够存储的数据元素的个数。它是描述存储器容量的一个方面,通常用于说明存储器的大小。
原创
发布博客 2024.01.28 ·
619 阅读 ·
9 点赞 ·
1 评论 ·
9 收藏

CPU设计实战-verilog实现MIPS下CPU中的寄存器堆

首先我们要明白一个指令在cpu中是怎么执行的,大概的执行顺序如下:首先我们得知道当前执行什么指令吧,那么当前执行的指令存储在哪里呢,在PC(程序计数器,用于存储当前指令的地址)中。由于PC中存储的指令是虚地址,所以还需要输送到MMU中作虚实地址的转换(一般我们设计的简单的CPU不含有虚实地址)。拿到当前指令的物理地址后,我们需要根据这个地址去指令RAM(各种指令的RAM都在这里)中去取出对应的32位指令码。
原创
发布博客 2024.01.27 ·
1331 阅读 ·
18 点赞 ·
3 评论 ·
23 收藏

cpu设计实战-verilog实现简单MIPS中CPU的ALU(1)

分析可知,ALU内部包含做加减操作、比较操作、移位操作和逻辑操作的逻辑,ALU的输人同时传输给这些逻辑,各逻辑同时运算,最后通过一个多路选择电路将所需的结果选择出来作为ALU的输出。假如我们现在就是需要执行op_slt这个操作,那么输入选择信号alu_control为001000_000000(之前说了它是独热码,这也是为什么用独热码编码的原因),此时op_slt的值为1,那么此时整个的输出就是slt_result;根据下图可以看到,常用的指令的大部分是对两个寄存器中的数值进行操作,最终输出一个。
原创
发布博客 2024.01.24 ·
2251 阅读 ·
33 点赞 ·
0 评论 ·
38 收藏

verilog设计与实现状态机-基于售货机实例

可乐机中有 0 元的状态是最原始的状态我们称之为 IDLE 状态,可乐机中有 1 元的状态我们就取名为 ONE,可乐机中有 2 元的状态取名为 TWO,可乐机中有 3元的状态取名为 THREE。了 3 元钱,但是和上面分析不同的是可乐机器此时不会立刻出可乐,此为 Mealy 状态机,输出不仅与状态有关还和输入有关,可以看到3状态后面根据不同的输入跳转了两种不同的结果。此时只需要关注输入与下一时刻的状态。3 、状态:可乐机中有 0元、可乐机中有 1 元、可乐机中有 2元、可乐机中有 3 元。
原创
发布博客 2024.01.22 ·
675 阅读 ·
7 点赞 ·
0 评论 ·
15 收藏
加载更多