EDA课程设计

  • 格式:pdf
  • 大小:314.63 KB
  • 文档页数:12

电子设计自动化课程设计总结报告设计题目CALL和RET指令系统在CPU中的实现创新在EDA2000实验箱上实现流水灯指导教师李明专业08级电子信息工程3班学生姚金龙2010年12月24日设计题目:CALL和RET指令系统在8位CPU中上的实现创新部分:更改存储器中存储指令并设计有IO思想在EDA2000实验箱上实现流水灯设计要求:在已经学习的cpu的基础上,增加两条指令CALL指令和RET指令当CPU 执行子程序调用指令(CALL指令)的时候,系统首先将当前pc的下一条指令保存到寄存器中,然后执行子程序,在子程序的最后放置一条返回指令(RET 指令),当执行RET指令时,CPU会将刚才保存到寄存器中的那个pc弹出,然后继续执行执行子程序调用指令(CALL指令)的时候八个LED依次闪烁,加快时钟频率视觉上看上去实现一次流水灯,当执行RET返回指令开始重复执行下一次流水灯。

设计原理:尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基功相同。

由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:1、时序和控制部件2、程序计数器3、存储器4、指令寄存器,解码器5、算数逻辑单元(ALU)^.^通过系统时钟和复位将各个部件相连接。

