基于计算机组成原理课程设计和Verilog数字系统设计第二版夏宇闻版 笔者通过记录课设中CPU的设计过程以总结 后续文章请参看计算机组成原理专栏
RISC-CPU是一个复杂的数字逻辑电路,但是它的基本部件的逻辑并不复杂,可把它分
成8个基本部件来考虑;
〈1)时钟发生器 (2)指令寄存器; (3)累加器; (4)算术逻辑运算单元; (5)数据控制器; (6)状态控制器; (7)程序计数器; (8)地址多路器。
各部件的互相连接关系如图 其中时钟发生器利用外来信号进行分频生成系列时钟
时钟发生器?
时钟发生器CLKGEN利用外来时钟信号clk生成一系列时钟信号clk1,fetch,alu_clk,并送往CPU的其他部件。其中,fetch是控制信号,elk的8分频信号。当FETCH高电平时,使CLK能触发CPU控制器开始执行一条指令;同时FETCH信号还将控制地址多路器输出指令地址和数据地址。clk信号用作指令寄存器、累加器、状态控制器的时钟信号。ALU_ENA则用于控制箅术逻辑运算单元的操作。图17.2为时钟clkgen的波形如图所示
时钟发生器的设计中采用了同步状态机的设计方法,使clk_gen可以被综合。
?
指令寄存器
指令寄存器的触发时钟是clk,在clk的正沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中。但并不是每个clk的上升沿都寄数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。load_ir信号通过ena口输到指令寄存器,复位后,指令寄存器被清为零。
每条指令为两个字节,即16位。高3位是操作码,低13位是地址〈CPU的地址总线为13位,寻址空间为8K字节)。本设计的数据总线为8位,所以每条指令需取两次“先取高8位,后取低8位。而当前取的是高8位还是低8位·由变state记录。为0表示取的是8位,存入高8位寄存器,同时将变量state置为1.下次再寄存时,由于state为1,可知取的是低8位,存入低8位寄有器中。
?
累加器 ACCUM
累加器用于存放当前的结果,它也是双目运算中的一个数据来源(见图17,5).复位后,累加器的值是零·当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clkl时钟正跳沿时就收到来自数总线的数据。 ?
?算术运算器ALU
地址多路器ADR?
地址多路器如图所示,它用于选输出的地是(程序计数)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址,后4个时钟周期用于对RAM或端口的读写,该地由指令给出.地址的选择输出信号由时钟信号的8分频信号fetch提供。
程序计数器PC?
程序计数器如图所示。它用于提供指令地址,以便读取指令·指令按地址序存放在存储器中·有两种途径可形成指令地址;其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行IMP指令后,需要形成新的指令地址。下面就来详细说明PC地址是如何建立的。
复位后.指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行·每条指令执行完需两个时钟,这时pc_addr,已被增2,指向下一条指令(因为每条指令占两个字节)-如正在执行的指令是跳转语句,这时CPU状态控制器将会输出load-pc信号,通过load口进人程序计数器·程序计数器(pc_addr)将装人目标地址〔ir-addr),而不是增2。
?
状态机控制器?
状态控制器如图所示·它由两部分组成:
(1)状态机(图中的MACHINE部分〕;
(2)状态控制器(图中的MACHINECTL部分).
状态机控制器接收复位信号RST,当RST有效时,通过信号ena使其为0,输人到状态机中,以停止状态机的工作。
状态控制器的VerilogHDL程序见下面模块;
状态机是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件生CPU何时进行读指令来读写I/O端囗及RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变最state记录,state的值就是当前这个指令周期中已经过的时钟数〈从零计起)。指令周期是由8个时钟周期组成,每个时钟周期都要完成固定的搡作,即
(1)第0个时钟,CPU状态控制器的输出rd和load_ir为高电平,其余均为低电平·指令寄存器寄存由ROM送来的高8位指令代码。
(2)第1个时钟,与上一时钟相比只是inc_pc从0变为1,故PC增1,ROM送来低8位指令代码,指令寄存器存该8位代码。
(3)第2个时钟,空操作
〔4)第3个时钟,增1,指向下一条指令。若搡作符为HL六输出信号HLT为高。如果操作符不为HLT,除了PC增一外(指向下一条指令).其他各控制线输出为零“
(5)第4个时钟,若操作符为AND,ADD,XOR或LDA,读相应地址的数据,若为JMP,将目的地址送给程序计数器i若为STO,出累加器数据。
(6)第5个时钟,若操作符为ANDD.ADD或XORR,算术运箅器就进行相应的运算;若为LDA,就把数据通过算数运算器送给累加器;若为SKZ,先判断累加器的值是否为如果为0,PC就增1,否则保持原值:若为JMP,锁存目的地址若为STO,将数据写人地处。
(7)第6个时钟,空操作。
〈8)第7个时钟,若操作符为SKZ且禦加器值为0,则PC值再增1,跳过一条指令,否则PC无变化。
状态机和状态机控制器组成了状态控制器。
外围:ROM\RAM\地址译码器? 1.地址译码器:用于产生选通信号,选通ROM或RAM
2.ROM和RAM
?
cpu的操作和时序?
一个微机系统为了完成自身的功能,需要CPU执行许多操作。以下是RISC-CPU的主要操作,
(1)系统的复位和启动搡作;
(2)总线读操作
(3)总线写操作
系统的复位和启动搡作
RISC-CPU的复位和启动操作是通过reset引脚的信号触发执行的·当reset信号一进入高电平,RISC-CPU就会结束现行操作,并且只要reset停留在高电平状态,CPU就维持在复位状态。在复位状态,CPU各内部寄存器都被设为初值,全部为零·数据总线为高阻态,地址总线为佣00H,所有控制信号均为无效状态。reset回到低电平后,接着到来的第一个fetch上升沿将启动RISC-CPU开始工作,
从ROM的000处开始读取指令并执行相应操作。
总线读操作
每个指令周期的前0~3个时钟周期用于读指令,在状态控制器中已详细讲述,这里就不再重复;第3·5个周期处,存储器或端口地址就输出到地址总线上;第4~6个时钟周期,读信号rd有效,数据送到数据总线上,以备累加器锁存,或参与算术、逻辑运算;第7个时钟周期,读信号无效,第7,5个时钟周期,地址总线输出pc地址,为下一个指令做好准备。
总线写操作??????????????
每个指令周期的第3.5个时钟周期处,写的地址就建立了;第4个时钟周期输出数据;第5个时钟周期输出写信号;至第6个时钟结束,数据无效;第7,5个时钟地址输出为PC地址,为下一个指令周期做好准备。图17,13为CPU对存储器或端口写数据的时序。
CPU的寻址方式和指令系统?
模块的综合?
仿真文件cputop
?
?
?
?
由于笔者比较懒 所以没有具体代码块 后续会补充上的 见谅见谅
|