160 likes | 334 Views
嵌入式系统与结构 第三章 通用处理器-软件. 第三章 主要内容. 通用处理器基本结构 通用处理器执行指令-运算 程序员观点理解通用处理器 专用指令集处理器 微处理器的选择 通用处理器设计. 举例:简单通用处理器设计. 基本结构 要求 实现的指令集 简单处理器的 ISS. FSMD. Reset. PC=0;. IR=M[PC]; PC=PC+1. Fetch. Decode. 自以下状态. IR 的位定义 : op IR[15..12] rn IR[11..8] rm IR[7..4].
E N D
嵌入式系统与结构 第三章 通用处理器-软件
第三章 主要内容 通用处理器基本结构 通用处理器执行指令-运算 程序员观点理解通用处理器 • 专用指令集处理器 • 微处理器的选择 • 通用处理器设计
举例:简单通用处理器设计 • 基本结构 • 要求实现的指令集 • 简单处理器的ISS
FSMD Reset PC=0; IR=M[PC]; PC=PC+1 Fetch Decode 自以下状态 IR的位定义: op IR[15..12] rn IR[11..8] rm IR[7..4] dir IR[7..0] imm IR[7..0] rel IR[7..0] Mov1 RF[rn] = M[dir] 到 Fetch状态 op = 0000 Mov2 M[dir] = RF[rn] 0001 到 Fetch状态 Mov3 M[rn] = RF[rm] 0010 到 Fetch状态 Mov4 RF[rn]= imm 0011 到 Fetch状态 Add RF[rn] =RF[rn]+RF[rm] 0100 到 Fetch状态 Sub RF[rn] = RF[rn]-RF[rm] 0101 到 Fetch状态 Jz PC=(RF[rn]=0) ?rel :PC 0110 到 Fetch状态 简单通用处理器的FSMD Declarations: bit PC[16], IR[16]; bit M[64k][16], RF[16][16]; 为什么寄存器文件使用16个寄存器? 为什么存储器设计成64K?
简单通用处理器的结构细化 Datapath 1 控制单元 0 到所有输入控制信号 RFs 2x1 mux RFwa Controller (Next-state and control logic; state register) RF (16) RFw RFwe 来自输入控制信号 RFr1a RFr1e 16 RFr2a PCld Irld PC IR RFr1 RFr2 PCinc RFr2e ALUs PCclr ALU ALUz 2 1 0 Ms 3x1 mux Mre Mwe Memory D A
Datapath 1 Control unit 0 To all input control signals RFs 2x1 mux RFwa Controller (Next-state and control logic; state register) RF (16) RFw RFwe From all output control signals RFr1a RFr1e 16 RFr2a Irld PCld PC IR RFr1 RFr2 PCinc RFr2e ALUs PCclr ALU ALUz 2 1 0 Ms 3x1 mux Mre Mwe Memory D A 简单微处理器设计 Reset PC=0; PCclr=1; IR=M[PC]; PC=PC+1 Fetch MS=10; Irld=1; Mre=1; PCinc=1; Decode from states below Mov1 RF[rn] = M[dir] RFwa=rn; RFwe=1; RFs=01; Ms=01; Mre=1; to Fetch op = 0000 RFr1a=rn; RFr1e=1; Ms=01; Mwe=1; Mov2 M[dir] = RF[rn] 0001 to Fetch RFr1a=rn; RFr1e=1; Ms=10; Mwe=1; Mov3 M[rn] = RF[rm] 0010 to Fetch Mov4 RF[rn]= imm RFwa=rn; RFwe=1; RFs=10; 0011 to Fetch RFwa=rn; RFwe=1; RFs=00; RFr1a=rn; RFr1e=1; RFr2a=rm; RFr2e=1; ALUs=00 Add RF[rn] =RF[rn]+RF[rm] 0100 to Fetch RFwa=rn; RFwe=1; RFs=00; RFr1a=rn; RFr1e=1; RFr2a=rm; RFr2e=1; ALUs=01 Sub RF[rn] = RF[rn]-RF[rm] 0101 to Fetch PCld= ALUz; RFrla=rn; RFrle=1; Jz PC=(RF[rn]=0) ?rel :PC 0110 to Fetch FSMD datapath建立后FSM 操作代替FSMD 操作 简单处理器建立!
本章小结 • GPP处理器 • 高性能、低NRE, 灵活性 • 控制器、数据通道、存储器 • 结构化语言占主导 • 但汇编语言仍然需要 • 有许多开发工具可以获得 • 包括ISS、ICE(in-circuit emulators) • ASIPs • 微控制器, DSPs, 网络处理器、更多定制的ASIPs • 处理器选择是一个重要步骤 • GPP设计原理上与单用途处理器设计相同
LPT 接口引脚 I/O 方向 寄存器地址 1 Output 寄存器2的0th bit 2-9 Output 寄存器0的0~7bit 10,11,12,13,15 Input 寄存器1的6,7,5,4,3th 14,16,17 Output 寄存器2的1,2,3th bit 示例: 并行端口驱动程序 • 使用汇编语言编程配置PC的并口来执行数字I/O • 这个表提供并口连接器引脚和响应的寄存器位置关系。可通过读写3个专用寄存器来完成响应的管脚的配置。 • 举例 : 并口监控这个输入开关,来开闭
LPT Connection Pin I/O Direction Register Address 1 Output 0th bit of register #2 2-9 Output 0th bit of register #2 10,11,12,13,15 Input 6,7,5,4,3th bit of register #1 14,16,17 Output 1,2,3th bit of register #2 Parallel Port Example .386 CheckPort proc push ax ; 保存ax的内容 push dx ; 保存dx内容 mov dx, 3BCh + 1 ; base + 1 寄存器1的地址 in ax, dx ; 读寄存器 #1 and al, 10h ; 屏蔽位4以外的所有位 cmp al, 0 ; al为0 ? jne SwitchOn ; 不是则点亮LED SwitchOff: mov dx, 3BCh + 0 ; base + 0 寄存器0的地址 in al, dx ; 读当前端口状态 and al, f7h ; 清除位0 out dx, al ; 将al值写入端口 jmp Done ; we are done SwitchOn: mov dx, 3BCh + 0 ; base + 0 寄存器 #0地址 in al, dx ; 读当前端口状态 or al, 01h ; 第一位置1 out dx, al ; 写端口 Done: pop dx ; 恢复内容 pop ax ; 恢复内容 CheckPort endp extern “C” CheckPort(void); void main(void) { while( 1 ) { CheckPort(); }}
8086CPU内部结构图 CPU 控制器 工作寄存器 程序计数器(PC) 地址寄存器 指令寄存器(IR) ┆ 指令译码器(ID) 数据寄存器 控 制 逻 辑 部 件 堆栈指示器(SP) ┆ 状态寄存器(PSW) I/O控制逻辑 ALU
物理地址形成逻辑 A H A L B H B L C H C L D H D L S P B P D I S I 地址总线 AX (20位) 通用寄存器 BX CX 数据总线 DX 8086总线 16位 C S D S S S E S I P ALU数据总线 内部寄存器 总线 控制 电路 (16位) 暂存器 ALU EU 控制器 1 2 3 4 5 6 (8 位) 标 志 总线接口单元(BIU) 执行单元(EU)
ARM处理器的寄存器组织 用户 系统 管理 中止 未定义 IRQ FIQ R8_fiq R9_fiq R10_fiq R11_fiq R12_fiq R13_fiq R13_IRQ R13_und R13_abt R13_svc R14_fiq R14_abt R14_und R14_irq R14_svc SPSR_irq SPSR_svc 未用 SPSR_fiq SPSR_und SPSR_abt
例. 一个简单指令集 汇编指令. 第一字节 第二字节 运算 MOV Rn, direct 0000 Rn direct Rn = M(direct) MOV direct, Rn 0001 Rn direct M(direct) = Rn Rm MOV @Rn, Rm 0010 Rn M(Rn) = Rm MOV Rn, #immed. 0011 Rn immediate Rn = immediate ADD Rn, Rm 0100 Rn Rm Rn = Rn + Rm SUB Rn, Rm 0101 Rn Rm Rn = Rn - Rm JZ Rn, relative 0110 Rn relative PC = PC+ 相对地址 (only if Rn is 0) 操作码 操作数
Processor 控制单元 数据通道 ALU Controller 控制与状态 Registers PC IR I/O Memory 例. 简单处理器基本结构
一个简单处理器的ISS #include <stdio.h> typedef struct { unsigned char first_byte, second_byte; } instruction; instruction program[1024]; //指令存储器 unsigned char memory[256]; //数据存储器 int run_program(int num_bytes) { int pc = -1; unsigned char reg[16], fb, sb; while( ++pc < (num_bytes / 2) ) { fb = program[pc].first_byte; sb = program[pc].second_byte; switch( fb >> 4 ) { case 0: reg[fb & 0x0f] = memory[sb]; break; case 1: memory[sb] = reg[fb & 0x0f]; break; case 2: memory[reg[fb & 0x0f]] = reg[sb >> 4]; break; case 3: reg[fb & 0x0f] = sb; break; case 4: reg[fb & 0x0f] += reg[sb >> 4]; break; case 5: reg[fb & 0x0f] -= reg[sb >> 4]; break; case 6: pc += sb; break; default: return –1; } } return 0; } int main(int argc, char *argv[]) { FILE* ifs; If( argc != 2 || (ifs = fopen(argv[1], “rb”) == NULL ) { return –1; } if (run_program(fread(program, sizeof(program),ifs)) == 0) { print_memory_contents(); return(0); } else return(-1); }