【计算机系统设计】实践笔记(1)数据通路构建:取指部件分析

0 核心思想

根据指令功能,分析出需求,从而得出需要的部件、控制信号以及其他设计。

1. 针对的指令

取指阶段,针对所有指令,任何指令都需要进行取指

2 功能(需求)分析

CPU的内部采用的是字节编址,每次取指之后,都进行PC + 4

需要执行的操作是

  1. 取指令:M[PC]
  2. 更新PC:PC <- PC + 4

3 需要的部件

  1. PC寄存器
  2. 加法器
  3. 指令存储器ROM

在这里插入图片描述

4 控制线(控制信号)

4.1 自身必须

  • clk:时钟信号(用于同步)
  • reset:复位信号(清零 clear)

问题:PC更新,是上升沿还是下降沿?

答:这取决于设计。

4.2 来源外部

5 数据线

  1. 数据线存储的就是ROM的地址
  2. 由于MIPS内部都是32位运算,所以PC寄存器必须是32位
  3. 外部的ROM不一定是32位,完全可以小于32位,只需要截断PC高位即可

特别注意: 此处我们PC使用的是字节编址的地址值,而ROM使用的是字编址的地址值,一个地址代表了一条32位指令,因此,除了PC高位截断,最低两位也要截断,根据字节对齐原则,PC的最低两位必然是00

6 地址线

7 注意点

  1. 字节编址的PC值与字编址的ROM地址值要对应(去掉最低2位)
  2. 对于数据输入端,未来可能有多个来源,还会增加控制信号以及多个可选择的数据,以后再增加即可。
  3. 注意模块的独立性!

