Upload
internet
View
107
Download
0
Embed Size (px)
Citation preview
Unidade Central de Processamento
Sistemas Digitais
CIn-UFPE
Como funciona um computador simples
Vídeo
Teclado
Memória
Programas+
Dados
E/S
Buffers
ALU
PCIR
Gerais
MARMAR
MBRMBR
Unid. processamento
Unid. controle
IR – Instruction RegisterPC – Program CounterMAR – Memory Address RegisterMBR – Memory Bus Register
Como funciona um computador?
Busca a próximainstrução
Busca a próximainstrução
Executa a instrução
Executa a instrução
Início
Término
Executando um programa
Busca instruçãoBusca instrução
Executa instruçãoExecuta instrução
Busca operandoBusca operando
Decodifica instruçãoDecodifica instrução
Armazena resultadoArmazena resultado
Incrementa PCIncrementa PC
Exemplo - Simple statementsExemplo:/* Programa que repete uma seqüência de adições de três sinais de entrada (a+b+c) e
mostra o resultado (z = a=b+c)Sigad: CLRLD /* Clear acumulador Y, Z e carrega valor de A em X
ADD /*ADD 1o. valor, guarda resultado e lë novo valor ADD /*ADD 2o .valor, guarda resultado e lë novo valor ADD /*ADD 3o .valor, guarda resultadoDISP Sigad /*mostra resultado e repete cálculo em Z
Como construir uma unidade de controle que implemente este programa?Estado Estado/saída
QA Sigad: QB/CLRLD
QB QC/ADD
QC QD/ADD
QD QE/ADD
QE QA/DISP
Y
+X
controleTy
TxZ
Tz
entrada
saída
A
clk
Z = a+b+c
Clk
Y
+X
controleTx
Ty
Tz
QA Sigad: QB/CLRLD
QB QC/ADD
QC QD/ADD
QD QE/ADD
QE QA/DISP
entrada
saída
A = a
-
- -
Q B
ADD
A=bY=0X=aZ=0 Ty=1 Tx=1 Tz=2
A = b
a
0 0
Q C
ADD
A=cY=aX=bZ=0 Ty=1 Tx=1 Tz=2
A = c
b
a 0
Q D
ADD
A=-Y=a+bX=cZ=0 Ty=1 Tx=1 Tz=2
A = -
c
a+b 0
Q E
A=-Y=a+b+cX=-Z=0 Ty=0 Tx=0 Tz=1
DISP
A = -
-
a+b+c 0
A=-Y=-X=-Z= a+b+c
Q A
A = -
-
- a+b+cZ
Clk
Clk
T[0] = clear[1] = load[2] = hold
Q A
CLRLD
A=aY=-X=-Z=- Ty=0 Tx=1 Tz=0
saídaY
+X
controleTx
TyZ
Tz
entrada
A
clk
Z = a + b + c
X = -; Y=-; Z=-; 00 CLRD end+0(a)
X = a; Y=0; Z=0;
05 - -------
Busca instruçãoBusca instrução
Executa instruçãoExecuta instrução
Busca operandoBusca operando
Decodifica instruçãoDecodifica instrução
Armazena resultadoArmazena resultado
Incrementa PCIncrementa PC
Busca instruçãoBusca instrução
Executa instruçãoExecuta instrução
Busca operandoBusca operando
Decodifica instruçãoDecodifica instrução
Armazena resultadoArmazena resultado
Incrementa PCIncrementa PC
Execução de um progama
memória
cpu
memória
cpu
memória
Contador deprograma
Memória:
Instruções end(dados)Contador do
Programa (PC)
cpu
01 ADD end+1(b)
X = b; Y=a; Z=0;02 ADD end+2(c) X = c ; Y= a+b; Z =0;03 ADD -
X = -; Y= a+b+c; Z =0; X = -; Y= a+b+c; Z =a+b+c;
04 DISP -
Instruções end (dados)
memória
Inst |dados
Memória
0 15
sinal
Dado
Instrução
magnitude
0 153
Opcode Endereço
4
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
Opcode
Executando um programa
1 9 4 0
5 9 4 12 9 4 1
0 0 0 3
0 0 0 2
3 0 0
1 9 4 0
3 0 0
9 4 1
9 4 0
3 0 2
3 0 1PC (endereço)
AC (operando)
IR (Instrução)
Registradores da CPU
...
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
MemóriaOpcode | endereço
dados
Executando um programa
1 9 4 0
5 9 4 12 9 4 1
0 0 0 3
0 0 0 2
3 0 0
1 9 4 0
3 0 0
9 4 1
9 4 0
3 0 2
3 0 1
PC
AC
IR
Registradores da CPU
...
0 0 0 3
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
MemóriaOpcode | endereço
dados
Executando um programa
1 9 4 0
5 9 4 12 9 4 1
0 0 0 3
0 0 0 2
3 0 1
5 9 4 1
3 0 0
9 4 1
9 4 0
3 0 2
3 0 1
PC
AC
IR
Registradores da CPU
...
0 0 0 3
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
MemóriaOpcode | endereço
dados
Executando um programa
1 9 4 0
5 9 4 12 9 4 1
0 0 0 3
0 0 0 2
3 0 1
5 9 4 1
3 0 0
9 4 1
9 4 0
3 0 2
3 0 1
PC
AC
IR
Registradores da CPU
...
0 0 0 5
161616 523
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
MemóriaOpcode | endereço
dados
Executando um programa
1 9 4 0
5 9 4 12 9 4 1
0 0 0 3
0 0 0 2
3 0 2
2 9 4 1
3 0 0
9 4 1
9 4 0
3 0 2
3 0 1
PC
AC
IR
Registradores da CPU
...
0 0 0 5
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
MemóriaOpcode | endereço
dados
Executando um programa
1 9 4 0
5 9 4 12 9 4 1
0 0 0 3
0 0 0 5
3 0 2
2 9 4 1
3 0 0
9 4 1
9 4 0
3 0 2
3 0 1
PC
AC
IR
Registradores da CPU
...
0 0 0 5
0001 AC <- Mem.0010 Mem. <- AC0101 AC <- AC + Mem.
MemóriaOpcode | endereço
dados
Processor
Memory Input/Ouput
Data Bus
Address Bus
PC IR
AC
MDR
MAR
ALU
Control Unit
Arquitetura do computador
PC = Program counterIR = Instruction registerAC = AcumuladorMAR = Memory Address RegisterMDR = Memory Data Register ALU = Arithmetic & Logic Unit
MemóriaDispositivo de entrada e saída(E/S)
Arquitetura do computador
PC - program counter – indica a próxima instrução a ser executada.
IR - Instruction register – recebe a instrução a ser decodificada pela CPU.
AC – Acumulador (registrador auxiliar). Guarda temporariamente valores sendo calculados.
MAR – Registrador que indica a próxima posição de memória a ser referenciada. Conectado ao barramento de endereços.
MDR – Registrador usado para receber ou transmitir dados. Conectado ao barramento de dados.
ALU (ULA) – Unidade Lógica
Instruction Mnemonic Operation Preformed Opcode Value ADD address AC <= AC + contents of memory address 00 STORE address contents of memory address <= AC 01 LOAD address AC <= contents of memory address 02 JUMP address PC <= address 03 JNEG address If AC < 0 Then PC <= address 04
Instruções básicas
Opcode Address
15 8 7 0
Formato da instrução do computador
Assembly Language MachineLanguageLOAD B 0211ADD C 0012
CPU - P1
Conjunto de instruções básicas– Exemplo de um programa no P1:
A = B+C
A (acumulador), B e C são endereços de memória
Fetch Next Instruction
Decode Instruction
Execute Instruction
CPU - P1
Fluxo de execução de instruções
EXECUTE
MAR=PC IR=MDR
PC=PC+1 Read Memory
MDR=AC Write Memory
AC=MDR AC=AC+MDR
MAR=IR Read
Memory
FETCH
DECODE
Opcode=ADD Opcode=LOAD Opcode=STORE
...
CPU - P1
Fluxo de execução de instruções detalhada
CPU - P1
LOAD B
Opcode address
02 11
Load address AC<- conteúdo do endereço de memória
1.
2.
PC
ADD C
Load B 1.
02 11
00 04
2. ADD C
00
00 12
00 12 01 01
02
1100
04
00
1200
03
00 03 00 04
00 0
4
00 07
02 1100 0400 1200 03
0112110112110112
A = B+CA (acumulador), B e C são endereços de memória
Assembly Language MachineLanguageLOAD B 0211ADD C 0012
00 07
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; LIBRARY lpm; USE lpm.lpm_components.ALL; ENTITY SCOMP IS PORT( clock, reset : IN STD_LOGIC; program_counter_out : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ); register_AC_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ); memory_data_register_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 )); END SCOMP; ARCHITECTURE a OF scomp IS TYPE STATE_TYPE IS ( reset_pc, fetch, decode, execute_add, execute_load, execute_store, execute_store3, execute_store2, execute_jump ); SIGNAL state: STATE_TYPE; SIGNAL instruction_register, memory_data_register : STD_LOGIC_VECTOR(15 DOWNTO 0 ); SIGNAL register_AC : STD_LOGIC_VECTOR(15 DOWNTO 0 ); SIGNAL program_counter : STD_LOGIC_VECTOR( 7 DOWNTO 0 ); SIGNAL memory_address_register : STD_LOGIC_VECTOR( 7 DOWNTO 0 ); SIGNAL memory_write : STD_LOGIC; BEGIN -- Use LPM function for computer's memory (256 16-bit words) memory: lpm_ram_dq GENERIC MAP ( lpm_widthad => 8, lpm_outdata => "UNREGISTERED", lpm_indata => "REGISTERED", lpm_address_control => "UNREGISTERED", -- Reads in mif file for initial program and data values lpm_file => "program.mif", lpm_width => 16 ) PORT MAP ( data => Register_AC, address => memory_address_register, we => memory_write, inclock => clock, q => memory_data_register ); program_counter_out <= program_counter; register_AC_out <= register_AC; memory_data_register_out <= memory_data_register; PROCESS ( CLOCK, RESET ) BEGIN IF reset = '1' THEN state <= reset_pc; ELSIF clock'EVENT AND clock = '1' THEN
CASE state IS -- reset the computer, need to clear some registers WHEN reset_pc => program_counter <= "00000000"; memory_address_register <= "00000000"; register_AC <= "0000000000000000"; memory_write <= '0'; state <= fetch; -- Fetch instruction from memory and add 1 to PC WHEN fetch => instruction_register <= memory_data_register; program_counter <= program_counter + 1; memory_write <= '0'; state <= decode; -- Decode instruction and send out address of any data operands WHEN decode => memory_address_register <= instruction_register( 7 DOWNTO 0); CASE instruction_register( 15 DOWNTO 8 ) IS WHEN "00000000" => state <= execute_add; WHEN "00000001" => state <= execute_store; WHEN "00000010" => state <= execute_load; WHEN "00000011" => state <= execute_jump; WHEN OTHERS => state <= fetch; END CASE;
-- Execute the ADD instruction WHEN execute_add => register_ac <= register_ac + memory_data_register; memory_address_register <= program_counter; state <= fetch; -- Execute the STORE instruction -- (needs three clock cycles for memory write) WHEN execute_store => -- write register_A to memory memory_write <= '1'; state <= execute_store2; -- This state ensures that the memory address is -- valid until after memory_write goes inactive WHEN execute_store2 => memory_write <= '0'; state <= execute_store3; WHEN execute_store3 => memory_address_register <= program_counter; state <= fetch; -- Execute the LOAD instruction WHEN execute_load => register_ac <= memory_data_register; memory_address_register <= program_counter; state <= fetch; -- Execute the JUMP instruction WHEN execute_jump => memory_address_register <= instruction_register( 7 DOWNTO 0 ); program_counter <= instruction_register( 7 DOWNTO 0 ); state <= fetch; WHEN OTHERS => memory_address_register <= program_counter; state <= fetch; END CASE; END IF; END PROCESS; END a;
Figure 8.12 MIF file containg P 1 Computer Program.
Figure 8.13 Simulation of the Simple P 1 Computer Program.
Projetos
b
a
c
d
e
f gclk
4
CPU - P 1
Decoder
BCD7-Segm.
4
Dispositivo de I/OSaídaEntrada
programa
Calcular a média aritmética de três números previamente colocados na memória da CPU e mostrar o resultado no display.
Comparar elementos de um array (5 elementos), colocando o maior deles numa variável "resultado“ e no display.
Os resultados das operações devem ser enviados para o display (dispositivo de saída do sistema)
reset
Arquitetura/plataforma de prototipação
Robô
CPU
Motor 1 Motor 2
Memória
Controle dos motores
Motor 1 Motor 2
Decodificador
Driver Driver