第17部分简化的RISCCPU设计方案.ppt

上传人:本田雅阁 文档编号:2518183 上传时间:2019-04-05 格式:PPT 页数:75 大小:1.49MB
返回 下载 相关 举报
第17部分简化的RISCCPU设计方案.ppt_第1页
第1页 / 共75页
第17部分简化的RISCCPU设计方案.ppt_第2页
第2页 / 共75页
第17部分简化的RISCCPU设计方案.ppt_第3页
第3页 / 共75页
亲,该文档总共75页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第17部分简化的RISCCPU设计方案.ppt》由会员分享,可在线阅读,更多相关《第17部分简化的RISCCPU设计方案.ppt(75页珍藏版)》请在三一文库上搜索。

1、第17章 简化的RISC_CPU设计,精简指令集(RISC)CPU的构造原理和设计方法,17.1 什么是CPU,CPU:中央处理单元,是计算机的核心部件,计算机进行信息处理分两个步骤: 将数据和程序(指令序列)输入到计算机的存储器中 从第一条指令的地址起开始执行程序,得到所需结果,结束运行。,CPU的作用:协调并控制计算机的各部件,使之有条不紊的执行程序,CPU的基本功能: 取指令-地址与控制信号 分析指令-即指令译码,操作和操作控制信号 执行指令-操作控制信号作用于各部件,CPU的基本功能概括: 能对指令进行译码并执行规定的动作 可以进行算术和逻辑运算 能与存储器和外设交换数据 提供系统所需

2、的控制,CPU的内部结构: 算术逻辑运算单元(ALU) 累加器 程序计数器 指令寄存器和译码器 时序和控制部件,RISC即精简指令集计算机: Reduced Instruction Set Computer 时序控制信号由硬件而不是微程序控制,cpu,AB,DB,地址 译码器,ROM,RAM,clock,reset,MICRO COMPUTER SYSTEM,read,write,D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0,高8位,低8位,地址码,指令码,指令,指令数目:8条 地址空间:213=8K,助记符 操作码 功能 HLT

3、3b000 暂停 SKZ 3b001 累加器为零转移ADD 3b010 加 ANDD 3b011 与 XORR 3b100 或 LDA 3b101 取数 STO 3b110 存数 JMP 3b111 转移,指令集,CPU的基本功能: 取指令-地址与控制信号 分析指令-即指令译码,操作和操作控制信号 执行指令-操作控制信号作用于各部件,CPU的基本功能概括: 能对指令进行译码并执行规定的动作 可以进行算术和逻辑运算 能与存储器和外设交换数据 提供系统所需的控制,CPU的内部结构: 算术逻辑运算单元(ALU) 累加器 程序计数器 指令寄存器和译码器 时序和控制部件,累加器 A,指令寄存器 IR,算

4、逻单元 ALU,数据控制,地址选择,程序计数器 PC,控制状态机,时钟信号,CPU的结构功能图,累加器 A,指令寄存器 IR,算逻单元 ALU,数据控制,地址选择,程序计数器 PC,控制状态机,时钟信号,AB,DB,halt,rd,wr,clk,rst,load_acc,fetch,inc_pc,load_pc,load_ir,alu_ena,datactl_ena,halt,load_ir,rd,inc_pc,alu_ena,fetch,clk,0,1,2,3,4,5,6,7,halt指令,data,load_ir,rd,inc_pc,alu_ena,fetch,clk,0,1,2,3,4,

5、5,6,7,LDA 1000,B0,00,EE,load_acc,address,0000,0001,1000,0002,data,load_ir,rd,inc_pc,alu_ena,fetch,clk,0,1,2,3,4,5,6,7,ADD 1001,50,01,11,load_acc,address,0002,0003,1001,0004,data,load_ir,rd,inc_pc,alu_ena,fetch,clk,0,1,2,3,4,5,6,7,STO 1001,D0,01,FF,wr,address,0004,0005,1001,0006,17.3.1 时钟发生器,fetch是控制

6、信号,clk的8分频信号 alu_ena用于控制算术逻辑运算单元 clk是时钟信号 reset是复位信号,状态转移图,17.3.1 时钟发生器,S2,S1,S2,S3,S4,S5,S6,S7,S8,S1,S2,S3,S4,S5,S6,S7,S8,idle,/-clk_gen.v- timescale 1ns/1ns module clk_gen(clk,reset,fetch,alu_ena); input clk, reset; output fetch, alu_ena; wire clk, reset; reg fetch, alu_ena; reg 7:0state; paramete

