Baixe o app para aproveitar ainda mais
Prévia do material em texto
18 UNIVERSIDADE FEDERAL DO ESTADO DE SÃO PAULO BRUNO HIDEKI AMADEU OGATA Implementação da Unidade Central de Processamento em Verilog São José dos Campos 2021 BRUNO HIDEKI AMADEU OGATA RA: 140884 Implementação da Unidade Central de Processamento em Verilog Relatório apresentado ao curso: Laboratório de Sistemas Computacionais: Arquitetura e Organização de Computadores. São José dos Campos 2021 RESUMO Aqui serão descritas as etapas seguidas para a implementação da Unidade Central de Processamento ou Central Process Unit (CPU), mostrando cada uma de suas unidades funcionais. A implementação será feita na linguagem de descrição de hardware Verilog e baseada na arquitetura MIPS, como descrito no relatório anterior para o ponto de checagem 1. Palavras-chaves: Unidades funcionais, ALU, Unidade de Controle, Verilog. LISTA DE ILUSTRAÇÕES Figura 1. Esquemático do processador MIPS 9 Figura 2. Código do Program Counter em Verilog 10 Figura 3. Código da Memória de Instruções em Verilog 10 Figura 4. Código do Banco de Registradores em Verilog 11 Figura 5. Código do Extensor de Bit em Verilog 12 Figura 6. Código da ULA em Verilog. 13 Figura 7. Código do Controle da ALU em Verilog 14 Figura 8. Código do Multiplexador de 5 bits em Verilog 14 Figura 9. Código do Multiplexador de 32 bits em Verilog 15 Figura 10. Código da Memória de Dados em Verilog 15 Figura 11. Parte do código da Unidade de Controle em Verilog 16 Figura 12. Código da CPU em Verilog 17 Figura 13. Waveform para teste da Memória de Instruções 18 Figura 14. Teste em waveform do Banco de Registradores 18 Figura 15. Teste em waveform da ULA 19 Figura 16. Teste em waveform da Memória de Dados 19 SUMÁRIO 1 Introdução 6 2 Objetivos 7 2.1 Geral 7 2.2 Específicos 7 3 Fundamentação Teórica 8 3.1 Verilog 8 3.2 Central Process Unit (CPU) 8 4 Desenvolvimento 10 4.1 Program Counter (PC) 10 4.2 Memória de Instruções 10 4.3 Banco de Registradores 11 4.4 Extensor de Bit 12 4.5 Unidade Lógica e Aritmética (ULA) 12 4.6 Controle da ALU 13 4.7 Multiplexadores 14 4.8 Memória de Dados 15 4.9 Unidade de Controle 15 4.10 CPU 17 5 Resultados e Discussões 18 6 Considerações Finais 20 Referências 21 1 Introdução Atualmente, máquinas como computadores e celulares são muito comuns ao redor do mundo todo. Essas máquinas citadas possuem diversos componentes internos, sendo um deles o processador. Para podermos observar mais de perto o funcionamento de um processador, a disciplina Laboratório de Sistemas Computacionais: Arquitetura e Organização de Computadores é essencial, pois aqui projetaremos um processador do zero, na linguagem de descrição de hardware Verilog, sendo nesse caso baseado na arquitetura MIPS. Nessa etapa do projeto será desenvolvida a Unidade Central de Processamento, peça fundamental na execução das instruções anteriormente definidas. 2 Objetivos 2.1 Geral Implementar a Unidade Central de Processamento em Verilog. 2.2 Específicos · Implementar o Program Counter (PC); · Implementar a Memória de Instruções · Implementar o Banco de Registradores; · Implementar a Unidade Lógica e Aritmética (ULA); · Implementar a Memória de Dados; · Implementar a Unidade de Controle; · Testar as unidades funcionais. 3 Fundamentação Teórica 3.1 Verilog Verilog é uma linguagem de descrição de hardware, criada por Prabhu Goel e Phil Moorby, para a empresa Automated Integrated Design Systems. É usada para implementar projetos a nível de circuito e além disso fornece maior rapidez e facilidade em sua implementação em relação à projetos em esquemático. É possível descarregar os códigos feitos em Verilog em FPGAs, por meio de suas placas de desenvolvimento com base em circuitos integrados. 3.2 Central Process Unit (CPU) A Unidade Central de Processamento é o “cérebro” de um sistema computacional. É onde se realizam as instruções, assunto do relatório anterior. Os principais componentes de uma CPU são: · A ULA (Unidade Lógica e Aritmética) usada para realizar operações lógicas como AND e OR e operações aritméticas como a soma e subtração; · A UC (Unidade de Controle) responsável por selecionar os valores que passaram pelos multiplexadores, dependendo das instruções, controlar as flags como Alu_Op e a Alu_Src, por exemplo; · Os registradores usados para armazenar os dados das instruções. No caso deste projeto a CPU terá, além desses, outros componentes como o Program Counter (PC), a Memória de Instruções, a Memória de Dados e muitos multiplexadores, como mostra a Figura 1 a seguir: Figura 1. Esquemático do processador MIPS Fonte: Referência [1]. 4 Desenvolvimento 4.1 Program Counter (PC) O Program Counter ou Contador de Programa foi a primeira unidade funcional a ser implementa nesse projeto. Na Figura 2 abaixo está o código do PC em Verilog. Figura 2. Código do Program Counter em Verilog Fonte: Autor. Foi acrescentada uma função de Reset nele para caso necessária futuramente, pois nas instruções que foram definidas por enquanto essa função não é necessária. O cálculo do ProxPC será feito em um módulo de um multiplexador que será citado mais adiante. 4.2 Memória de Instruções A memória de instruções é a responsável por decodificar as instruções. A seguir na Figura 3 temos a memória de instruções: Figura 3. Código da Memória de Instruções em Verilog Fonte: Autor. Para a implementação da Memória de Instruções foi utilizado um template fornecido pelo Quartus. Nela é lido um arquivo .txt com as instruções a serem executadas pelo processador previamente escritas nele, na seção de Resultados e Discussões será apresentado um teste em waveform com algumas instruções inseridas nesse arquivo, mostrando o funcionamento da memória. 4.3 Banco de Registradores O banco de registradores do MIPS é formado por 32 registradores de 32 bits. A partir disso, a seguir é mostrado na Figura 4 o código em Verilog do banco de registradores. Figura 4. Código do Banco de Registradores em Verilog Fonte: Autor. Repare que quando a flag “Reg_Write” é ativada pela Unidade de Controle é feita a escrita em um dos registradores, do valor contido em “Reg_dados”. 4.4 Extensor de Bit O extensor de bit é utilizado para transformar uma entrada de 16 bits em uma saída de 32 bits, para o caso das instruções do tipo I, que possuem um espaço para o valor imediato de 16 bits. Abaixo, na Figura 5, está sua implementação em Verilog. Figura 5. Código do Extensor de Bit em Verilog Fonte: Autor. 4.5 Unidade Lógica e Aritmética (ULA) A Unidade Lógica e Aritmética pode realizar as seguintes operações: · A + B; · A – B; · A x B; · A / B; · A and B; · A or B; · NOT(A); A seguir, na Figura 6, foi implementado o código da ULA em Verilog. Figura 6. Código da ULA em Verilog. Fonte: Autor. A flag “ALU_Ctrl” vem da unidade funcional Controle da ALU que será descrita a seguir e é responsável por selecionar na ULA a operação a ser realizada. 4.6 Controle da ALU O Controle da ALU é o responsável por indicar para a Unidade Lógica e Aritmética qual operação deve ser realizada. Como foi citado no PC1, no Controle da ALU as operações serão diferenciadas pelo seu OpCode e não pelo campo Funct, pois no momento há poucas instruções então acaba não afetando como um todo. Desse modo, abaixo na Figura 7 está o código em Verilog do Controle da ALU. Figura 7. Código do Controle da ALU em Verilog Fonte: Autor. No caso das instruções do Tipo R, a Unidade de Controle mandará a ALU_Op com o valor 1, para os casos das instruções do Tipo I, essa flag chegará até o Controle da ALU com o valor 0. Desse modo, a ALU_Ctrl recebe o sinal para saber a operação que será realizada nessas outras instruções. 4.7 Multiplexadores Os multiplexadores são utilizados para fazer uma escolha entre uma entrada ou outra dependendo do sinal de uma chave específica enviada pela Unidade de Controle. Para esse projeto foram usados dois tipos de multiplexadores, um de 5 bits e outro de 32 bits, quesão mostrados, respectivamente, pelas Figuras 8 e 9. Figura 8. Código do Multiplexador de 5 bits em Verilog Fonte: Autor. Figura 9. Código do Multiplexador de 32 bits em Verilog Fonte: Autor. 4.8 Memória de Dados A memória de dados é a responsável por armazenar os resultados numéricos gerados pela CPU. Ela foi implementada a partir de um template fornecido pelo Quartus, assim como a memória de instruções, e na Figura 8 abaixo está o código dela em Verilog. Figura 10. Código da Memória de Dados em Verilog Fonte: Autor. 4.9 Unidade de Controle A Unidade de Controle é responsável por enviar os devidos sinais para as demais unidades funcionais do processador, com o intuito de garantir que a instrução está sendo realizada da maneira correta. Como já citado anteriormente, as instruções do tipo R foram diferenciadas pelo seu OpCode, desse modo, a Unidade de Controle ficou mais extensa, por isso na Figura 11 a seguir será apresentada uma parte dessa unidade funcional. Figura 11. Parte do código da Unidade de Controle em Verilog Fonte: Autor. Escolhi essa parte da UC pois mostra algumas instruções do tipo R, a or, and e not e também algumas do tipo I, sendo a lw e a sw. A variável “Sinal” é responsável por enviar o sinal da operação que será realizada na ULA, no caso das instruções que não são do tipo R. 4.10 CPU O código da CPU foi montado a partir da junção de todas as unidades funcionais, seguindo o molde da Figura 1 com adição da Unidade de Controle. Abaixo, na Figura 12, está seu código em Veriog. Figura 12. Código da CPU em Verilog Fonte: Autor. 5 Resultados e Discussões Para essa etapa do projeto foram testadas, por meio de waveforms, as unidades funcionais Memoria de Instruções, Banco de Registradoress, Unidade Lógica e Aritmética e Memória de Dados. Para testar a Memória de Instruções coloquei no arquivo txt três instruções aleatórias e rodei o código. A intenção é ver se ao passar os ciclos de clock a Memória de Instruções vai atualizando adequadamente o valor das instruções. Abaixo, na Figura 13 temos o resultado desse teste. Figura 13. Waveform para teste da Memória de Instruções Fonte: Autor. Veja que o PC é acrescentado de 4 em 4 e que a Instrução é adequadamente atualizada a cada ciclo de clock. É provável que para o próximo PC eu modifique o cálculo do PC pois se for PC + 1 as instruções podem ser fornecidas a memória de instruções de maneira mais intuitiva. Para testar o Banco de Registradores a flag “Reg_Write” foi variada a cada três ciclos de clock, o “Reg_1” foi mantido fixo com o valor 00001 e o “Reg_2” mantido com o valor fixo 00010. Além disso, o “Reg_escrita” foi incrementado de 1 em 1 a cada ciclo de clock. O resultado desse teste é mostrado abaixo na Figura 14. Figura 14. Teste em waveform do Banco de Registradores Fonte: Autor. Os resultados obtidos mostraram que os registradores Rs, Rt e Rd armazenaram os valores esperados. No teste da ULA foi mantido um valor fixo de 15 para a entrada 1, 10 para a entrada 2 e a “ALU_Ctrl” foi incrementa de 1 a cada ciclo de clock, desse modo puderam ser testadas todas as funcionalidades da ULA. A seguir, na Figura 15, temos o resultado desse teste. Figura 15. Teste em waveform da ULA Fonte: Autor. Os resultados das operações foram como o esperado, note que para as operações lógicas os resultados devem ser observados em binário. Por fim, foi feito o teste da Memória de Dados. Para esse teste o “Mem_Write” fica ativo por 3 ciclos de clock e após isso é ativado o “Mem_Read”, além disso, o “Write_Data” é incrementado de 1 a cada ciclo de clock e o endereço de escrita também e, após 3 ciclos de clock o endereço de leitura passa a ser incrementado. Assim, na Figura 16 é mostrado o resultado desse teste. Figura 16. Teste em waveform da Memória de Dados Fonte: Autor. Os resultados obtidos foram como o esperado, observe que apenas quando o endereço de leitura é “ativado” a saída altera seu valor e, contém os valores armazenados previamente na escrita. 6 Considerações Finais O projeto já está quase concluído, provavelmente para o produto final será alterado o cálculo do PC para ser incrementado de 1 em 1, como dito anteriormente. Além disso, faltam ser feitos os testes com a CPU completa e implementar um módulo de comunicação que fará a comunicação com o FPGA para o teste final. Se tudo ocorrer como o previsto, em mais alguns dias o produto final já estará finalizado. Referências [1] < https://stackoverflow.com/questions/33334521/extending-mips-datapath-to-implement-sll-and-srl> Fonte da Figura 1; [2] Banco de Registradores: <http://www2.pcs.usp.br/~labdig/pdffiles_2015/banco-registradores-ula.pdf> [3] Unidade Central de Processamento: <https://pt.wikipedia.org/wiki/Unidade_central_de_processamento> [4] Trabalho de conclusão de curso do aluno Helder Celso Romero dos Santos disponibilizado no Moodle da disciplina.
Compartilhar