《VerilogHDL数字设计教程》课件第8章CPU结构及其设计_第1页
《VerilogHDL数字设计教程》课件第8章CPU结构及其设计_第2页
《VerilogHDL数字设计教程》课件第8章CPU结构及其设计_第3页
《VerilogHDL数字设计教程》课件第8章CPU结构及其设计_第4页
《VerilogHDL数字设计教程》课件第8章CPU结构及其设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章CPU结构及其设计8.1专用处理器顶层系统设计8.2专用处理器的设计实现8.3专用处理器的仿真验证8.4小结8.1专用处理器顶层系统设计1专用处理器的组成结构2专用处理器的功能3指令系统的设计专用处理器的组成结构图8-1

专用处理器结构框图专用处理器的功能设计要求:

本专用处理器可通过编程来完成自然数求和的功能,并将计算结果存储于数据存储器RAM中。

例如完成:0+1+2+…+10=?。完成该功能的算法用C语言表示,如例8-1。【例8-1】C语言描述的功能inttotal=0;for(inti=10;i!=0;i--)total+=i;nextinstructions...指令系统的设计

图8-2简单指令集指令系统的设计

【例8-2】汇编语言描述

0MOVR0,#0;//total=01MOVR1,#10;//i=102MOVR2,#1;//常数13MOVR3,#0;//常数0Loop:JZR1,NEXT;//如果i=0,则完成

5ADDR0,R1;//total+=i6SUBR1,R2;//i--7JZR3,Loop//不为零则跳转

NEXT:MOV10H,R0//将结果存放在RAM的地址10H处

HERE:HALT//停在这里【例8-3】机器码描述memory[0]=10'b0011_00_0000;//MOVR0,#0;memory[1]=10'b0011_01_1010;//MOVR1,#10;memory[2]=10'b0011_10_0001;//MOVR2,#1;memory[3]=10'b0011_11_0000;//MOVR3,#0;memory[4]=10'b0110_01_1000;//JZR1,NEXT;memory[5]=10'b0100_00_0100;//ADDR0,R1;memory[6]=10'b0101_01_1000;//SUBR1,R2;memory[7]=10'b0110_11_0100;//JZR3,Loopmemory[8]=10'b1000_00_1010;//MOV10H,R0memory[9]=10'b1111_00_1001;//haltfor(i=10;i<(2**N);i=i+1)//存储器其余地址存放0memory[i]=0;8.2专用处理器的设计实现顶层系统设计基本部件设计顶层系统设计图8-3专用处理器实现框图顶层系统设计图8-4数据路径部分实现框图基本部件设计【例8-4】ALU:数据逻辑单元modulealu(clk,en,sel,in1,in2,out,alu_zero);inputen,clk;input[1:0]sel;input[7:0]in1,in2;outputreg[7:0]out;outputregalu_zero;always@(posedgeclk)begin if(en) case(sel) 2'b00:out=in1; 2'b01:if(in1==0)alu_zero=1;elsealu_zero=0; 2'b10:out=in1+in2; 2'b11:out=in1-in2; endcaseendendmodule基本部件设计【例8-5】寄存器moduleregister(clk,en,in,out);inputclk,en;input[7:0]in;outputreg[7:0]out;reg[7:0]val;always@(posedgeclk)val<=in;always@(en,val)beginif(en==1'b1)out<=val;endendmodule基本部件设计【例8-6】通用寄存器文件:本设计包含4个通用寄存器modulerf(rst,clk,r_w,enb,in,sel,out);inputrst,clk,enb,r_w;input[7:0]in;input[1:0]sel;outputreg[7:0]out;reg[7:0]reg_file[0:3];integeri;always@(posedgerst,posedgeclk)beginif(rst)beginfor(i=0;i<3;i=i+1)reg_file[i]=0;endelsebeginif(enb==1)beginif(r_w==0)//写registerbegincase(sel)2'b00:reg_file[0]<=in;2'b01:reg_file[1]<=in;2'b10:reg_file[2]<=in;2'b11:reg_file[3]<=in;endcaseendelse//读registercase(sel)2'b00:out<=reg_file[0];2'b01:out<=reg_file[1];2'b10:out<=reg_file[2];2'b11:out<=reg_file[3];endcaseendendend基本部件设计【例8-7】二选一多路选择器,用于选择立即数或者寄存器数据endmodulemodulemux21(sel,in1,in2,out);inputsel;input[7:0]in1,in2;output[7:0]out;assignout=(sel)?in2:in1;endmodule基本部件设计【例8-8】数据路径顶层文件moduledp(rst,clk,r_wf,en_rf,en_reg,en_alu,en_imm,sel_rf,sel_alu,sel_mux,imm,alu_zero,reg_sel,reg_out);inputrst,clk,r_wf,en_rf,en_reg,en_alu,en_imm;input[7:0]imm;input[1:0]sel_rf,sel_alu;inputsel_mux;outputreg[1:0]reg_sel;outputreg[7:0]reg_out;outputalu_zero;wire[7:0]op1,op2,alu_out,out_imm,out_rf;registerregister0(.clk(clk),.en(en_reg),.in(op1),.out(op2));registerregister1(.clk(clk),.en(en_imm),.in(imm),.out(out_imm));mux21mux0(.sel(sel_mux),.in1(out_imm),.in2(out_rf),.out(op1));alualu0(.clk(clk),.en(en_alu),.sel(sel_alu),.in1(op1),.in2(op2),.out(alu_out),.alu_zero(alu_zero));rfrf0(.rst(rst),.clk(clk),.r_w(r_wf),.enb(en_rf),.in(alu_out),.sel(sel_rf),.out(out_rf));always@(posedgeclk)beginreg_sel<=sel_rf;reg_out<=alu_out;endendmodule基本部件设计【例8-9】程序存储器//指令为10位:高4位为指令码;中间两位为寄存器;低4位为立即数modulerom(clk,rst,rd,rom_data,rom_addr);parameterM=10,N=4;//4根地址线,10位数据的存储器inputclk,rst,rd;//rd读使能信号input[N-1:0]rom_addr;outputreg[M-1:0]rom_data;reg[M-1:0]memory[0:2**N];//4根地址线,8位数据的存储器always@(posedgeclk,posedgerst) if(rst) begin:init//该顺序块用于初始化ROM值