一.控制单元要实现CALL和RET指令系统在8位cpu上实现,需先在控制部分中宏定义两条指令即:CALL=3'b110,RET=3'b111然后在控制器中加上指令执行使能控制端即:output reg callenoutput reg reten,并且在控制部分执行的第六阶段进行if判断,如果有指令发生使能即:if(opcode==CALL)callen<=1;else callen<=0;if(opcode==RET)reten<=1;else reten<=0;程序代码:module control(input clock,input reset,output reg s0,output reg s1,output reg s2,output reg s3,output reg s4,output reg s5,output reg addrsel,output reg instr_add,output reg instr_sub,output reg instr_and,output reg instr_pass,output reg callen,output reg reten,input[2:0]opcode);parameter LDA=3'b000,STA=3'b001,ADD=3'b010,SUB=3'b011,AND=3'b100,HLT=3'b101,CALL=3'b110,RET=3'b111;添加部分reg[2:0]cnt;always@(posedge clock or posedge reset)if(reset)cnt<=0;elseif(cnt==5)cnt<=0;elsecnt<=cnt+1;always@*begincase(cnt)0:begin//fetch instructions0<=1;s1<=0;s2<=0;s3<=0;s4<=0;s5<=0;addrsel<=0;reten<=0;callen<=0;添加部分:使能清空end1:begin//decodes0<=0;s1<=1;s2<=0;s3<=0;s4<=0;s5<=0;addrsel<=0;end2:begin//read memory data for process if nessarys0<=0;s1<=0;/*s2=1;*/s3<=0;s4<=0;s5<=0;addrsel<=1;if((opcode==LDA)||(opcode==ADD)||(opcode==SUB)||(opcode==AND)) s2<=1;elses2<=0;end3:begin//enable ALU to computes0<=0;s1<=0;s2<=0;s4<=0;s5<=0;if((opcode==CALL)||(opcode==RET))s3<=0;添加部分:判断如果执行CALL或RET指令算数逻辑单元使能禁止elses3<=1;addrsel<=1;if(opcode==LDA)begin instr_add<=0;instr_sub<=0;instr_and<=0;instr_pass<=1;endelse if(opcode==ADD)begin instr_add<=1;instr_sub<=0;instr_and<=0;instr_pass<=0;endelse if(opcode==SUB)begin instr_add<=0;instr_sub<=1;instr_and<=0;instr_pass<=0;endelse if(opcode==AND)begin instr_add<=0;instr_sub<=0;instr_and<=1;instr_pass<=0;endelse if(opcode==STA)begin instr_add<=0;instr_sub<=0;instr_and<=0;instr_pass<=0;endelse begin instr_add<=0;instr_sub<=0;instr_and<=0;instr_pass<=0;endend4:begin//write to memory if nessarys0<=0;s1<=0;s2<=0;s3<=0;/*s4<=1;*/s5<=0;addrsel<=1;if(opcode==STA)s4<=1;else s4<=0;end5:begin s0<=0;s1<=0;s2<=0;s3<=0;s4<=0;s5<=1;addrsel<=1;if(opcode==CALL)callen<=1;else callen<=0;if(opcode==RET)reten<=1;else reten<=0;添加部分!!endendcaseendEndmodule二.PC部分要实现CALL和RET指令系统在8位CPU上实现,需在程序计数器部分加跳转入口地址和指令保存寄存器即:input[4:0]jmpaddr;reg[4:0]temp;并且在always@异步置位语句中加上判断,如果有指令执行使能则跳转或返回即:if(callen)begin pc<=jmpaddr;temp<=pc;endelse if(reten)pc<=temp+1;程序代码:module pc(clock,reset,en,pc,callen,reten,jmpaddr);input clock,reset,en,callen,reten;input[4:0]jmpaddr;添加部分output reg[4:0]pc;reg[4:0]temp;添加部分wire[4:0]pc_next;assign pc_next=pc+1;always@(posedge clock or posedge reset)beginif(reset)pc<=0;elseif(en)beginif(callen)begin pc<=jmpaddr;temp<=pc;endelse if(reten)pc<=temp+1;添加部分elsepc<=pc_next;endelsepc<=pc;end endmodule三.存储器的部分(1)要实现CALL和RET指令系统在8位CPU上实现,需改变存储器存储单元指令设置,具体实现方法在程序中介绍,要在EDA2000实验箱上实现流水灯,需改变存储器存储单元指令设置,并在存储器中设计有IO思想,具体实现方法在程序中介绍,程序代码:module memory(clock,reset,addr,din,dout,rd,wr,IN,OUT);input clock,reset;input[7:0]din;input[4:0]addr;output reg[7:0]dout;input rd,wr;input[7:0]IN;output reg[7:0]OUT;reg[7:0]mem[31:0];always@(posedge clock or posedge reset)beginif(reset)beginmem[0]<='b000_11111;//LDA31mem[1]<='b010_11110;//ADD30mem[2]<='b001_11111;//STA31前三句指令为实现一个数据相加运算mem[3]<='b110_00110;//CALL6定义跳转指令,跳转到mem[6]继续执行mem[4]<='b000_11111;//LDA31取mem[31]存储字节中数字到累加器中mem[5]<='b001_11110;//STA30把累加器中数值写入mem[31]进行初始化,为下一次流水灯做准备mem[6]<='b000_11110;//LDA30取mem[30]中数据给累加器Amem[7]<='b001_11111;//STA31把累加器A中的值00000001写入存储器传给输出端OUT点亮第一支LED灯mem[8]<='b010_11110;//ADD30在累加器原有值00000001基础上加上mem[30]的值00000001mem[9]<='b001_11110;//STA30把运算结果00000010写入mem[30]mem[10]<='b001_11111;//STA31把运算结果00000010写入mem[31]点亮第二只LED灯以上程序依次重复指令8、9、10功能实现第2、3、4、5、6、7、8只LED灯点亮mem[11]<='b010_11110;//ADD30mem[12]<='b001_11110;//STA30mem[13]<='b001_11111;//STA31mem[14]<='b010_11110;//ADD30mem[15]<='b001_11110;//STA30mem[16]<='b001_11111;//STA31mem[17]<='b010_11110;//ADD30mem[18]<='b001_11110;//STA30mem[19]<='b001_11111;//STA31mem[20]<='b010_11110;//ADD30mem[21]<='b001_11110;//STA30mem[22]<='b001_11111;//STA31mem[23]<='b010_11110;//ADD30mem[24]<='b001_11110;//STA30mem[25]<='b001_11111;//STA31mem[26]<='b010_11110;//ADD30mem[27]<='b001_11110;//STA30mem[28]<='b001_11111;//STA31mem[29]<='b111_00000;//RET定义跳转返回指令跳转到mem[4]指令执行mem[30]<='b00000001;数据存储单元mem[31]<='b1;数据存储单元负责调用和写入mem[31]中endelseif(wr)if(addr==31)OUT<=din;elsemem[addr]<=din;dout<=mem[addr];endendmodule(2)由于FLEX10K系列的EPFl0K10LC84-4这款FPGA芯片可用的logic element只有576个,不够此CPU设计的使用,所以将memory分成三个小模块:首先用MegaWizard Plug-In Manager功能将存储器中32条指令和数据进行虚拟存储,减少logic element用量。