Aula 16: Unidade de Controle da ULA, do FD e do Gerador de Imediato

Resultados de aprendizagem esperados:


Unidade de Controle com Três Decodificadores

A nossa abordagem considera que:

Assim, podemos fazer a decodificação dos pontos de controle do FD separadamente e fazer duas decodificações para a operação da ULA, escolhendo qual usar baseado no tipo de instrução definida pelo opcode.

O diagrama abaixo, mostra essa implementação.

Implementação Com Três Decodificadores e MUX
Implementação Com Três Decodificadores e MUX

A Unidade de Controle da ULA é composta por dois decodificadores e pelo MUX que seleciona qual resultado da decodificação utilizar.

Para projetar essa unidade, vamos começar analisando os dois decodificadores.

Sinais de Controle da ULA

A unidade de controle da ULA é um circuito decodificador implementado com lógica combinacional. Como todo decodificador, ele converte os sinais de entrada (opcode e funct) em um código de saída (ULActrl).

Sinais de Saída dos Decodificadores

Para que essa conversão seja feita, necessitamos correlacionar todas as entradas e os resultados que elas geram na saída.

O sinal de saída, ULActrl, tem 3 pontos de controle, com as seguintes funções:

Isso pode ser visto, com detalhes, no circuito da ULA do RISCV, mostrado abaixo.

ULA RISC V
ULA RISC V


Para compatibilidade com o descrito no livro texto, utilizaremos a seguinte ordenação para os bits da palavra de controle da ULA:

A ordem dos sinais dentro da palavra de controle ULActrl
Bit Função
bit 2 InverteB
bit 1 bit 1 da seleção do MUX
bit 0 bit 0 da seleção do MUX

Sinais de Entrada

No caso dos sinais de entrada, temos dois conjuntos:

Para projetar o circuito da Unidade de Controle da ULA, precisamos definir qual operação deve ser executada para cada instrução.

Considerando somente as instruções do grupo A, temos as seguintes operações:

Operação da ULA para cada Instrução
Instrução Tipo Operação da ULA
AND R E lógico
OR R OU lógico
ADD R Soma
SUB R Subtração
SLT R Subtração
LW I Soma
SW S Soma
BEQ B Subtração

Definindo o Código do ULActrl

Inicialmente, precisamos definir o estado de cada bit do ULActrl para cada operação da ULA. O resultado será o conjunto dos sinais de saída da unidade de controle da ULA.

Considerando o nosso conjunto de instruções e a sequência de bits definida anteriormente (livro texto) e repetida abaixo, podemos resumir a codificação do ULActrl para as operações:

Preencher a tabela
Função ULActrl
AND
OR
ADD
SUB
SLT


Sequência de bits em ULActrl
Bit Função Observação
bit 2 InverteB Ativa o Carry In do bit 0
bit 1 bit 1 da seleção do MUX
bit 0 bit 0 da seleção do MUX

Solução:

A solução está na tabela e no esquema mostrados abaixo.

Solução
Função ULActrl
AND 000
OR 001
ADD 010
SUB 110
SLT 111



Decodificador do Opcode e Funct 3 para a Operação da ULA

Para projetar este decodificador, precisamos relacionar a entrada, dada pelo opcode e funct 3, com a saída, dada pelo ULActrl. Para tanto, utilizaremos a tabela abaixo para relacionar esses vetores de entrada com os respectivos vetores de saída.

Operação da ULA para Instrução do Tipo I
Instrução Operação da ULA opcode Funct 3 ULActrl
LW Soma
SW Soma
BEQ Subtração

Decodificador do Funct 7 e Funct 3 para a Operação da ULA

Para projetar este decodificador, precisamos relacionar a entrada, dada pelo funct 7 e funct 3, com a saída, dada pelo ULActrl. Para tanto, utilizaremos a tabela abaixo para relacionar esses vetores de entrada com os respectivos vetores de saída.

Operação da ULA para Instrução do Tipo R
Instrução Operação da ULA funct 7 funct 3 ULActrl
AND E lógico
OR OU lógico
ADD Soma
SUB Subtração
SLT Subtração

Criando o Circuito

