请选择 进入手机版 | 继续访问电脑版

支持16条指令的 多周期CPU设计

[复制链接]
丶禁飞 发表于 2021-1-1 10:34:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
支持16条指令的 多周期CPU设计



CPU概述

电子盘算机三大焦点部件就是CPU、内部存储器、输入/输出设备。
中央处理处罚器(CPU,Central Processing Unit)作为盘算机系统的运算和控制焦点,是信息处理处罚、步伐运行的最终执行单元。其功能主要是解释盘算机指令以及处理处罚盘算机软件中的数据:负责读取指令,对指令译码执行指令
中央处理处罚器主要包罗两个部分,即控制器运算器,此中还包罗高速缓冲存储器及实现它们之间接洽的数据、控制的总线。
在盘算机体系结构中,CPU 是对盘算机的所有硬件资源(如存储器、输入输出单元) 举行控制调配、执行通用运算的焦点硬件单元。盘算机系统中所有软件层的操纵,最终都将通过指令集映射为CPU的操纵
一种SoC的结构如下图所示,CPU外部通过总线结构来毗连存储器和IO设备,此中只有CPU和DMA是master设备,其他都是slave设备。

CPU指令集

下面是要实现的一个浅易CPU的指令集,如下表所示,一共16条指令,使用这些指令就可以实现一些复杂的功能。

CPU软件开辟流程

一般来说,从高级语言步伐设计将步伐下载进入CPU运行的流程是:
(1)编写高级语言步伐(如C语言步伐);
(2)使用编译器编译高级语言步伐,生成汇编步伐.s文件;
(3)将汇编步伐转换为相应的呆板指令步伐,并将呆板码指令存入.bin或.hex文件中;
(4)将文件通过JTAG接口下载进入CPU的“步伐存储器”(ROM或FLASH)中的用户地点段,CPU上电后即可读取此中的步伐来执行每条指令。
// 以上为嵌入式步伐的开辟流程,开辟PC端步伐在最后两步差别:
// (3)将.s为后缀的汇编语言源代码文件生成以.o为后缀的目标文件;
// (4)当所有的目标文件都生成之后,编译器会完成最后的链接过程,生成可执行文件。(实际上最后也是执行呆板指令)
CPU上电后一般的指令执行流程为:
(1)读取“步伐存储器”中固定地点段的起始步伐,用于初始化CPU的一些根本设置;
(2)读取用户写入“步伐存储器”中的用户地点段的步伐,完成用户需要实现的功能(运行main函数中的步伐)。
CPU电路结构及实现

整体架构

浅易CPU的整体结构如下图所示。

此中:
(1)ControlUnit的功能在cpu模块(top)中实现;
(2)PC、IR、Memory在MemoryPart模块实现;
(3)Datapath for Executing ALL Instructions在CalPart模块(包罗RegFileALU)实现。
这个CPU是一个多周期处理处罚器,与单周期处理处罚器相比,多周期处理处罚器使用多个周期完成一条指令,将指令拆分成各个环节,这样可以使系统运行的时钟频率更高,使系统整体达到更好的效果。在多周期CPU设计的底子上,利用各阶段电路间可并行执行的特点,让各个阶段的执行在时间上重叠起来,这样就实现了流水线CPU。
RegFile模块

模块界说了4个寄存器:R0、R1、R2、R3,宽度均为10bit。可以通过wr_en + wr_addr将RF_IN的数据写入相应地点;也可以通过rd_en + rd_addr将相应地点的数据读出到A或B。

RegFile.v
[code]`timescale 1ns / 1ps// Company: // Engineer: // // Create Date: 2020/12/25// Author Name: Sniper// Module Name: RegFile// Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision:// Revision 0.01 - File Created// Additional Comments:// module RegFile#(    parameter REGISTER_LEN = 10)(    input clk,    input rst_n,        input [REGISTER_LEN-1:0] RF_IN,    input       wr_en,    input [1:0] wr_addr,    input       rd_A_en,    input [1:0] rd_A_addr,    input       rd_B_en,    input [1:0] rd_B_addr,        output reg [REGISTER_LEN-1:0] A,        output reg [REGISTER_LEN-1:0] B);reg [REGISTER_LEN-1:0] register [3:0];//writealways@(posedge clk or negedge rst_n)    if(wr_en)        register[wr_addr]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )