Aula Prototipação – 02/abril Objetivos da aula - Simulação nível de ciclo - Simulação com o ModelSim - Prototipação com o novo programa 1. Simulação nível de ciclo Baixar novamente os fontes da aula - fontes cleo 2 Extrair o arquivo. Reparar a existência de um diretório com o simulador do processador Cleópatra. Analisar o nova aplicação conta2.asm Abrir o simulador Cleosim.exe e carregar o conta2.asm 1 2 Executar a montagem, clicando sobre o círculo 1 em destaque na figura acima. Se o programa está corretamente escrito aparecerá no canto inferior esquerdo a mensagem “sucesso”. Depois do programa corretamente montado, pode-se simulá-lo, clicandose sobre o círculo 2 da figura acima, causando a abertura da janela do simulador, ao lado. Pode-se observar o estado da memória, dos registradores, e executar passo-apasso. No anexo a este documento encontrase um resumo do processador. Geração do arquivo em código objeto. Selecionar o formato listagem VHDL (com abaixo) e realize novamente a montagem. No diretório de trabalho é criado o arquivo “conta2.txt”, contendo: 00 44 01 42 02 50 03 01 04 24 05 42 06 94 07 1B ..... ; ; ; ; ; ; ; ; LDA #42H ADD #1 STA #42H JC #1BH Este arquivo indica na primeira coluna o endereço, na segunda coluna o código da instrução, e nas colunas subseqüentes, após o ponto e virgula, um comentário com a instrução. 2. Simulação usando o ModelSim 1) O primeiro passo é trabalhoso (manual), que consiste em copiar a segunda coluna do conta2.txt para o obj_code.vhd. obj_code.vhd original obj_code.vhd MODIFICADO --------------------------------------------------------Package com o código objeto --------------------------------------------------------library IEEE; use IEEE.Std_Logic_1164.all; --------------------------------------------------- Package com o código objeto -------------------------------------------------library IEEE; use IEEE.Std_Logic_1164.all; package object_code is package object_code is type ram is array (0 to 255) of std_logic_vector(7 downto 0); type ram is array (0 to 255) of std_logic_vector(7 downto 0); signal memoria : ram := ( x"44", x"5D", x"54", x"5F", x"24", x"61", x"94", x"37", x"44", x"5E", x"54", x"60", x"24", x"62", x"9C", .... signal memoria : ram := ( x"44", x"42", x"50", x"01", x"24", x"42", x"94", x"1B", x"44", x"43", x"24", x"FF", x"44", x"42", x"24", x"FE", x"44", ……. Sugestão: apague a coluna original até a linha 112. Inserir o novo código objeto. Remover as colunas excedentes (82-112). O final do arquivo deve ser: 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. x"FA", x"8C", x"E6", x"D0", x"00", x"00", x"00", x"FF", others => x"00"); end object_code; Importante: apenas para simulação, troque o “FF” da linha 81 por “02”, pois este número indica o tempo da rotina que fica em laço exibindo os dados da contagem. 2) Localize a ferramenta de Simulação ModelSim, e mude para o diretório onde foram gravados os arquivos de simulação. prompt do shell Se houver problema de licença, inclua a variável de ambiente correspondente: - Start run control system advanced environment variables Variable name: MGLS_LICENSE_FILE Variable value: [email protected] 3) O shell do ModelSim aceita comandos. Por exemplo, digite “pwd”. Deve-se obter o diretório de trabalho. 4) Olhe o arquivo de comandos “compila.do”: 1) 2) 3) 4) 5) 6) 7) 8) 9) #vdel -all -lib work vmap unisim C:/Modeltech_6.1f/unisim vlib work vmap work work vcom obj_code.vhd modulos.vhd cleopatra.vhd top.vhd cleo_tb.vhd vsim work.tb do wave.do set StdArithNoWarnings 1 run 1500 us A linha 2 deve ser alterada conforme a instalação do ModelSim na máquina. A linha 5 indica para compilarmos os 5 arquivos fontes do projeto. A linha 9 indica o tempo de simulação 5) Execute o script de simulação digitando no shell: “do compila.do”. O resultado deve ser: Clique no botão destacado na figura acima para “liberar” (unlock) a janela de formas de onda (wave) e no botão de zoom área destaque a região entre 1180us e 1280us. 3. ISE Troque para “FF” a linha do tempo e proceda à prototipação como na aula passada. Na execução irão perceber que os dígitos do display de sete segmentos estão trocados. Inverter. Realizar o trabalho do cronômetro para a próxima aula. ARQUITETURA CLEÓPATRA 3.0 - RESUMO Endereçamento (addressing mode), no campo ME, a ser usado. Os 2 últimos bits da primeira palavra de 1 instrução são sempre 00, não sendo utilizados. O formato é o seguinte: INS ME Não usados IIII AA 00 Conjunto de Registradores: 1 Registrador Acumulador 1 Contador de Programa 1 Registrador de Subrotina 4 Biestáveis de Estado - Vai-um Transbordo Negativo Zero AC PC RS C V N Z Modos de Endereçamento: 00 - Imediato (Operando é o dado de 8 bits junto à instrução); 01 - Direto (Operando é endereço de memória de 8 bits. Diz onde se encontra o dado); 10 - Indireto (Operando é endereço de memória de 8 bits. Diz onde se encontra o endereço do dado); 11 - Relativo (Operando é deslocamento de 8 bits em complemento de 2, para ser adicionado ao valor atual do PC, gerando assim o endereço do dado). Linguagem de Montagem (Assembly) - Sintaxe: Instruções: Código Mnemônico 000x NOT 001x STA oper 0100 LDA oper 0101 ADD oper 0110 OR oper 0111 AND oper 1000 JMP oper 1001 JC oper 1110 JV oper 1010 JN oper 1011 JZ oper 1100 JSR oper 1101 RTS 1111 HLT Operação Complementa (inverte) todos os bits de AC. Armazena AC na memória dada por oper. Carrega AC com conteúdos de memória da posição dada por oper. Adiciona AC a conteúdo da memória dada por oper. Faz OU lógico do AC com conteúdo da memória dada por oper. Faz E lógico do AC com conteúdo da memória dada por oper. PC recebe dado especificado por oper. Se C=1, então PC recebe valor dado por oper. Se V=1, então PC recebe valor dado por oper. Se N=1 então PC recebe valor dado por oper. Se Z=1, então PC recebe valor dado por oper. RS recebe conteúdo de PC e PC recebe dado de oper. PC recebe conteúdos de RS. Suspende processo de busca e execução de instruções. Observações: oper - operando que depende do modo de endereçamento para ser determinado; Instruções lógicas (NOT, AND e OR) e LDA - afetam os códigos de condição N e Z; ADD - Afeta C, V, N e Z; Instruções restantes (STA, JMP, JC, JV, JN, JZ, JSR, RTS HLT) - não alteram códigos de condição; Nas instruções sem operando (NOT, RTS e HLT), o campo de modo de endereçamento não é utilizado; Para as instruções de desvio (JMP, JC, JV, JN, JZ, JSR) e STA, os modos de endereçamento direto e imediato são idênticos (possuem o mesmo efeito). Formatos de Instrução: - Existem dois tipos de instrução: com e sem operando; Instruções com operando ocupam 2 bytes da memória de programa, enquanto que instruções sem operando ocupam apenas 1 byte. A seguir, descreve-se o formato da primeira palavra de qualquer instrução. Formato da primeira palavra de uma instrução Os quatro primeiros bits contêm o código da operação (operation code, ou OPCODE), no campo INS, e os dois bits seguintes especificam o Modo de Os códigos de operação são reservados, correspondendo aos 14 mnemônicos mencionados acima, no item Instruções; Rótulos podem denotar posições da memória de programa, quando precederem algum dos 14 mnemônicos, ou da memória de dados, quando precederem a diretiva “DB”; Rótulos são especificados por qualquer texto diferente de um mnemônico, sucedido do caracter “:”; Comentários vão do primeiro caracter “;” até o final da linha; Formato para os operandos é o seguinte: #<rótulo> ou #<número>; <rótulo> ou <número>; <rótulo>,I ou <número>,I; <rótulo>,R ou <número>,R Os símbolos “#”, “I” e “R” indicam o modo de endereçamento a usar na interpretação do operando, correspondendo aos modos Imediato, Indireto e Relativo, respectivamente. O modo Direto é assumido se nenhum dos outros for fornecido. <rótulo> representa qualquer rótulo como especificado acima, sem o caracter delimitador “:”. <número> representa um número em um de três formatos, hexa binário ou decimal: <numhexa>H / <numbin>B / <numdec> Diretivas de montagem não são instruções do processador, mas ordens para o programa montador. Por exemplo, a diretiva DB (“define byte”) ordena a reserva de um byte de memória de dados para uso pelo programa, quando em execução. Outras diretivas da linguagem são .CODE e .ENDCODE, que delimitam o texto do programa e .DATA e .ENDDATA, que delimitam a área de dados. Finalmente, existe a diretiva ORG, que define o próximo endereço de montagem, seja de dados, seja de instruções do programa. Exemplos de Programas: (Endereços da memória de programa e da memória de dados e código objeto de cada linha são colocados como comentário.) Exemplo: Este programa executa um algoritmo irrelevante, apenas serve para ilustrar o formato da linguagem de montagem, a tradução de linguagem de montagem para linguagem de máquina (em hexadecimal) e o funcionamento dos modos de endereçamento. Note que o número das linhas não faz parte do programa, está indicado apenas para fins didáticos. Explanação: O programa inicia carregando o registrador acumulador AC com o conteúdo da posição 90 de memória, na linha 3 (posição inicializada com 30 pela diretiva DB na memória de dados); a este dado, a segunda instrução soma o conteúdo da posição de memória 93 (dado 5B), colocando o resultado da soma de volta no acumulador, obtendo o dado via endereçamento indireto; a terceira instrução realiza o armazenamento do conteúdo de AC na posição de memória END3 (endereço 92, inicialmente contendo 00). Após, o mesmo dado é transformado pelo zeramento de seus quatro bits mais significativos, pela instrução da linha 6, e o resultado volta à AC. Se o resultado desta operação for 0, o programa pára, senão AC tem todos os seus bits invertidos e só aí o programa pára. Identifique se, com os dados fornecidos abaixo, a linha 8 da memória de programa é executada ou não. Memória de Programa: Rótulo Mnem Operando End Opcode Oper 1 .CODE ;Início do programa 2 ORG #00H ;Monta a partir de 00H 3 INIT: LDA END1 ;00 44 90 4 ADD END2,I ;02 58 91 5 STA END3 ;04 24 92 6 AND #0FH ;06 70 0F 7 JZ FIM,R ;08 BC 01 8 NOT ;0A 00 9 FIM: HLT ;0B F0 10 .ENDCODE ;Fim do programa Memória de Dados Rótulo Mnem Operando End Dado 1 .DATA ;Início dos dados 2 ORG #90H ;Monta a partir de 90H 3 END1: DB #30H ;90 30 4 END2: DB #END4 ;91 93 5 END3: DB #00H ;92 00 6 END4: DB #5BH ;93 5B 7 .ENDDATA ;Fim dos dados