Details
O Processador implementado possui tres modulos principais:
Cada uma dessas unidade possui responsabilidade e barramentos de entradas e saidas bem definidas. A seguir abordaremos um pouco de cada modulo.
O modulo da unidade de controle se conecta a todo coprocessador e fica responsavel por receber as instruções e sinais de controle externo bem como retornar as flags de controle e o resultado das operações. A entrada de dados e instruções no coprocessador é feita atraves do barramento Data In e a saida de dados é feita atraves do barramento Data Out, esses barramentos serão detalhados na seção de Barramentos.
Dentro do modulo da unidade de controle é realizada a decodificação da instrução, a depender da instrução o processador pode ir para um estado de memoria ou um estado de inferencia. Os tipos de instrução serão abordados na seção Conjunto de Instruções (ISA). Durante a execução de uma instrução nenhuma outra podera ser executada, sendo assim, é necessaria aguardar o termino de uma instrução para que seja possivel enviar outra.
[!WARNING] Caso uma instrução seja enviada enquanto o coprocessador está executando outra, a flag de erro poderá ser ativada.
Ao fim da execução da instrução o coprocessador retornara ao estado IDLE permitindo assim a leitura de uma nova instrução.
A unidade de inferencia é o modulo responsanvel por abrigar os MACs e os bancos de registradores utilizados durante o processo de calculo. Este modulo pode ser divido em cinco submodulos
| submodulo | descricao |
|---|---|
| Primeira Camada | Modulo responsavel por realizar os calculos contidos na camada oculta do ELM |
| Banco de 128 Registradores | Banco de registradores responsavel por armazenar o resultado dos neuronios da camada oculta |
| Segunda Camada | Modulo responsavel por realizar os calculos contidos na camada de saida |
| Banco de 10 Registradores | Modulo responsavel por armazenar o resultado dos neuronios da camada de saida |
| Argmax Iterativo | Modulo comparador que busca a posição do registrador que contem o resultado de maior valor da camada de saida |
| Unidade de controle de Inferencia | Modulo responsavel por organizar o execução de modo que cada etapa da ELM seja executada corretamente. |
A primeira camada abriga 4 acumuladores, registradores de dados e a função de ativação. Para completar o calculo de todos os neuronios da primeira camada é necessario 32 passos
[!NOTE] Entenda como passo, todo o processo de calculo dos neuronios contidos nessa camada, neste caso 4
Cada passo necessita individualmente de 18844 ciclos de clock para ser executado totalmente.
A geração dos endereçamentos de leitura das memorias é feito dentro da primeira camada, assim como a geração do endereçamento de escrita no banco de registradores. Alem da função de ativação e dos acumuladores, a primeira camada conta com duas maquinas de estado responsaveis por gerenciar o fluxo de execução dos passos e emitir as flags de termino, solicitação de dado e demais handshakes de controle para evitar a leitura incorreta de dados.
[!NOTE] A função de ativação implementada foi a Tangente Hiperbolica, para sua implementação foi utilizada a tecnica de aproximação linear por partes.
Modulo que armazena um conjunto de registradores organizados em colunas onde é possivel realizar operações de leitura e escrita.
A segunda camada, assim como a primeira armazena seus acumuladores, registradores de dados e suas FMS(Maquinas de Estado Finito, Finite Machine State). Possui 5 neuronios e necessita de apenas 2 passos para realizar o calculo de todos da camada de saida. Faz o gerenciamento dos endereçamentos de leitura das memorias e ogerenciamento dos endereçamentos de escrita no banco de registradores. Para essa organização conta com duas FMS semelhantes a da primeira camada.
[!WARNING] A Camada de saida não possui função de ativação, sabendo disto, o modulo da segunda camada não implementa nenhum modulo para calculo de uma possivel função de ativação.
Este modulo é responsavel por gerenciar as operações de leitura e escrita de memoria. Se trata de um modulo de memoria generico que implementa a criação dinamica de memorias RAM de duas portas com base na familia do dispositivo e do tipo de memoria a ser utilizado.
Na implementação foram necessarias 4 instancias do modulo Load/Store.
| Nome | Descrição |
|---|---|
| mem_img | Instancia do LSU responsavel por armazenar 784 valores de 8 bits correspondente aos pixeis da imagem |
| mem_win | Instrancia do LSU responsavel por armazenar 100352 valores de 16 bits correspondentes aos pesos da camada oculta |
| mem_bias | Instancia do LSU responsavel por armazenar 128 valores de 16 bits correspondentes aos bias da camada oculta |
| mem_beta | Instancia do LSU responsavel por armazenar 1280 valores de 16 bits correspondentes aos valores de beta da camada de saida |
Cada instancia de memoria implementada possui largura e profundidade distintas.
[!WARNING] Antes de realizar a operação de leitura ou escrita em uma das memorias verificar o numero de endereços validos, caso seja enviado um dado para um endereço não valido a flag de erro será ativada.
Details
O coprocessador implementado possui um pequeno conjunto de seis instruções, sendo cinco delas de memoria e uma instrução de controle.
| Instrução | OP Code | Função |
|---|---|---|
| Store Image | 000 | Responsavel por armazenar um pixel da imagem na memoria |
| Store Weights Addr | 001 | Responsavel por guardar o endereço a ser amarmazenad o peso que sera enviado pela instrução Store Weights Value |
| Store Weights Value | 010 | Responsavel por armazenar um o peso na memoria |
| Store Bias | 011 | Responsavel por armazenar um bias na memoria |
| Store Beta | 100 | Responsavel por armazenar um valor de beta na memoria |
| Start | 101 | Responsavel por iniciar o processo de inferencia a partir dos dados contidos nas memorias |
| Status | 110 | Instrução não utilizada pois tanto o resultado quanto as flags estão sendo atualizadas diretamente no barramento sem a necessidade de solicitação |
| NOP | 111 | Não executa nenhuma operação, utilizada para a inserção de bolhas em arquiteturas que implementam pipeline. |
As instruções de memoria levam em media cinco ciclos de clock para serem concluidas e ativam a flag de busy enquanto estão sendo executadas e a flag de done ao serem concluidas
Campos da instrução
Descrição dos campos
| Campo | Tamanho | Descrição |
|---|---|---|
| OP Code | 3 | Código da Instrução |
| Endereçamento | 10 | Endereço da memoria que o dado será armazenado |
| Dado | 8 | Valor do pixel a ser armazenado na memoria |
Campos da instrução
Descrição dos campos
| Campo | Tamanho | Descrição |
|---|---|---|
| OP Code | 3 | Codigo da Instrução |
| Endereçamento | 17 | Endereço de memoria onde será armazenado o peso a ser enviado |
[!WARNING] Essa instrução não ativa a flag de done e por se tratar do armazenamento de um valor em um registrador não necessita de espera.
[!NOTE] Essa instrução é uma exceção as instruções de memoria, sua execução leva, geralmente, 2 ciclos.
Campos da instrução
Descrição dos campos
| Campo | Tamanho | Descrição |
|---|---|---|
| OP Code | 3 | Código da Instrução |
| Dado | 16 | Valor a ser armazenado na memoria |
Campos da instrução
Descrição dos campos
| Campo | Tamanho | Descrição |
|---|---|---|
| OP Code | 3 | Codigo da instrução |
| Endereçamento | 7 | Endereço de memoria onde será armazenado o dado |
| Dado | 16 | Valor a ser armazenado na memoria |
O coprocessador possui uma unica instrução de controle que é a Start. O tempo de execução é o tempo de execução da inferencia + 2 ciclos de clock.
[!NOTE] Ao fim da execução da inferencia a flag de done será ativa e o resultado da inferencia será posto no barramento de saida.
Details
O coprocessador possui tres barramentos principais, dois de entrada e um de saida.| Barramento | Tamanho | Descrição |
|---|---|---|
| Data In | 32 | Barramento de dados de entrada |
| Signals | 3 | Barramento para envio de sinais de controle externos ao coprocessador |
| Data Out | 32 | Barramento de dados de saida |
Esse barramento é utilizado unico e exclusivamente para o envio das instruções do coprocessador. Possui 32 bits que deverão ser preenchidos de acordo com a instrução que será executada.
Esse barramento é utilizado para envio de sinais de controle externos para o coprocessador. Possui tres bits, sendo cada bit utilizado para um sinal de controle.
| Bit | Nome do Sinal | Utilidade |
|---|---|---|
| 0 | Enable | utilizado para sinalizar que a instrução presente no barramento de entrada deve ser executada. |
| 1 | Clear Operation | Utilizado para limpar resquicios da execução de uma instrução anterior que deu erro alem de desativar a flag de erro permitindo a execução de uma nova instrução. OBS: Não apaga dados enviados erroneamente a memoria. |
| 2 | Reset | Usado para resetar os registradores do coprocessador. |
Barramento de saida de dados do coprocessador, possui largura de 32 bits, entretanto nem todos os bits são utilizados.
- Os 4 primeiros bits representam o numero predizido pela rede neural, o resultado desses bits só é confiavel após a conclusão da operação de inferencia
- O 5 bit é a flag de Done, esta flag é ativada sempre que uma operação é concluida e permanece ativada até que uma nova instrução comece a ser executada.
- O 6 bit é a flag de Busy, indica que uma operação ainda esta sendo executada pelo coprocessador.
- o 7 bit é a flag de Error, indica que a instrução anterior não foi executada corretamente, mesmo que tenha sido concluida o seu resultado não é confiavel.
[!WARNING] Mesmo que uma operação seja concluida, caso o sinal de enable ainda esteja em nivel logico alto, a flag de Done não sera acionada até que o sinal retorne ao nivel logico baixo, evitando a execução de instruções erroneamente, ou que execute a mesma instrução novamente.






