Dado um processador de 32 bits, mostrado a seguir, pede-se:
Que a memória esteja somente na faixa de endereços de 0 a 64KB-1.
Que a escrita na posição de memória 128K ative 8 Leds dependendo do conteúdo escrito. Não se esqueça de colocar um registrador.
Que a leitura da posição de memória 128K+1 obtenha o estado de 8 chaves. Utilize uma porta tristate com 8 entradas. Caso não conheça essa porta, faça uma pesquisa.
Mostre as alterações necessárias no Hardware (desenho).
A ligação da memória ao circuito do processador é uma conexão entre sinais de mesmo nome/significado.
Assim, teremos:
Barramentos de endereços do processador (A0 a A15) => Barramento de endereços da memória, A0 a A15.
Barramento de Escrita de Dados e Leitura de Dados (D0 a D31) => Memória nos respectivos barramentos (D0 a D31).
Sinal de leitura (RD), com 1 bit, conecta na entrada de habilitação de leitura da Memória.
Sinal de leitura (WR), com 1 bit, conecta na entrada de habilitação de escrita da Memória.
Barramentos de endereços do processador (A0 a A31) => Decodificador (A0 a A31).
A ligação da memória está mostrada a seguir.
Vamos adicionar o circuito para a escrita nos LEDs e a leitura das chaves.
Montado o circuito, projetaremos o decodificador.
Acessando a memória RAM.
Para que a memória esteja somente na faixa de endereços de 0 a 64KB-1, precisamos decodificar toda a faixa de endereços, ou seja:
Os 16 bits mais significativos (A16 ~ A31) são decodificados:
Os 16 bits menos significativos (A0 ~ A15) são decodificados:
O decodificador responsável pela ativação da memória será uma porta NOR com 16 bits de entrada. Os bits mais significativos do endereçamento (A16 ~ A31) são a entrada dessa porta NOR e o sinal habMEM é a sua saída.
Assim, quando todos bits de A16 ~ A31 forem nível baixo, a saída da NOR habilita a memória. Caso qualquer bit dessa faixa (A16 ~ A31) passar para nível alto, a memória será desabilitada. Isso significa que a sua saída passará para tristate (alta impedância de saída) e ela não fará nenhuma operação de escrita ou leitura.
A escrita na posição de memória 128K.
Para ligar ou desligar os LEDs, precisamos escrever no registrador adequado.
Para definir o endereço desse registrador, precisaremos decodificar os 32 bits do endereço. Para tanto, precisamos converter o endereço de decimal para binário e fazer decodificador para esse endereço.
O endereço é 131072 em decimal, que equivale a uma palavra de 32 bits com somente o bit 17 em nível alto.
Como o registrador só deve ser habilitado na escrita, adicionaremos o sinal WR. Podemos implementar esse decodificador com uma porta NOR de 33 bits.
A leitura da posição de memória 128K+1.
Para obter o endereço em binário da posição 128K+1 ativamos o bit 0 do endereço obtido no item anterior.
Da mesma forma, usamos uma porta NOR de 33 bits.
Com a mesma arquitetura do processador, mostrada na questão 1, projete um decodificador de endereços que permita:
Ou seja, a mesma memória de 64KB estará espelhada nas posições:
0 até 64KB-1;
256KB até 320KB-1;
512KB até 576KB-1;
E assim por diante.
Entre as posições 64K e 256K-1 não deve ocorrer acesso à memória. Isso, para todos os blocos de repetição.
O circuito é o usado no primeiro passo da solução anterior, o que mudará é o decodificador. Agora, o decodificador só tem a memória para habilitar.
O endereçamento dentro da memória usa os 16 bits LSB (A0 ~ A15).
A repetição do bloco deverá ser a cada 256K posições. O endereço binário possui somente o bit A18 em nível alto e todos outros em nível baixo.
Para o bloco aparecer na posição ZERO, os valores de A16 ~ A31 devem ter nível baixo.
A31 | A30 | A29 | A28 | A27 | A26 | A25 | A24 | A23 | A22 | A21 | A20 | A19 | A18 | A17 | A16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Para aparecer na posição 256K, o bit A18 deve estar em nível alto e os bits restantes (A16 ~ A17 e A19 ~ A31) devem estar em nível baixo.
A31 | A30 | A29 | A28 | A27 | A26 | A25 | A24 | A23 | A22 | A21 | A20 | A19 | A18 | A17 | A16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Para aparecer na posição 512K, o bit A19 deve estar em nível alto e os bits restantes (A16 ~ A17 e A19 ~ A31) devem estar em nível baixo.
A31 | A30 | A29 | A28 | A27 | A26 | A25 | A24 | A23 | A22 | A21 | A20 | A19 | A18 | A17 | A16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Para aparecer na posição 768K, os bits A19 e A18 devem ter nível alto e os bits restantes (A16 ~ A17 e A20 ~ A31) devem estar em nível baixo.
A31 | A30 | A29 | A28 | A27 | A26 | A25 | A24 | A23 | A22 | A21 | A20 | A19 | A18 | A17 | A16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
O processo continua até ocorrer todas a variações nos bits entre A18 e A31.
Percebe-se que os únicos bits de endereço que definem esse padrão são os bits A16 e A17, quando em nível baixo.
O decodificador pode ser implementado com uma porta NOR de 2 entradas.
Para melhorar o funcionamento da interface do usuário, de um projeto com um processador de 32 bits (MIPS), o seu grupo decidiu utilizar um LCD.
Ficou acordado que o LCD usará o endereço 0x8000_4001 e que você fará o decodificador.
Além disso, explique a necessidade das duas portas AND utilizadas no RD e WR.
O endereço do LCD é 0x8000_4001 que em binário é 0b1000.0000.0000.0000_0100.0000.0000.0001.
Para decodificar esse endereço temos um AND lógico entre dois conjuntos de bits:
Todas as ocorrências dos bits sendo ZERO:
E todas dos bits sendo UM:
Para a ocorrência dos bits ZERO, utilizamos uma porta NOR. Para a ocorrência dos bits UM, utilizamos uma porta AND.
habLCD = (NOR (b30 ~ b15, b13 ~ b1)) AND ( AND (b31, b14, b0))
Em relação às portas AND:
Se conectarmos o sinal de habLeituraMEM diretamente à ativação do buffer de leitura, ignorando se o endereço acessado é o do LCD:
Se conectarmos o sinal de habEscritaMEM diretamente à ativação do buffer de escrita, ignorando se o endereço acessado é o do LCD:
As portas AND fazem com que os sinais de habilitação só seja ativados se o endereço acessado é o do LCD.
O mapa de memória, mostrado abaixo, é de um processador com barramento de endereços de 16 bits e de dados com 8 bits.
Faça o decodificador de endereços para as três faixas de memória mostradas. O resultado poderá ser dado na forma da expressão booleana.
Exemplos de resposta:
External SRAM Motherboard = ( ( AND(A23 : A19) ) OR ( AND( NOT A14, NOT A12, NOT A0) ) ) NOR (A17, A5 )
E a atribuição final ao sinal de habilitação:
Sinal_A = AND(A23 : A19)
Sinal_B = AND( NOT A14, NOT A12, NOT A0)
External SRAM Motherboard = (Sinal_A OR Sinal_B) NOR (A17, A5 )
Observações:
Os parênteses auxiliam a leitura da equação.
A utilização de parcelas intermediárias facilita o projeto e a correção.
Além disso, esse fracionamento da equação simplifica a definição de blocos de memória que não são do tamanho 2^N.
Nesse caso, podemos trabalhar com blocos de tamanho 2^(N-1) e 2^(N-2) fazendo uma operação OR entre eles (soma de produtos).
ROM:
Início : 0x0000 - 0000 0000 0000 0000
Fim: 0x1FFF - 0001 1111 1111 1111
ROM = (not A15) and (not A14) and (not A13)
====
RAM:
Início : 0x2000 - 0010 0000 0000 0000
Fim: 0xDFFF - 1101 1111 1111 1111
RAM = 0x2XXX or 0x3XXX or 0x4XXX or …. or 0xCXXX or 0xDXXX
0x2XXX = (not A15) and (not A14) and (A13) and (not A12)
0x3XXX = (not A15) and (not A14) and (A13) and (A12)
0x4XXX = (not A15) and (A14) and (not A13) and (not A12)
0x5XXX = (not A15) and (A14) and (not A13) and (A12)
0x6XXX = (not A15) and (A14) and (A13) and (not A12)
0x7XXX = (not A15) and (A14) and (A13) and (A12)
0x8XXX = (A15) and (not A14) and (not A13) and (not A12)
0x9XXX = (A15) and (not A14) and (not A13) and (A12)
0xAXXX = (A15) and (not A14) and (A13) and (not A12)
0xBXXX = (A15) and (not A14) and (A13) and (A12)
0xCXXX = (A15) and (A14) and (not A13) and (not A12)
0xDXXX = (A15) and (A14) and (not A13) and (A12)
Minimizado:
RAM = (A15 and (not A13)) or ((not A14) and A13) or ((not A15) and A14)
===
I/O:
Início : 0xFC00 - 1111 1100 0000 0000
Fim: 0xFFFF - 1111 1111 1111 1111
I/O = (A15) and (A14) and (A13) and (A12) and (A11) and (A10)
===