7、r S1=8b00000001, S2=8b00000010, S3=8b00000100, S4=8b00001000, S5=8b00010000, S6=8b00100000, S7=8b01000000, S8=8b10000000, idle=8b00000000;,17.3.1 时钟发生器,always (posedge clk) if(reset) begin fetch=0; alu_ena=0; state=idle; end else begin case (state) default:state=idle; endcase end,case (state) S1: be

8、gin fetch=1; state=S2; end S2: state=S3; S3: state=S4; S4: state=S5; S5: begin state=S6; fetch=0; end S6: begin state=S7; alu_ena=1; end S7: begin alu_ena=0; state=S8; end S8: state=S1; idle: state=S1; default:state=idle; endcase,17.3.2 指令寄存器,reset,clk,load_ir,opcode2:0,ir_addr12:0,timescale 1ns/1ns

9、 module register(opc_iraddr,data,ena,clk,rst); output 15:0opc_iraddr; input 7:0data; input ena,clk,rst; reg 15:0opc_iraddr; reg state; always (posedge clk) begin if (rst) begin opc_iraddr=16b0000_0000_0000_0000; state=1b0; end else,if (ena) casex(state) 1b0:begin opc_iraddr15:8=data; state=1; end 1b

10、1:begin opc_iraddr7:0=data; state=0; end default:begin opc_iraddr15:0=16bx; state=1bx; end endcase else state=1b0; end endmodule,17.3.3 累加器,reset,clk,load_acc,alu_out7:0,module accum(accum,data,ena,clk,rst); output 7:0accum; input 7:0data; input ena,clk,rst; reg 7:0accum; always (posedge clk) begin

11、if(rst) accum=8b0000_0000; else if(ena) accum=data; end endmodule,17.3.4 算术逻辑运算器,助记符 操作码 功能 HLT 3b000 暂停 SKZ 3b001 累加器为零转移ADD 3b010 加 ANDD 3b011 与 XORR 3b100 或 LDA 3b101 取数 STO 3b110 存数 JMP 3b111 转移,timescale 1ns/1ns module alu(alu_out,zero,data,accum,alu_ena,opcode,clk); output 7:0alu_out; output z

12、ero; input 7:0data,accum; input 2:0opcode; input alu_ena,clk; reg 7:0alu_out; parameter HLT=3b000, SKZ=3b001, ADD=3b010, ANDD=3b011, XORR=3b100, LDA=3b101, STO=3b110, JMP=3b111;,assign zero=!accum; always (posedge clk) if(alu_ena) begin casex(opcode) HLT:alu_out=accum; SKZ:alu_out=accum; ADD:alu_out

13、=data+accum; ANDD:alu_out=data endcase end endmodule,17.3.5 数据控制器,data7:0,alu_out7:0,datactl_ena,module datactl(data,in,data_ena); output 7:0data; input 7:0in; input data_ena; assign data=(data_ena)?in:8bz; endmodule,17.3.6 地址多路器,module adr(addr,fetch,pc_addr,ir_addr); input fetch; input 12:0pc_addr

14、,ir_addr; output 12:0addr; assign addr=fetch? pc_addr:ir_addr; endmodule,17.3.7 程序计数器,module counter(pc_addr,ir_addr,load,clk,rst); input load,clk,rst; input 12:0ir_addr; output 12:0pc_addr; reg 12:0pc_addr; always (posedge clk or posedge rst) if(rst) pc_addr=13b0_0000_0000_0000; else if(load) pc_ad

15、dr=ir_addr; else pc_addr=pc_addr+1; endmodule,17.3.8 状态控制器,timescale 1ns/1ns module machinectl(ena,fetch,rst,clk); input fetch,rst,clk; output ena; reg ena; always (posedge clk) begin if(rst) ena=0; else if(fetch) ena=1; end endmodule,17.3.8 状态控制器,状态控制器两部分: 状态机(machine) 状态控制器machinectl rst有效,ena=0,

16、状态机停止工作。,17.3.8 状态控制器,000,001,010,011,100,101,110,111,状态机是CPU的核心部件,用于产生控制信号: 启动、停止某些部件 CPU执行读指令来读写接口、存储器 状态变量state的值,是指令周期已经过的时钟数,指令周期中8个时钟完成的操作,第0个时钟:rd和load_ir为高电平,ROM中高八位指令代码指令寄存器,第1个时钟:rd和load_ir为高电平,inc_pc加1,故PC+1,ROM中低八位指令代码指令寄存器,第2个时钟:空操作,第3个时钟:PC+1,指向下一条指令;若HLT指令,halt=1;其它指令控制线输出为0,指令周期中8个时钟

