Implemente uma memória de uma capacidade de 16 bit, valendo até 40 centavos, conforme a figura seguinte. Veja também a figura 5.44 do livro.
Estrurura de um chip de memória de
uma capacidade de 16 bit (N
=2, M
=4)
Dado de entrada para escrita (din
,
omitido na figura): SWI[3:0]
ativação de escrita (we
,
omitido na figura): SWI[4]
Address (adr
):
SWI[7:6]
Dataout (dout
): LED[3:0]
Para que o sintetizador infere memória em vez de usar flip-flop, use a seguinte formulação em Systemverilog, veja também código 5.6 do livro:
logic [M-1:0] mem[(1<<N)-1:0]; always_ff @(posedge clk) begin if (we) mem[adr] <= din; dout <= mem[adr]; end
Observe que serão usados registradores para os
barramentos adr
e
dout
Os
blocos de memória das nossas FPGA já vêm com estes registradores e
não tem como contornar eles.
A geometria do layout de uma memória costuma ser aproximadamente um quadrado, ou seja, a quantidade de linhas é igual à quantidade de colunas ou perto disso. Uma memória de 1 Gb por exemplo teria 32768 linhas e 32768 colunas. Outro exemplo poderia ser 65536 linhas e 16384 colunas, mas não existe por exemplo o caso de 16777216 linhas e 64 colunas. Em computadores tipo desktop, ainda a venda em algumas lojas, os chips de memória estão montadas em pentes inseridas em socketes na placa mãe. Cada chip pode estar fornecendo só 1 bit de dado, sendo que se encontram, por exemplo, 32 chips num pente para que se tenha uma palavra completa de 32 bit. A estrutura da memória de um chip desse, poderia ser como a figura a seguir.
Estrurura alternativa de um chip de memória de uma capacidade de 16 bit
Implemente uma memória RAM de uma capacidade de 16 bit em FPGA, valendo até 50 centavos, conforme a estrutura alternativa.
Dado de entrada para escrita (omitido na figura):
SW[0]
ativação de escrita (we, omitido na figura):
SW[1]
Address_C: SWI[5:4]
Address_R: SWI[7:6]
Data_out:
LED[0]
Implemente uma memória de uma capacidade de 256 bit, valendo até 70 centavos. Use SWI[7:4] tanto para Address_R como para Address_C. Um sinal de controle adicional, chamado RAS (SWI[2]) sinaliza que Address_R deve ser registrado na próxima subida do sinal de clock. Quando o sinal RAS estiver em ‘0’ no momento da subida de clock, deverá ser registrado Address_C.