简单微处理器的设计与实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

刘言·1990liuyan@163.com·2009.12大学生电子实验室简单微处理器的设计与实现刘言(湖北师范学院)摘要:本次设计完全用verilog硬件描述语言编写微处理器的各个部件,在顶层文件里将各个部件连接起来形成一个简单的微处理器,加上一些外围模块来实现一些功能。一、设计任务和技术指标运用在“数字电路与逻辑设计”课程中学过的基本理论知识,设计并用可编程逻辑器件实现一个简单的八位操作数的微处理器。完成微处理器硬件系统设计和指令系统设计两方面的任务,使微处理器能够实现两个不带符号位的八位二进制数原码相乘等功能。二、简单介绍本次设计完全用verilog硬件描述语言编写微处理器的各个部件,在顶层文件里将各个部件连接起来形成一个简单的微处理器,加上一些外围模块来实现一些功能。本次设计在合理性与实用性上没有考虑,只是为了达到技术指标,从原理上完成了一个简单的RISC_CPU设计。1.微处理器硬件系统及原理A、内部组成微处理器硬件由一下八个基本部件组成:运算器、控制器、指令寄存分离器、时钟发生器、程序计数器、累加器、地址选择器、数据选择器。时钟发生器CLK_GEN:利用输入时钟信号生成三个时钟信号送往对应的部件。程序计数器PC:存放将要执行指令的地址。指令寄存器IR:存放被执行指令的操作码和操作数的地址,直接供运算器与控制器。控制器CON:根据操作码产生一系列时序逻辑信号,控制微处理器各个部件协调一致地完成每条指令相应的操作。运算器ALU:当时钟上升沿来时对累加器与数据总线上的数进行加减乘除或逻辑运算。累加器ACC:暂时存放运算结果。地址选择器:选择输出到地址总线上的地址,是PC还是操作数地址。数据选择器:选通ALU的运算结果输出到数据总线上去。下面是内部连接图:(见最后一页)B、外围模块程序存储器ROM:存放程序指令。数据存储器RAM:读取存放运算中间变量等临时数据。输入输出特殊寄存器:数据的输入输出。外部部分连接图:刘言·1990liuyan@163.com·2009.12大学生电子实验室外围设备通过总线连接CPU2.处理器指令系统及功能处理器的基本指令字长为W位,指令的每一位从高到低用DW、DW-1、…D1、D0表示,有些微处理器的一条指令包括多个指令字长,即每条指令的长度不一样,例如Intel的80386等。本实验为了简化设计,规定所有的指令都是单指令字的指令,且所有指令的长度都是8,即一个字节。因此可以有8种操作,5根地址线寻址空间为32B。指令的前3位为操作码,后5位为操作数的地址,寻址方式只设计了直接寻址。详细如下表:指令助记符操作说明000_DDIV除A=A/(D)001_DJMP无条件跳转PC=D010_DADD加A=A+(D)011_DSUB减A=A-(D)100_DMUL乘TA=A*(D)101_DLDA读A=(D)110_DSTO写D=A111_DJNA条件跳转如果A=0,PC=D.三、各模块详细介绍1、时钟发生器:时钟发生器clkgen的波形见下图:刘言·1990liuyan@163.com·2009.12大学生电子实验室、程序计数器:程序计数器用于提供指令地址,以便读取指令,指令按地址顺序存放在存储器中。有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP指令后,需要形成新的指令地址。复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。每条指令执行完需1个时钟,这时pc_addr已被增1,指向下一条指令。如果正执行的指令是跳转语句,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。程序计数器(pc_addr)将装入目标地址(ir_addr),而不是增1。Verilog代码:1.modulecounter(pc_addr,ir_addr,load,clock,rst);2.output[4:0]pc_addr;3.input[4:0]ir_addr;4.inputload,clock,rst;5.reg[4:0]pc_addr;6.7.always@(posedgeclockorposedgerst)8.begin9.if(rst)10.pc_addr=0;11.else12.if(load)13.pc_addr=ir_addr;14.else15.pc_addr=pc_addr+1;16.end17.endmodule3、指令寄存器刘言·1990liuyan@163.com·2009.12大学生电子实验室指令寄存器的触发时钟是clk1,在clk1的正沿触发下,寄存器将数据总线送来的指令存入opcode(高3位)或ir_addr(低5位)中。但并不是每个clk1的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。load_ir信号通过ena口输入到指令寄存器。复位后,指令寄存器被清为零。Verilog代码:1.moduleregister(opcode,ir_addr,data,ena,clk,rst);2.output[2:0]opcode;3.output[4:0]ir_addr;4.input[7:0]data;5.inputena,clk,rst;6.reg[2:0]opcode;7.reg[4:0]ir_addr;8.9.always@(posedgeclk)10.begin11.if(rst)12.begin13.opcode=3'b000;14.ir_addr=5'b00000;15.end16.else17.begin18.if(ena)19.begin20.opcode=data[7:5];21.ir_addr=data[4:0];22.end23.end24.end25.endmodule4、运算器根据输入的8种不同操作码对两个数据(data、accum)分别实现相应的运算,结果由alu_out输出。Verilog代码:1.modulealu(alu_out,zero,bz,data,accum,alu_clk,opcode);2.output[7:0]alu_out;3.outputzero,bz;4.input[7:0]data,accum;5.input[2:0]opcode;6.inputalu_clk;7.reg[7:0]alu_out,tmp;8.regbzt;9.initialbzt=0;10.11.parameterDIV=3'b000,12.JMP=3'b001,13.ADD=3'b010,刘言·1990liuyan@163.com·2009.12大学生电子实验室=3'b011,15.MUL=3'b100,16.LDA=3'b101,17.STO=3'b110,18.JA=3'b111;19.20.assignzero=!accum;21.always@(posedgealu_clk)22.begin23.casex(opcode)24.DIV:alu_out=accum/data;25.JMP:alu_out=accum;26.ADD:alu_out=data+accum;27.SUB:alu_out=accum-data;28.MUL:begin29.if(!bzt)30.begin31.{tmp,alu_out}=data*accum;32.bzt=1;33.end34.else35.begin36.alu_out=tmp;37.bzt=0;38.end39.end40.LDA:alu_out=data;41.STO:alu_out=accum;42.JA:alu_out=accum;43.default:alu_out=8'bxxxx_xxxx;44.endcase45.end46.assignbz=bzt;47.endmodule5、累加器累加器用于存放当前的结果,它也是alu其中一个数据来源。复位后,累加器的值是零。当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clk1时钟正跳沿时就收到来自于数据总线的数据。Verilog代码:1.moduleaccum(accum,data,ena,clk,rst);2.output[7:0]accum;3.input[7:0]data;4.inputena,clk,rst;5.reg[7:0]accum;6.7.always@(posedgeclk)8.begin9.if(rst)10.accum=8'b0000_0000;//Reset11.else12.if(ena)//当CPU状态控制器发出load_acc信号13.accum=data;//接收来自ALU的数据14.end15.16.endmodule6、地址选择器刘言·1990liuyan@163.com·2009.12大学生电子实验室地址选择器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。后4个时钟周期用于对RAM或端口的读写,该地址由指令中给出。地址的选择输出信号由fetch提供。Verilog代码:1.moduleaddrchoose(addr,fetch,ir_addr,pc_addr);2.output[4:0]addr;3.input[4:0]ir_addr,pc_addr;4.inputfetch;5.6.assignaddr=(fetch)?pc_addr:ir_addr;7.8.endmodule7、数据选择器:累加器的数据只有在需要往RAM区或输出口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。所以任何部件往总线上输出数据时,都需要一控制信号。而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。数据控制器何时输出累加器的数据则由状态控制器输出的控制信号datactl_ena决定。Verilog代码:1.moduledatactl(data,in,ena);2.output[7:0]data;3.input[7:0]in;4.inputena;5.6.assigndata=(ena)?in:8'bzzzz_zzzz;7.endmodule8、控制器控制器是最重要的模块,它CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。CPU何时进行读指令读写I/O端口,RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数。第1个时钟:读指令,将rd与load_ir置高电平,其余为低电平。此时地址输出的是PC,所以会将刘言·1990liuyan@163.com·2009.12大学生电子实验室所指的ROM里的数据取到数据总线,并分开存入指令寄存器中。第2个时钟:同上(不做任何操作)。第3个时钟:空,输出全低(不做任何操作)。第4个时钟:PC加1,将inc_pc置高电平,其余为低电平。第5个时钟:这个时钟fetch翻转,由高变低,开始分析操作码并输出相应的信号。第6个时钟:这个时钟alu_clk翻转,由低变高,alu分析操作码并进行相应运算,继续分析操作码并输出相应的信号。第7个时钟:空(不

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功