integeri; memory[0]=10'b0011_00_0000;//MOVR0,#0; memory[1]=10'b0011_01_1010;//MOVR1,#10; memory[2]=10'b0011_10_0001;//MOVR2,#1; memory[3]=10'b0011_11_0000;//MOVR3,#0; memory[4]=10'b0110_01_1000;//JZR1,NEXT;

memory[5]=10'b0100_00_0100;//ADDR0,R1; memory[6]=10'b0101_01_1000;//SUBR1,R2;

memory[7]=10'b0110_11_0100;//JZR3,Loop memory[8]=10'b1000_00_1010;//MOV10H,R0 memory[9]=10'b1111_00_1001;//halt for(i=10;i<(2**N);i=i+1)//存储器其余地址存放0 memory[i]=0; end else begin:read//该顺序块用于读取ROM值

if(rd)rom_data=memory[rom_addr]; endendmodule基本部件设计【例8-10】数据存储器moduleram(clk,rd,wr,cs,addr,datain,dataout);parameterM=8,N=4;//4根地址线,8位数据inputrd,wr,cs,clk;input[N-1:0]addr;input[M-1:0]datain;output[M-1:0]dataout;reg[M-1:0]memory[0:2**N];//4根地址线,8位数据的存储器reg[M-1:0]temp;assigndataout=temp;always@(posedgeclk)begin:p0 if(cs) if(rd)temp<=memory[addr]; elseif(wr)memory[addr]<=datain; elsetemp<='bz;endendmodule基本部件设计【例8-11】控制器代码见下面的链接基本部件设计【例8-12】顶层系统

modulecpu(clk,rst,start,reg_sel,reg_out,alu_zero,wr_ram_out,cs_ram_out,addr_ram_out);//modulecpu(clk,rst,start,reg_sel,reg_out,alu_zero);inputclk,rst,start;output[1:0]reg_sel;output[7:0]reg_out;outputalu_zero;wire[7:0]imm,reg_out;wire[1:0]sel_rf,sel_alu,reg_sel;wiresel_mux;wirer_wf,en_rf,en_reg,en_alu,en_imm,alu_zero;regclk1,clk2;wire[3:0]PC;//ROM接口信号wireROM_en;wire[9:0]IR;wirewr_ram,cs_ram;//RAM接口信号wire[3:0]addr_ram;outputwr_ram_out,cs_ram_out;//RAM接口信号output[3:0]addr_ram_out;assignwr_ram_out=wr_ram,cs_ram_out=cs_ram,addr_ram_out=addr_ram;always@(posedgeclk)begin clk2<=clk1;clk1<=~clk2;//二分频

enddpdatapath(rst,clk2,r_wf,en_rf,en_reg,en_alu,en_imm,sel_rf,sel_alu,sel_mux,imm,alu_zero,reg_sel,reg_out);romrom_instruction(clk2,rst,ROM_en,IR,PC);ramram_data(clk1,,wr_ram,cs_ram,addr_ram,reg_out,);ctrlcontrol(rst,start,clk1,alu_zero,r_wf,en_rf,en_reg,en_alu,en_imm,sel_rf,sel_alu,sel_mux,imm,PC,IR,ROM_en,wr_ram,cs_ram,addr_ram);//ctrlcontrol(rst,start,clk1,alu_zero,r_wf,en_rf,en_reg,en_alu,en_imm,sel_rf,sel_alu,sel_mux,imm,PC,IR,ROM_en);endmodule8.3专用处理器的仿真验证图8-11放大的仿真输出波形8.3专用处理器的仿真验证图8-12仿真输出波形8.3专用处理器的仿真验证图8-13复位和第一条指令的执行8.3专用处理器的仿真验证【例8-12】用于说明复位和第一条指令的代码

if(rst)beginstate<=s0;//复位:上电初始化状态机初态

PC<=0;//复位:初始化PC值

endelsebegincase(state)s0://(步骤1)初始状态

beginPC=0;//初始化程序计数器

if(start==1'b1)//start为启动算法信号

state<=s1;elsestate<=s0;end8.3专用处理器的仿真验证s1://(步骤2)取指令

beginROM_en<=1;//使能ROM输出

state<=s2;ends2:beginOPCODE=IR[9:6];//将指令分开存储在不同信号中

register=IR[5:4];address=IR[3:0];state<=s3;ends3://(步骤3)使PC增1beginPC=PC+4'b1;state<=s4;end8.3专用处理器的仿真验证s4://(步骤4)指令译码

begincase(OPCODE)loadi://译码后该指令为取立即数

state<=s5;add:state<=s6;sub:state<=s7;jz:state<=s8;store:state<=s10;halt:state<=done;default:state<=s1;endcaseend8.3专用处理器的仿真验证s5:begin//(步骤5)装载立即数进入通用寄存器

imm=address;//将立即数交给imm信号

e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论