1.rvseed_defines.v(定义了一些参数,没有实际意义)

  该文件定义了一些基本参数,在后续的代码中都会调用该文件

// simulation clock period
`define SIM_PERIOD 20 // 20ns -> 50MHz // processor
`define CPU_WIDTH 32 // 32位的CPU // instruction memory
`define INST_MEM_ADDR_DEPTH 1024
`define INST_MEM_ADDR_WIDTH 10 // 2^10 = 1024

  因为设计的是32位的CPU,所以CPU的深度CPU_WIDTH为32。

2.inst_mem.v(指令存储器)

`include "rvseed_defines.v"
module inst_mem (
input [`CPU_WIDTH-1:0] curr_pc, // current pc addr,当前的pc值
output reg [`CPU_WIDTH-1:0] inst // instruction,输出的指令
); reg [`CPU_WIDTH-1:0] inst_mem_f [0:`INST_MEM_ADDR_DEPTH-1]; //存储器的位宽和处理器的位宽一致,深度设置为1024,因此地址位宽应该为10 //根据当前的pc值取出存储器对应地址的数据
always @(*) begin
inst = inst_mem_f[curr_pc[`INST_MEM_ADDR_WIDTH+2-1:2]];
end
endmodule

  模块的输入为curr_pc,即当前的pc值,输出为inst,是输出的指令,两个量都是32位的;

  定义了一个1024*32的一个存储器inst_mem,因为这里设计一个处理器,所以直接定义即可,这样会消耗逻辑资源,实际情况是使用现存的存储资源;

  inst从inst_mem中取指令,关于这行代码,我的理解是:

/*
这里为什么是INST_MEM_ADDR_WIDTH+2-1这样写,是因为比如一开始curr_pc的值是32个0,取他的[11:2]位,
这样就是相当于inst = inst_mem_f[0],正好取到第一行的32位的指令(inst_mem_f是一个1024*32的列表),
因此,如果是要取到第二个指令,那么就应该让curr_pc+4,也就是变成0000....010,这样他的[11:2]就成了000..01
正好取到了inst_mem_f[1],也就是下一条指令,即第二个指令
*/ /*
+2是因为指令输出只需要11:2位,后两位是数据存储所用到的(这里up主没有说,我是看评论区的)
*/

3.pc_reg.v(程序计数器)

