当前位置:文档之家› 16位CPU设计

16位CPU设计

设计一个非常简单的16位CPUI hear and I forget. I see and I remember. I do and I understand.-- 孔子Easy Right 计算机研究小组 August 2003第一章简介1.目的本项目的目的是设计一个十分简单的基于冯·诺依曼架构的16位CPU。

我们将这颗CPU命名为ERVS16-CPU(EasyRight Very Simple 16-bit CPU )。

ERVS16有它自己的指令集。

并且,为了测试ERVS16,我们将在项目的最后用它的指令集编写一个十分简单的操作系统。

简单的说,我们在这个项目中只考虑CPU,寄存器,内存和指令集之间的关系。

这就是说我们只需要实现:(1)读/写寄存器(2)读/写内存(3)执行指令集中的所有指令图1.1是ERVS16的抽象图图 1.1 ERVS16抽象图假设系统时钟频率是1MHz,我们将在设计中使用正缘触发时钟频率(Positive Edge Triggered Clocking)技术。

复位信号首先输入一个高电平初始化 CPU ,接着当复位信号变为低电平时开始运行位于0地址的指令。

内存读/写循环时,要确保可读/可写信号是在低电平。

如图1.2和1.3,所有内存读写操作都需要一个信号周期来完成。

时钟技术(Clocking Methodology)定义了信号可以被读写的时间。

读写操作不能同时进行。

边缘触发时钟频率技术(Edge-triggered Clocking Methodology)正是被用来防止这样的情况发生。

边缘触发时钟频率技术是指机器存储的所有值都只能在时钟边缘被更新。

图1.2 内存读取循环时间图图1.3 内存写入循环时间图2.测试环境我们使用XILINX development board来测试对ERVS16的设计。

