400 likes | 542 Views
简化 CPU 设计. 刘悦 13648018193. 308679868@qq.com. 目 录. 1. 课程设计要求. 2. 设计思路. 提交的设计和文档要求. 3. 4. 一、 课程设计要求. 设计16位精简指令集CPU指令系统; 完成精简指令集CPU的结构设计和所有模块的代码编写,并仿真验证; 编写能够完成加法器﹑流水灯等功能的汇编程序,并翻译成二进制机器码; 设计CPU外围模块如分频器,存储器和IO接口,并在软件平台上仿真CPU执行程序的完整过程; 下载工程到FPGA芯片,在硬件资源上实现。. 二 、设计思路. 1、CPU指令集系统设计
E N D
简化CPU设计 刘悦 13648018193 308679868@qq.com
目 录 1 课程设计要求 2 设计思路 提交的设计和文档要求 3 4
一、课程设计要求 • 设计16位精简指令集CPU指令系统; • 完成精简指令集CPU的结构设计和所有模块的代码编写,并仿真验证; • 编写能够完成加法器﹑流水灯等功能的汇编程序,并翻译成二进制机器码; • 设计CPU外围模块如分频器,存储器和IO接口,并在软件平台上仿真CPU执行程序的完整过程; • 下载工程到FPGA芯片,在硬件资源上实现。
二、设计思路 1、CPU指令集系统设计 本课程设计所设计的RISC_CPU指令长度为16位,能够处理16位数据。 指令中需要操作符,寄存器地址和立即数等字段。
二、设计思路 完成立即数数据载入操作需要如下指令: mil:将立即数放在低8位 mih:将立即数放在高8位 因为一条指令无法载入完整16比特立即数数据,将16bits数据传递到通用寄存器需要2条指令。
二、设计思路 完成存储器或I/O数据载入与储存需要如下指令: lda:载入指定地址数据 sta:储存数据到指定地址 inp:从端口输入 oup:输出到端口 对存储器某些地址上的数据的处理是必不可少的。
二、设计思路 完成数据运算操作需要如下指令: • and:寄存器数据与操作orr:寄存器数据或操作 • not:寄存器数据非操作shl:左移 • shr:右移add:寄存器数据相加 • sub:寄存器数据相减mul:寄存器数据相乘 • cmp:寄存器数据相比较
二、设计思路 完成对标志位的处理操作需要如下指令: • szf:对零标志位置1 • czf:清除零标志位 • scf:对进位标志位置1 • ccf:清除进位标志位 • 设计这些指令为分支操作的执行创造了条件。
二、设计思路 完成指令跳转、分支操作需要如下指令: • spc:保存pc的值 • jpa:跳转到指定位置 • jpr:跳转到相关位置 • brz:以零标志位为条件的分支 • brc:以进位标志位为条件的分支
二、设计思路 完成对窗口指针的操作需要如下指令: • cwp:清除窗口指针 • awp:窗口指针与立即数相加 完成无操作、中断需要如下指令: • nop:无操作 • hlt:中断
二、设计思路 建议本课程设计所设计的CPU的指令格式为: • 15-12bit规定指令的类型; • 11-8bit选择寄存器,共设有8个寄存器,前2位为目的寄存器,后2位为源寄存器; • 7-0bit为立即数。 示例指令如下表2-1所示,其中D、S分别为目的、源寄存器,I为立即数。
二、设计思路 2、精简指令集CPU结构设计 CPU整体设计 RISC_CPU是一个复杂的数字逻辑电路。 图2-1 精简指令集CPU的接口
二、设计思路 课程设计所设计的精简指令集CPU包括数据通路和控制器,如图2-2所示。其中: • 数据通路部分主要由以下基本部件组成:寻址单元、算术逻辑单元、通用寄存器阵列、窗口指针、指令寄存器、状态寄存器。 • 控制器是7状态的状态机,不同状态下向数据通路发送不同的控制信号。
图2-2 精简指令集CPU层次结构 二、设计思路
二、设计思路 数据结构 • 寻址单元:包括程序计数器和地址逻辑两部分。 • 地址逻辑是个小型的算术单元,通过加法和递增来计算程序计数器的值或储存器的地址。 • 寻址单元的控制信号决定寻址单元的输出内容。寻址单元根据输入控制信号生成程序计数器的输入信号。
二、设计思路 图2-3 寻址单元结构
二、设计思路 • 如执行指令jpa “跳转到指定位置”,二进制码设为1111-D-11-I,表达式为PC<=Rd+I。 • 指令码1111-D-11在控制器处于exec1状态时输入控制器,产生一系列控制信号, • 产生的结果是地址逻辑将RSide的值与ISide的值相加,结果作为输出地址发送给存储器。
二、设计思路 • 算数逻辑单元:ALU的输入信号有B15to0,AandB,AorB,notB,shlB,shrB,AaddB,AsubB,AmulB和AcmpB,这些信号选择ALU进行的操作。
二、设计思路 图2-4 算术逻辑单元结构
二、设计思路 • 如执行指令mih“将立即数放到高8位”二进制码为1111-D-01-I,表达式为Rdl<={I,8’BZ}。 • 指令码1111-D-01在控制器处于exec1状态时输入控制器,产生一系列控制信号。 • 产生的结果是立即数I被治理寄存器从低8位放到高8位,并经过算术逻辑单元回到数据总线,写入寄存器阵列D寄存器的高8位。
二、设计思路 • //Arithmetic Logic Unit (ALU) • `timescale 1 ns /1 ns • `define B15to0H 10'b1000000000 • `define AandBH 10'b0100000000 • `define AorBH 10'b0010000000 • `define notBH 10'b0001000000 • `define shlBH 10'b0000100000 • `define shrBH 10'b0000010000 • `define AaddBH 10'b0000001000 • `define AsubBH 10'b0000000100 • `define AmulBH 10'b0000000010 • `define AcmpBH 10'b0000000001
二、设计思路 • module ArithmeticUnit ( • A, B, • B15to0, AandB, AorB, notB, shlB, shrB, AaddB, AsubB, AmulB, AcmpB, • aluout, cin, zout, cout • ); • input [15:0] A, B; • input B15to0, AandB, AorB, notB, shlB, shrB, AaddB, AsubB, AmulB, AcmpB; • input cin; • output [15:0] aluout; • output zout, cout; • reg [15:0] aluout; • reg zout, cout;
二、设计思路 • always @( • A or B or B15to0 or AandB or AorB or notB or shlB or shrB or AaddB or AsubB or AmulB or AcmpB or cin • ) • begin • zout = 0; cout = 0; aluout = 0; • case ({B15to0, AandB, AorB, notB, shlB, shrB, AaddB, AsubB, AmulB, AcmpB}) • `B15to0H:aluout = B; • `AandBH: aluout = A & B; • `AorBH: aluout = A | B; • `notBH: aluout = ~B; • `shlBH: aluout = {B[14:0], B[15]}; • `shrBH: aluout = {B[0], B[15:1]}; • `AaddBH: {cout, aluout} = A + B + cin; • `AsubBH: {cout, aluout} = A - B - cin; • `AmulBH: aluout = A[7:0] * B[7:0];
二、设计思路 • `AcmpBH: begin • aluout = A; • if (A> B) cout = 1; else cout = 0; • if (A==B) zout = 1; else zout = 0; • end • default: aluout = 0; • endcase • if (aluout == 0) zout = 1'b1; • end • endmodule
二、设计思路 指令寄存器只有一个输入控制信号:IRload 图2-5指令寄存器结构
二、设计思路 • 如执行指令awp“窗口指针与立即数相加”,二进制码0000-10-10-I表达式为WP<=WP+I。 • 指令码0000-10-10在控制器处于exec1状态时输入控制器,产生一系列控制信号。 • 产生的结果是指令寄存器将立即数I送到窗口指针寄存器,与原窗口偏移值相加,其结果作为新的窗口偏移值。
二、设计思路 寄存器阵列是带移动窗口指针的双端口储存器。 图2-6通用寄存器阵列结构图
二、设计思路 • 状态寄存器 图2-7状态寄存器结构
二、设计思路 • 窗口指针:用于存放通用寄存器的窗口偏移值,达到扩大通用寄存器数量的目的。 • 本CPU共设有8个通用寄存器。 图2-8窗口指针寄存器结构
二、设计思路 控制器 • 控制器是7状态的状态机,不同状态下向数据通路发送不同的控制信号。下面分别介绍控制器的各个部分。 • 控制器端口:控制器控制37个信号给数据通路。控制器的输出是reg类型,通过组合的always语句对它们赋值。
二、设计思路 • 控制状态:参数声明里定义了7个状态。 • Reset状态和halt状态分别对应状态机的初始和中断状态。 • 在fetch状态下,状态机读取16比特的指令。 • 在memread状态。 • 在execl状态下执行指令。 • 额外状态execllda来完成对存储器的读操作。 • 在incpc状态下让程序计数器加1。
二、设计思路 • 指令的执行:exec1状态下mvr指令的执行。 • 该指令从寄存器阵列的右路地址读取一个字,写入左路地址。 • 控制信号RFright_on_OpndBus,B15to0,RFLwrite和RFHwrite为1。
二、设计思路 图2-6 系统最高层结构图 3、外围模块设计 • 要想让CPU工作,还需要一些外围模块配合,如分频器模块、存储器模块和I/O模块。
二、设计思路 • 分频器:为CPU正常工作提供稳定的时钟信号及主频。 • 存储器:作为CPU的外部存储器,存储CPU执行的程序指令。 • I/O模块:作为本课程设计唯一的输出模块,从数据总线上得到CPU处理好的数据,驱动LED灯闪烁。
二、设计思路 图2-7存储器结构图
二、设计思路 4、仿真与测试 • 完成CPU各模块的设计,外围模块的设计和软件程序的编写编译及初始化到存储器中的工作。 • 对系统最高层进行仿真通过。 • 下载到FPGA实验板上,进行实际测试,运行观察分析实验现象。
三、提交的设计和文档要求 • 1.介绍所设计的16位精简指令集CPU指令系统; • 2.上交精简指令集CPU所有模块的代码及仿真结果图,并分析仿真结果; • 3.分析所编写的汇编程序,并翻译成二进制机器码; • 4.自己编写的CPU外围模块如分频器,存储器和IO接口,上交各模块代码,利用库例化完成的介绍步骤,并分析CPU执行程序的仿真结果图;
资料 • 教材:《Verilog》数字系统设计,《微机原理》。 • 图书馆:查找关键字“CPU”。 • 百度:查找关键字“CPU”。