//程序计数器,告诉处理器现在执行哪条指令
`include "rvseed_defines.v" module pc_reg (
input clk, // system clock
input rst_n, // active low reset
output reg ena, // system enable
input [`CPU_WIDTH-1:0] next_pc, // next pc addr
output reg [`CPU_WIDTH-1:0] curr_pc // current pc addr
); //控制处理器的运行和暂停
always @ (posedge clk or negedge rst_n) begin
if(~rst_n)
ena <= 1'b0;
else
ena <= 1'b1;
end always @ (posedge clk or negedge rst_n) begin
if(~rst_n)
curr_pc <= `CPU_WIDTH'b0; //复位,则回到第一条指令的位置
else
curr_pc <= next_pc; //将当前的pc值更新为外部提供的next_pc,next_pc由mux模块提供
end endmodule

  ena是使能信号,决定处理器的运行和暂停(这在下一个mux_pc模块中体现)

  第二个模块是pc值的更新,复位则回到第一条指令,否则将当前的pc值更新为next_pc。

4.mux_pc.v(多路选择器)

`include "rvseed_defines.v"

module mux_pc (
input ena,
input branch, // branch type
input zero, // alu result is zero
input jump, // jump type
input [`CPU_WIDTH-1:0] imm, // immediate
input [`CPU_WIDTH-1:0] curr_pc, // current pc addr
output reg [`CPU_WIDTH-1:0] next_pc // next pc addr
); always @(*) begin
if (~ena) //复位,使能为0无效,则pc值不做更新,相当于是在暂停
next_pc = curr_pc;
else if (branch && ~zero) // bne:分支跳转
next_pc = curr_pc + imm; //将当前的指令值和指令中的立即数相加,作为一个新的指令值的
else if (jump) // jal :跳转和链接
next_pc = curr_pc + imm; //将当前的指令值和指令中的立即数相加,作为一个新的指令值的
else //标准情况:pc值不做跳转也不做保留,则将当前的pc值加4,作为下一个pc,相当于读取下一条指令,为什么加4看inst-mem中有解释的
next_pc = curr_pc + `CPU_WIDTH'h4;
end
endmodule

  因为下一条指令next_pc会受到不同因素的影响,因此由一个多路选择器进行裁决。

Rong晔大佬教程学习(2):取指的更多相关文章

  1. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  2. .Net程序员之Python基础教程学习----列表和元组 [First Day]

    一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...

  3. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  4. JSON 教程学习进度备忘

    书签:跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1. ______________ 知识点:1 ...

  5. JavaScript 教程学习进度备忘(二)

    备忘:之前,只将“JS 教程”学习完毕,这篇记录:“JS HTML DOM ”.“JS 对象”.“JS Window”.“JS 库” 书签:跳过:另外跳过的内容有待跟进 _______________ ...

  6. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  7. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  8. 【前端,干货】react and redux教程学习实践(二)。

    前言 这篇博文接 [前端]react and redux教程学习实践,浅显易懂的实践学习方法. ,上一篇简略的做了一个redux的初级demo,今天深入的学习了一些新的.有用的,可以在生产项目中使用的 ...

  9. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer 前言 Add OGC WMS Layers( ...

  10. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents 一.前言 当在m ...

随机推荐

  1. 4.4 C++ Boost 数据集序列化库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  2. 论文解读(MetaAdapt)《MetaAdapt: Domain Adaptive Few-Shot Misinformation Detection via Meta Learning》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:MetaAdapt: Domain Adaptive Few-Shot Misinformation De ...

  3. Airtest遇到模拟器无法输入中文的情况该如何处理?

    此文章来源于项目官方公众号:"AirtestProject" 版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 1. 前言 最近有收到同学们的一些提问,使用Air ...

  4. 在Windows下用VScode构造shell脚本的IDE

    在linux系统中,大家可以很轻松的开发.调试shell脚本.但是,对于不熟悉linux系统 的小白或者想在Windows下开发shell脚本的人来说,这就有点不友好了.本篇文章就 教大家,在Wind ...

  5. Jmeter插件PerfMon Metrics Collector安装使用及报错解决

    Jmeter作为一个轻量级的性能测试工具,开源.小巧.灵活的特性使其越来越受到测试人员喜爱.在实际的 项目中,特别是跨地区项目,排除合作方指定要求使用Loadrunner作为性能测试工具外,Jmete ...

  6. 全局安装oh-my-zsh保姆教程

    我的系统是CentOS 7.6,按流程走完后可以实现系统内所有用户都默认使用zsh且插件配置共享省去重复编写配置或软连接的烦恼 1 安装git yum -y install git 2 安装zsh y ...

  7. Solution -「洛谷 P6287」「COCI 2016-2017」Mag

    Description Link. 定义一条链的价值为链上点权乘积除以节链上点数,求一条价值最小的链. Solution 结论:答案链上最多包含一个 \(2\)(其余全为 \(1\)),并且不在链的两 ...

  8. Solution -「九省联考 2018」IIIDX

    Description Link. 给出一个堆,然后让你填数进去,使得其满足小根堆的性质,并使编号靠前的点的数最大. Solution 考虑贪心,把原数列降序排序,然后因为这个东西是整除分块的形式,所 ...

  9. Modbus转profinet网关连接1200PLC在博图组态与英威腾驱动器通讯程序案例

    Modbus 转 profinet 网关连接 1200PLC 在博图组态与英威腾驱动器通讯程序案例 本案例给大家介绍由兴达易控 modbus 转 profinet 网关连接 1200PLC 在博图软件 ...

  10. k8s 自动扩缩容HPA原理及adapter配置详解👑

    大家好,我是蓝胖子,都知道,k8s拥有自动扩缩容机制HPA,我们能够通过配置针对不同的扩缩容场景进行自动扩缩容,往往初学者在面对其中繁多配置的时候会学了又忘记,今天我将会以一种不同的视角,结合api ...