XILINX development board包括如下部件:一系列I/O设备(包括一系列开关(Switch)和7 Segment DisplaysRAM: 1k x 16ROM: 1k x 16:它被用于存储测试程序。

在模拟开始的时候,ROM镜像从一个测试文件(Test File)中加载。

这个文件的每一行都包括由空格隔开的两个值:一个十进制的地址和一个二进制的值。

比如:1 10101000101010102 01010110011001104 01010111101010007 00101010110101015 0111000101010000系统:包括内存和I/O设备的界面图1.4显示了development board的主要组成部分。

我们只需要实现红色的部分图 1.4 设计结构下表显示了development board上所有设备的技术细节。

设备地址范围访问模式ROM (1KW) 0x0000 – 0x03FF read onlyRAM (1KW) 0x0400 – 0x07FF read and writeonly 开关 0x8000read7 Segment Displays 0x8001 – 0x8002 read and write第一个串口0xC000 – 0xC001 read and write第二个串口0xC002 – 0xC003 read and write2.计划整个计划将在四个月内完成(从2003年7月27日到2003年11月27日)。

在项目完成之后,我们将会有设计真正CPU的经验。

这样的经验在我们今后设计复杂的CPU时会有帮助。

下面是时间表:27/7/2003 – 2/8/2003(1)确定支持的指令集及其格式(2)CPU的寄存器级元件图,包括程序计数器(Program counter),存储指令的内存(Instruction memory),存储数据的内存(Data memory),寄存器(Registers),算术和逻辑单元(ALU),以及如何连接它们;(3)用有限状态机(Finite State Machine,FSM)列出所有信号和状态的组合3/8/2003 – 9/8/2003(1)Multicycle diagram;(2)ALU支持所有指令集10/8/2003 – 16/8/2003(1)用VHDL实现图4.1的大多数部分第二章指令集1.限制和假设限制(1)字长16位(2)固定指令长度(3)支持子程序(4)位移语句的位移量是2的倍数假设(1)基于字(word)的寻址方式(2)寄存器到寄存器(3)8个16位寄存器(4)8个1位寄存器(5)3个操作数格式(6)当获取指令时PC自动增加2.指令及其格式ERVS16拥有它自己的指令集,每条指令都与一个硬件操作精确对应。

这些指令可以分为四类:算术指令机器码 ASM格式作用0001 ddds ssii i000 srl Rd, Rs , Iamt Rd <= Rs >> Iamt (unsigned)0001 ddds ssii i001 sra Rd, Rs, Iamt Rd <= Rs >> Iamt (signed)0001 ddds sstt t010 sla Rd, Rs, Iamt Rd <= Rs << Iamt0001 ddds sstt t011 add Rd, Rs, Rt Rd <= Rs + Rt0001 ddds sstt t100 sub Rd, Rs, Rt Rd <= Rs – Rt0110 ddds sstt teee mult Re, Rd, Rs, Rt Rd <= (Rs * Rt)15:0, Re <= (Rs * Rt)31:16 0111 ddds sstt teee div Re, Rd, Rs, Rt Rd <= Rs / Rt, Re <= Rs % Rt0001 ddds ss00 0101 not Rd, Rs Rd <= not Rs0001 ddds sstt t110 and Rd, Rs, Rt Rd <= Rs AND Rt0001 ddds sstt t111 or Rd, Rs, Rt Rd <= Rs OR Rt测试指令:格式作用机器码 ASM0000 ddds ssii i100 tstlt Bd, Rs, Rt Bd <= '1' if Rs < Rt else '0'0000 ddds ssii i001 tstgt Bd, Rs, Rt Bd <= '1' if Rs > Rt else '0'0000 ddds ssii i110 tstle Bd, Rs, Rt Bd <= '1' if Rs <= Rt else '0'0000 ddds ssii i011 tstge Bd, Rs, Rt Bd <= '1' if Rs >= Rt else '0'0000 ddds ssii i010 tsteq Bd, Rs, Rt Bd <= '1' if Rs = Rt else '0'0000 ddds ssii i101 tstne Bd, Rs, Rt Bd <= '1' if Rs != Rt else '0'内存指令:格式作用机器码 ASM0100 ddd0 iiii iiii li Rd, immed (Rd)15:8 <= 0; (Rd)7:0 <= immed0101 ddd0 iiii iiii lui Rd, immed (Rd)15:8 <= immed; (Rd)7:0 <= (Rd)7:0 1100 ddds ssii iiii lw Rd, immed(Rs) Rd <= mem[immed + Rs] (signed +) 1101 ddds ssii iiii sw Rd, immed(Rs) mem[immed + Rs] <= Rd (signed +)跳转和分支指令:格式作用机器码 ASM1011 ddd0 0000 0000 jr Rd PC <= Rd1010 ddd0 0000 0000 jalr Rd R7 <= PC; PC <= Rd1000 dddi iiii iiii beqz Bd, offset PC <= PC + offset if Bd = '0' else PC + 1 (signed) 关于上面图标的命名规则:Rd:存储目标操作数的寄存器,它保存操作结果Rs:第一个源操作数寄存器Rt:第二个源操作数寄存器Bd:存储布尔值的寄存器;Re:为乘法和除法指令准备的额外寄存器I:整数第三章数据路径(Datapath)和控制器(Control)1.介绍ERVS16基于MIPS,因此,它有下列特征[1]:ERVS16有两个主要部分:数据路径和控制。

数据路径负责处理算术操作,而控制器按照程序指令的指示来控制数据路径,内存和I/O设备的行为。

在ERVS16钟,对于任何一个指令,头两步都是相同的:(1)将程序计数器(program counter,PC)送到包含有代码的内存中,并获取后面的指令。

(2)读取一个或者两个寄存器,用指令空间来选择读取的寄存器。

ERVS16的功能单元执行包括两种逻辑元素:操作数值的元素和包含状态的元素。

(1)操作数值的元素(Combinational elements):它们的输出只取决于当前的输入(2)包含状态的元素(Sequential/State elements):有一些临时存储。

一个包含状态的元素至少有两个输入(被写入到元素的数值和时钟)以及一个输出(在前面某个时钟周期写入的值)。

包含状态的元素只有在可写(write_enable)信号被声明并且在时钟边缘才能被改写。

2.构建数据路径对于不同的指令,我们将构建不同的数据路径。

在本节中只实现一部分指令,其他指令将会在后面的章节实现。

(1)获取指令(Fetching instructions)和增加程序计数器值(incrementing PC)数据路径包括:(a)存放指令的内存(Instruction memory):它用来存储一个程序中的指令,是一个包含状态的元素(state element);(b)程序计数器:用于保存下一条指令的地址。

相关主题