17、完成的操作,第4个时钟:若AND ADD XOR LDA,读相应地址数据; 若JMP, 目的地址PC; 若STO, 输出累加器数据。,第5个时钟:若AND ADD XOR , 进行相应运算; 若LDA, 数据运算器累加器;若JMP,锁存目的地址;若STO,数据到地址处。,第6个时钟:空操作,第7个时钟:若SKZ指令, PC+1跳过一条指令;否则PC无变化,timescale 1ns/1ns module machine(inc_pc,load_acc,load_pc,rd,wr,load_ir,datactl_ena,halt,clk,zero,ena,opcode); output inc_

18、pc,load_acc,load_pc,rd,wr,load_ir; output datactl_ena,halt; input clk,zero,ena; input 2:0opcode; reg inc_pc,load_acc,load_pc,rd,wr,load_ir; reg datactl_ena,halt; reg 2:0state; parameter HLT =3B000, SKZ =3b001, ADD =3b010, ANDD=3b011, XORR=3b100, LDA =3b101, STO =3b110, JMP =3b111;,always (negedge cl

19、k) begin if(!ena) begin state=3b000; inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; end else ctl_cycle; end,/-begin of task ctl_cycle- task ctl_cycle; begin casex(state) 3b000: begin inc_pc,load_acc,load_pc,rd=4b0001; wr,load_ir,datactl_ena,halt=4b0100; state=3b001; end 3b001

20、: begin inc_pc,load_acc,load_pc,rd=4b1001; wr,load_ir,datactl_ena,halt=4b0100; state=3b010; end 3b010: begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; state=3b011; end,3b011: begin if(opcode=HLT) begin inc_pc,load_acc,load_pc,rd=4b1000; wr,load_ir,datactl_ena,halt=4b0001

21、; state=3b100; end else begin inc_pc,load_acc,load_pc,rd=4b1000; wr,load_ir,datactl_ena,halt=4b0000; state=3b100; end end,3b100: begin if(opcode=JMP) begin inc_pc,load_acc,load_pc,rd=4b0010; wr,load_ir,datactl_ena,halt=4b0000; end else if(opcode=ADD|opcode=ANDD|opcode=XORR|opcode=LDA) begin inc_pc,l

