Sistemas Digitais Projeto 2ª Unidade CPU
Arquitetura/plataforma de prototipação Sistemas Digitais
Conjunto de instruções INSTRUÇÂO OPCODE Add endereço : Ac <= Ac + conteúdo endereço .:. 00 Store endereço: endereço dado <= Ac .:. 01 Load endereço: Ac <= conteúdo do endereço .:. 02 Jump endereço: Pc <= endereço .:. 03 JNEG endereço: Se Ac < 0 Pc <= endereço .:. 04 Sub endereço: Ac <= Ac - conteúdo endereço .:. 05 In (Leitura) dispositivo : Lê do dsipositivo .:. 06 Out (Escrita) dispositivo : Escreve no dispositivo .:. 07 Sistemas Digitais
Declaração da CPU LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CPU IS PORT( clock : IN STD_LOGIC; reset : IN STD_LOGIC; bus_data_in_register : IN STD_LOGIC_VECTOR(1 downto 0); ... memory_address_register : OUT STD_LOGIC_VECTOR(7 downto 0); ); Sistemas Digitais
Modelo de arquitetura --Aqui deve constar a declaração dos sinais e dos estados BEGIN PROCESS (clock, reset) IF (reset = '1') THEN state <= reset_pc; ELSIF (clock'EVENT AND clock = '1') THEN CASE state IS WHEN reset_pc => program_counter <= "00000000"; memory_address_register <= "00000000"; memory_data_out_register <= "0000000000000000"; register_AC <= "0000000000000000"; bus_data_out_register <= "00"; bus_address_register <= "00"; memory_write <= '0'; state <= fetch; Sistemas Digitais
Alguns estados WHEN fetch => program_counter <= program_counter + 1; memory_write <= '0'; state <= fetch1; 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; ... -- continua outros estados; WHEN OTHERS => state <= fetch; END CASE; Sistemas Digitais
Alguns Estados (cont) ... WHEN execute_jump => memory_address_register <= instruction_register(7 DOWNTO 0); program_counter <= instruction_register(7 DOWNTO 0); state <= fetch; WHEN execute_out => bus_address_register <= instruction_register(1 DOWNTO 0); bus_data_out_register <= register_ac (1 DOWNTO 0); memory_address_register <= program_counter; WHEN OTHERS => Sistemas Digitais
Unidade de mapeamento A unidade de mapeamento será o “estágio” final do projeto. Ela conterá os componentes utilizados (cpu, memória, decoder, drivers ...) e fará a ligação entre os mesmos utilizando sinais (fios). Esse mapeamento deve ser feito em VHDL utilizando a sintaxe de PORT MAP Sistemas Digitais
Unidade de mapeamento LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY robot IS PORT( clock : IN STD_LOGIC; reset : IN STD_LOGIC; motorControl1 : IN STD_LOGIC_VECTOR(1 DOWNTO 0); ... motorOut1 : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); ); END robot; Sistemas Digitais
Unidade de mapeamento(cont) -- declaração dos sinais usados ... -- declaração dos componentes usados COMPONENT decoder PORT( clock : IN STD_LOGIC; busAddress : IN STD_LOGIC_VECTOR(1 downto 0); CSMotor1 : OUT STD_LOGIC; CSMotor2 : OUT STD_LOGIC; muxSelector : OUT STD_LOGIC ); END COMPONENT; Sistemas Digitais
Mapeamento ... BEGIN U1: decoder PORT MAP(clock => clock, busAddress => bus_address, CSMotor1 => chip_select_motor1, CSMotor2 => chip_select_motor2, muxSelector => chip_select_mux ); U2: driver PORT MAP(reset => reset, chipSelect => chip_select_motor1, busData => bus_data_out, motorSignal => motorOut1 ); Sistemas Digitais