De posse dessas duas tabelas, preenchidas, podemos tratar a relação entre cada bit de saída com as entradas como sendo uma tabela da verdade individual, o que evita erros de implementação.



Responder o quiz de participação, no blackboard, em:

Conteúdos > Participação > Aula_16_Quiz-P1

De acordo com o tipo de instrução, os bits do imediato estão distribuídos de forma diferente dentro da instrução.

Formato das Instruções RV32I
Formato das Instruções RV32I

Para reordenar esses bits e conseguir o imediato necessário para a execução, pode-se usar a concatenação em VHDL e MUXes para selecionar o resultado adequado à instrução sendo executada.

No caso das instruções do grupo A, precisaremos de MUXes de 4 entradas. Por isso, deixamos dois bits na palavra de controle para executar essa seleção.

Uma solução mais otimizada utilizaria MUXes de tamanhos diferentes, permitindo economizar hardware. Isso é interessante em implementações simples (pequenas) do RISC V.

A imagem abaixo mostra o mapeamento do tamanho desses MUXes.

Organização do Imediato das Instruções RV32I
Organização do Imediato das Instruções RV32I

Uma vez implementados e testados os decodificadores da ULA, vamos implementar a Unidade de Controle do Fluxo de Dados.

Da mesma forma que na implementação dos decodificadores da ULA, teremos que levantar todas entradas e saídas necessárias para este controlador.

Ele deve atuar em todos os pontos de controle do fluxo de dados.

Fluxo de Dados do RISC V
Fluxo de Dados do RISC V

Inicialmente, para entender o problema, devemos levantar a quantidade de pontos de controle do FD.

Em seguida, devemos analisar os efeitos da ativação e desativação de cada ponto de controle do FD e resumir em uma tabela.

O próximo passo é relacionar esses efeitos com o funcionamento de cada instrução (ou tipo de instrução) a ser executada.

Finalmente, chegamos à etapa mais emocionante: a construção da tabela relacionando as entradas e saídas desejadas. Para facilitar o trabalho, a leitura do Apêndice C do livro texto, em especial o ítem C2, será de grande valia.

De posse dessa tabela preenchida, podemos criar o código VHDL.

Palavra de Controle do Fluxo de Dados (FDctrl)

Inicialmente, precisamos definir o conteúdo da palavra de controle. O desenho do FD está na figura abaixo.

Fluxo de Dados do RISC V
Fluxo de Dados do RISC V

Para manter um padrão, utilizaremos os nomes já descritos no desenho. Liste, da esquerda (MSB) para a direita (LSB), todos os pontos de controle e os seus nomes. Esses serão os nossos sinais de saída.

Sinais de Entrada

Os sinais de entrada são os bits que definem a instrução a ser executada. Eles são:

Tabela

Para facilitar o trabalho, temos, abaixo, a tabela com as instruções e os pontos de controle. Basta preencher, para cada instrução, quais os pontos ativos.

Instruções e Pontos de Controle
Instrução opcode funct_3 MUX_Ger_Im Hab_Escr_Reg MUX_Rs2_Im Tipo_R MUX_ULA_MEM BEQ HabLerMEM HabEscrMEM
AND 0110011 111
OR 0110011 110
ADD 0110011 000
SUB 0110011 000
SLT 0110011 010
LW 0000011 010
SW 0100011 010
BEQ 1100111 000

Com a tabela preenchida, para todas as instruções, devemos levantar as equações para a ativação de cada ponto de controle. A forma mais simples é fazer a ativação do ponto de controle através da lógica OR entre as instruções que ativam esse ponto. Ou seja, na coluna de um ponto de controle, toda instrução que tiver o valor 1 preenchido, fará parte dessa lógica OR.


Responder o quiz de participação, no blackboard, em:

Conteúdos > Participação > Aula_16_Quiz-P2

De posse das equações, ou circuito, deve ser feita:

Na aba de Projetos, junto com a descrição do Projeto 2, temos os programas de teste que serão utilizados na avaliação do funcionamento do RISC V.

Esta atividade faz parte da entrega intermediária. Utilizem o horário de atendimento para avaliar o andamento e funcionamento do seu projeto.



Esta Atividade deverá ser entregue através do Blackboard!