22、oad_acc,load_pc,rd=4b0001; wr,load_ir,datactl_ena,halt=4b0000; end else if(opcode=STO) begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0010; end else begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; end state=3b101; end,3b101: begin /operation if(op

23、code=ADD|opcode=ANDD|opcode=XORR|opcode=LDA) begin inc_pc,load_acc,load_pc,rd=4b0101; wr,load_ir,datactl_ena,halt=4b0000; end else if(opcode=SKZ end,3b110:/idle begin if(opcode=STO) begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0010; end else if(opcode=ADD|opcode=ANDD|opcode

24、=XORR|opcode=LDA) begin inc_pc,load_acc,load_pc,rd=4b0001; wr,load_ir,datactl_ena,halt=4b0000; end else begin inc_pc,load_acc,load_pc,rd=4b0000; wr,load_ir,datactl_ena,halt=4b0000; end state=3b111; end,3b111: begin if(opcode=SKZ end endcase end endtask /-end of task ctl_cycle- endmodule,cpu,AB,DB,地址

25、 译码器,ROM,RAM,clock,reset,MICRO COMPUTER SYSTEM,read,write,17.3.9 外围模块(地址译码器),module addr_decode(addr,rom_sel,ram_sel); output rom_sel,ram_sel; input 12:0addr; reg rom_sel,ram_sel; always (addr) casex(addr) 13b1_1xxx_xxxx_xxxx:rom_sel,ram_sel=2b01; 13b0_xxxx_xxxx_xxxx:rom_sel,ram_sel=2b10; 13b1_0xxx_

26、xxxx_xxxx:rom_sel,ram_sel=2b10; default:rom_sel,ram_sel=2b00; endcase endmodule,17.3.9 外围模块(RAM),module addr_decode(addr,rom_sel,ram_sel); output rom_sel,ram_sel; input 12:0addr; reg rom_sel,ram_sel; always (addr) casex(addr) 13b1_1xxx_xxxx_xxxx:rom_sel,ram_sel=2b01; 13b0_xxxx_xxxx_xxxx:rom_sel,ram_

27、sel=2b10; 13b1_0xxx_xxxx_xxxx:rom_sel,ram_sel=2b10; default:rom_sel,ram_sel=2b00; endcase endmodule,17.3.9 外围模块(ROM),module rom(data,addr,read,ena); output 7:0data; input 12:0addr; input ena,read; reg 7:0mem13h1fff:0; assign data=(read endmodule,17.4 RISC_CPU操作和时序,主要操作: 系统的复位和启动操作 总线读操作 总线写操作,17.4.1

28、 系统的复位和启动操作,复位状态reset=1: CPU内部寄存器全为零 数据总线为高阻状态 地址总线为0000H 所有控制信号为无效状态,启动状态reset=0: fetch上升沿启动CPU开始工作 从ROM的000处读指令并执行,17.4.2 总线读操作,复位状态reset=1: CPU内部寄存器全为零 数据总线为高阻状态 地址总线为0000H 所有控制信号为无效状态,启动状态reset=0: fetch上升沿启动CPU开始工作 从ROM的000处读指令并执行,D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0,高8位,低8位,地址码

29、,指令码,17.5 RISC_CPU 寻址方式和指令系统,指令数目:8条 地址空间:213=8K,17.5 RISC_CPU 寻址方式和指令系统,直接寻址方式 数据放在存储器中,寻址单元的地址由指令直接给出。,LDA 010FH,8EH,00H,77H,56H,EDH,FFH,FFH,00H,010FH,010EH,010DH,010CH,56H,1,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,地址码,指令码,17.5 RISC_CPU 寻址方式和指令系统,HLT: 停机操作 该操作空一个指令周期,即8个时钟,SKZ: 为零跳过下一条语句 累加器结果为零,跳过下一语句; 累加器

30、结果不为零,顺序执行。,ADD: 相加 累加器的值+地址所知的存储器中的数据,结果送回累加器。,17.5 RISC_CPU 寻址方式和指令系统,ANDD: 相与 累加器的值&地址所知的存储器中的数据,结果送回累加器。,XORR: 相异或 累加器的值地址所知的存储器中的数据,结果送回累加器。,LDA: 读数据 地址所知的存储器中的数据送累加器。,17.5 RISC_CPU 寻址方式和指令系统,STO: 写数据 累加器中的数据送地址所指的存储器中,JMP: 无条件跳转语句 该操作跳转至指令给出的目的地址,继续执行。,data,load_ir,rd,inc_pc,alu_ena,fetch,clk,

31、0,1,2,3,4,5,6,7,LDA 1000,B0,00,EE,load_acc,address,0000,0001,1000,0002,data,load_ir,rd,inc_pc,alu_ena,fetch,clk,0,1,2,3,4,5,6,7,ADD 1001,50,01,11,load_acc,address,0002,0003,1001,0004,data,load_ir,rd,inc_pc,alu_ena,fetch,clk,0,1,2,3,4,5,6,7,STO 1001,D0,01,FF,wr,address,0004,0005,1001,0006,00 111_0000

32、0 /00 BEGIN: JMP TEST_JMP 0011_1100 000_00000 /02 HLT 0000_0000 000_00000 /04 HLT 0000_0000 101_11000 /06 JMP_OK: LDA DATA_1 0000_0000 001_00000 /08 SKZ 0000_0000 000_00000 /0A HLT 0000_0000 101_11000 /0C LDA DATA_2 0000_0001 001_00000 /0E SKZ 0000_0000 111_00000 /10 JMP SKZ_OK 0001_0100 000_00000 /

33、12 HLT 0000_0000 110_11000 /14 SKZ_OK: STO TEMP 0000_0010 101_11000 /16 LDA DTAT_1 0000_0000 110_11000 /18 STO TEMP 0000_0010 101_11000 /1A LDA TEMP 0000_0010,001_00000 /1C SKZ 0000_0000 000_00000 /1E HLT 0000_0000 100_11000 /20 XORR DTAT_2 0000_0001 001_00000 /22 SKZ 0000_0000 000_00000 /24 HLT 000

34、0_0000 111_00000 /26 JMP XORR_OK 0010_0100 100_11000 /28 XORR_OK: XORR DATA_2 0000_0001 001_00000 /2A SKZ 0000_0000 000_00000 /2C HLT 0000_0000 000_00000 /2E EDN: HLT 0000_0000 111_00000 /30 JMP BEGIN 0000_0000 3C 111_00000 /3C TST_JMP: JMP JMP_OK 0000_0110 000_00000 /3E HLT,ROM,00 00000000 /1800 DA

35、TA_1 11111111 /1801 DATA_2 10101010 /1802 TEMP,RAM,17.6 RISC_CPU 模块的调试,cpu,AB,DB,地址 译码器,ROM,RAM,clock,reset,read,write,include “clk_gen.v“ include “register.v“ include “accum.v“ include “adr.v“ include “alu.v“ include “machine.v“ include “machinectl.v“ include “counter.v“ include “datactl.v“ timesca

36、le 1ns/1ns module cpu(clk,reset,halt,rd,wr,addr,data,opcode,fetch,ir_addr,pc_addr); input clk,reset; output rd,wr,halt; output 12:0addr; output 2:0opcode; output fetch; output 12:0ir_addr,pc_addr; inout 7:0data; wire clk,reset,halt; wire 7:0data; wire 12:0addr; wire rd,wr, wire fetch,alu_ena; wire 2

37、:0opcode; wire 12:0ir_addr,pc_addr; wire 7:0alu_out,accum; wire zero,inc_pc,load_acc,load_pc,load_ir,data_ena,contrl_ena; endmodule,module cpu(clk,reset,halt,rd,wr,addr,data,opcode,fetch,ir_addr,pc_addr); clk_gen m_clkgen(.clk(clk),.reset(reset),.fetch(fetch),.alu_ena(alu_ena); register m_register(.

38、data(data),.ena(load_ir),.rst(reset),.clk(clk),.opc_iraddr(opcode,ir_addr); accum m_accum(.data(alu_out),.ena(load_acc),.clk(clk),.rst(reset),.accum(accum); alu m_alu(.data(data),.accum(accum),.clk(clk),.alu_ena(alu_ena),.opcode(opcode),.alu_out(alu_out),.zero(zero); machinectl m_machinectl(.clk(clk

39、),.rst(reset),.fetch(fetch),.ena(contrl_ena); machine m_machine(.inc_pc(inc_pc),.load_acc(load_acc),.load_pc(load_pc),.rd(rd),.wr(wr),.load_ir(load_ir), .clk(clk),.datactl_ena(data_ena),.halt(halt),.zero(zero),.ena(contrl_ena),.opcode(opcode); datactl m_datactl(.in(alu_out),.data_ena(data_ena),.data

40、(data); adr m_adr(.fetch(fetch),.ir_addr(ir_addr),.pc_addr(pc_addr),.addr(addr); counter m_counter(.clk(inc_pc),.rst(reset),.ir_addr(ir_addr),.load(load_pc),.pc_addr(pc_addr); endmodule,include “cpu.v“ include “ram.v“ include “rom.v“ include “addr_decode.v“ timescale 1ns/1ns define PERIOD 100 module

41、 topcpu; reg reset_req,clock; integer test; reg (3*8):0mnemonic; reg 12:0PC_addr,IR_addr; wire 7:0data; wire 12:0addr; wire rd,wr,halt,ram_sel,rom_sel; wire 2:0opcode; wire fetch; wire 12:0ir_addr,pc_addr; endmodule,module topcpu; reg reset_req,clock; . cpu t_cpu(.clk(clock),.reset(reset_req),.halt(

42、halt),.rd(rd),.wr(wr),.addr(addr),.data(data), .opcode(opcode),.fetch(fetch),.ir_addr(ir_addr),.pc_addr(pc_addr); ram t_ram(.addr(addr9:0),.read(rd),.write(wr),.ena(ram_sel),.data(data); rom t_rom(.addr(addr),.read(rd),.ena(rom_sel),.data(data); addr_decode t_addr_decode(.addr(addr),.ram_sel(ram_sel

43、),.rom_sel(rom_sel); initial begin clock=1; $timeformat(-9,1,“ns“,12); display_debug_message; sys_reset; test1; $stop; $finish; end endmodule,module topcpu; task display_debug_message; begin $display(“n*“); $display(“*“test1;“ to load the 1st diagnostic program. *“); end endtask task test1; begin test=0; disable MONITOR; $readmemb(“test1.pro“,t_rom.mem

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1