8 错误的代码:模块功能混杂了

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/11/12 20:31:59
// Design Name:
// Module Name: pc_1
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module pc_1(input clk,input rst_n,input [31:0] pcNew, // The PC value from outsideoutput [31:0] pcOld);reg [31:0] pc = 0;
assign pcOld = pc;
assign pcNew = pcOld;// Update PC register
always @(posedge clk)
beginif(rst_n == 1) // Xilinx 官方推荐:reset 高电平有效beginpc <= 0;endelsebeginpc <= pcNew + 4;end
endendmodule

来看看这个好像没什么错误的代码……
在这里插入图片描述
看起来,没什么错误呀!

但是,我们仿真一看:

module tb_pc_1;// pc_1 Parameters
parameter PERIOD  = 10;// pc_1 Inputs
reg   clk                                  = 0 ;
reg   rst_n                                = 1 ;
reg   [31:0]  pcNew                        = 0 ;// pc_1 Outputs
wire  [31:0]  pcOld                        ;initial
beginforever #(PERIOD/2)  clk=~clk;
endinitial
begin#(PERIOD*2) rst_n  =  0;
endpc_1  u_pc_1 (.clk                     ( clk           ),.rst_n                   ( rst_n         ),.pcNew                   ( pcNew  [31:0] ),.pcOld                   ( pcOld  [31:0] )
);endmodule

在这里插入图片描述尴尬了,那么问题在哪里?

关注x,这说明,可能

  1. 没有输入这个信号,这显然不可能
  2. 信号冲突了,0和1一起输入,导致变成x

这里,我们看看发生了什么。

在这里插入图片描述
蓝色框出来的是内部,蓝色外部是外部信号。

很明显……我们的+4应该在外部执行,而不是内部……内部的4和外部的0撞一起了。

总结: 模块独立性非常重要,外部就是外部,内部就是内部,功能不要混杂在一起……

9 正确的代码

pc.v

module pc_1(input clk,input rst_n,input [31:0] pcNew, // The PC value from outside.output [31:0] pcOld);reg [31:0] pc = 0;
assign pcOld = pc;// Update PC register
always @(posedge clk)
beginif(rst_n == 1) // Xilinx 官方推荐:reset 高电平有效beginpc <= 0;endelsebeginpc <= pcNew + 4;end
endendmodule

RTL优化结果
在这里插入图片描述

测试的时候注意将pcNew和pcOld接一起。
tb_pc.v

module tb_pc_1;// pc_1 Parameters
parameter PERIOD  = 10;// pc_1 Inputs
reg   clk                                  = 0 ;
reg   rst_n                                = 1 ;
// reg   [31:0]  pcNew                        = 0 ;// pc_1 Outputs
wire  [31:0]  pcOld                        ;initial
beginforever #(PERIOD/2)  clk=~clk;
endinitial
begin#(PERIOD*2) rst_n  =  0;
endpc_1  u_pc_1 (.clk                     ( clk           ),.rst_n                   ( rst_n         ),.pcNew                   ( pcOld  [31:0] ),.pcOld                   ( pcOld  [31:0] )
);

在这里插入图片描述
这次就对啦!

10 后续的改进预告

后续,PC的值,可能不止是+4还可能来自于j类指令或者b类,因此,真正输入的pc的pcNew,需要从不同的值中选出一个,需要多个跳转值的输入,需要正确的选择信号,这些都是pc模块可以增加的东西,后续有需要的时候再增加。

我们期待的是

  • pc寄存器本身是独立的
  • pc的输入是可选的
  • 二者是分开的,先用其他方式选择好输入的数据,再输入到pc中更新,再输出,这几部分是相对独立的,尽管它们在一个模块中

图示如下:
在这里插入图片描述红框内部是内部结构,外部是外部输入数据,包括

  • 4个可能的pc输入情况
  • 1个选择信号
  • 1个pc输出信号

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

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

相关文章

【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)

0 回顾 上一次实践笔记&#xff08;0&#xff09;我们实现了一个最简单的&#xff0c;能够每个上升沿4的PC。 我们最需要关注的就是器件功能的独立性&#xff0c;避免内外功能混杂&#xff0c;同时一定要注意脑中有电路&#xff08;RTL级描述的抽象电路而不是实际的门级电路&…

接口的抽象与实现(概述)

概述 我们先建立一个整体的接口格局观&#xff0c;建立知识地图&#xff0c;了解接口的大概面貌。 整体来说&#xff0c;就这点事儿&#xff0c;4个箭头代表了所有&#xff01; 三个器件4个箭头 把这几个都想明白&#xff0c;就完事儿了。 第一层&#xff08;顶层&#xf…

从功能层次,阐述CPU、接口和外设之间的交互

我们从功能抽象层次&#xff0c;阐述一下CPU、接口芯片和外设之间的交互情况&#xff1a; 三个器件4个箭头 我们依次将其描述清楚。 数据 箭头①和③ CPU给接口可以发送数据&#xff0c;然后接口暂存数据&#xff0c;之后再发给外设&#xff0c;这就是数据缓冲。 发送的数…

Vivado工程文件分类

只需要在创建的时候&#xff0c;选择自定义路径即可&#xff0c;最好在原有的new文件夹下新建文件夹。 至于路径的匹配&#xff0c;可以自己试试&#xff0c;在原有默认new下创建文件夹&#xff0c;选中新的文件夹后&#xff0c;内部的Verilog文件可以访问外部new文件夹的文件&…

【微机原理与接口技术】具体芯片(1)并行接口8255A(1):全局观

并行接口8255A 首先&#xff0c;它是传输并行数据的&#xff0c;与CPU一样&#xff0c;然后&#xff0c;它是可编程的&#xff0c;也是多功能的&#xff0c;CPU可以对其进行一些控制。 管脚 先从最宏观层面分类 一部分引脚与外设相连一部分引脚与CPU相连GND和Vcc 注意&…

【算法】【殊途同归】搜索算法之(深度优先 || 广度优先) (约束条件 || 限界函数)

对于所谓的分支限界法和回溯法&#xff0c;我们完全可以更加灵活&#xff0c;请看表格。 深度优先广度优先约束条件限界函数算法策略√√回溯法局部判定√√√分支限界法局部判定√√√加限界的回溯法局部判定√枚举法全局判定√枚举法全局判定 前两种是我们常见的&#xff0c…

【算法】学习笔记(0):算法初探(逻辑抽象 + 示例 + 代码实现)

什么是算法? 人生皆算法&#xff0c;算法的本质&#xff0c;是解决问题的方法&#xff0c;遇到问题&#xff0c;寻找答案&#xff0c;解决问题&#xff0c;是作为一个人&#xff0c;一生都在做的事情。 算法是人类思维的产物&#xff0c;是解决问题的方案&#xff0c;并且&a…

【Verilog】数据流建模传输问题:赋值传输有方向

这次&#xff0c;我们说明的是&#xff0c;assign语句实现的数据流建模&#xff0c;包含的是两个层面 建立联系传输方向 assign A B的本质含义是 A与B建立关联B的值传给A 这个传输方向至关重要&#xff0c;实际情况是什么&#xff0c;就必须按照顺序进行&#xff0c;不是单…

【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(2)

待办事项 时钟频率高&#xff0c;取指周期长&#xff0c;远大于执行周期&#xff0c;如何处理&#xff1f; 不可综合逻辑的处理 接上一篇 【计算机系统设计】实践笔记&#xff08;2&#xff09;数据通路构建&#xff1a;第一类R型指令分析&#xff08;1&#xff09; 8.2 ALU运…

【计算机系统设计】实践笔记(2)插叙:综合与实现

接上一篇文章的第10节 之前完成了功能仿真&#xff0c;下面我们进行综合实现。 10.1.1 综合 综合成功。 实现试试 这真是令人悲伤……找Bug吧。 我们看看综合后的门级网表。 发现综合后的并不是我们想要的……看了看可能是综合的目录错误&#xff0c;我们再试试。 不是这…

【电路原理】学习笔记(1):电路模型的基本变量

上一讲说到了电路模型&#xff0c;这一电路的抽象&#xff0c;现在我们看看它的基本组成。 1 电流 1.1 概念 对于一根管道&#xff0c;它能够流通电荷&#xff0c;定向移动就形成了电流。 单位时间t内&#xff0c;&#xff0c;某一横截面&#xff0c;穿过电荷量是q&#xf…

【电路原理】学习笔记(0):电路与电路模型

东北大学电路原理MOOC 电路原理的核心点&#xff1a;研究电路模型 我们实际看见的&#xff0c;是真实电路 我们高中学的&#xff0c;是电原理图 现在&#xff0c;我们要研究的是电路模型&#xff0c;它是实际电路的抽象模型&#xff0c;并且是理想化的。 对于电路模型&#…

【计算机系统设计】实践笔记(3)改进数据通路:移位R型指令分析

0 回顾 前面的内容中&#xff0c;第一类R型指令分析&#xff0c;我们完成了一类R型指令的设计&#xff0c;完成了其数据通路&#xff0c;构建了相应的部件&#xff0c;并且完成了从ROM中取指&#xff0c;成功进行了基本的功能仿真&#xff0c;进行了综合和实现&#xff0c;但是…

【计算机系统设计】实践笔记(3)改进数据通路:jr指令分析与实现

1 jr指令分析 instructionoprsrtrdshamtfuncjr000000rs000000000000000001000 举例&#xff1a;jr $31 功能&#xff1a;PC <- &#xff08;$31&#xff09; 这是个跳转指令&#xff0c;将指定寄存器的值&#xff0c;放入PC中&#xff0c;是无条件跳转。 我们需要 更新P…

【计算机系统设计】实践笔记(4)改进数据通路:第一类I型指令分析与实现

0 回顾 之前&#xff0c;我们完成了17条R型指令的设计&#xff0c;接下来&#xff0c;我们逐步完成I型指令的设计。 1 核心思想&#xff1a;增量思维 & 复用思维 & 学会选择 & 分治思想 增量思维 我们从无到有&#xff0c;构建了支持R型指令的CPU&#xff0c;接…

【算法】学习笔记(2):递归思想

0 回顾 之前的笔记&#xff08;0&#xff09;和笔记&#xff08;1&#xff09;&#xff0c;我们介绍了算法的基本含义&#xff0c;并且举了一些实例&#xff0c;同时理解了&#xff0c;算法就是人类在教计算机做事情&#xff01; 我们知道&#xff0c;算法就是解决问题的方案…

【计算机系统设计】实践笔记(5)改进数据通路:beq和bne指令分析与实现

接下来的分析和实践非常粗糙&#xff0c;因为跟之前一样的分析流程&#xff0c;不再多说了&#xff0c;如果前面真的掌握&#xff0c;这里不看也罢。 分析 先看beq指令。 ALU输入的是rs和rt&#xff0c;不输入imm&#xff0c;进行subu操作&#xff0c;判断是否为zero&#x…

【算法】学习笔记(4):分治思想 归并排序

分治思想&#xff0c;分治策略&#xff0c;自古有之&#xff0c;与人类生活息息相关&#xff0c;其本质是将大问题拆解为小问题&#xff0c;小问题转换为已知解的问题&#xff0c;进而求解。 军队管理&#xff0c;国家分级治理…… 大规模数据排序&#xff0c;例如10000000000…

html css 学习笔记(1)背景相关

背景颜色 图片 插入图片img背景图片 背景图片 3. logo 4. 大图 5. 装饰性小图 便于控制位置&#xff01; 插入后会执行自动平铺&#xff0c;这与插入图片是不同的&#xff01; div{width: 600px;height: 300px;background-image: url(img/登录用户头像.png); }小结 盒子的第…