77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
/**
|
|
* EEPROM Component.
|
|
*
|
|
* This is basically a RAM component that persists its contents.
|
|
*
|
|
* We consider EEPROMs more 'expensive' than RAMs, so we arbitrarily limit
|
|
* the addressWith to a maximum of 10 bits (1024 addresses) with a default of 8-bit (256).
|
|
*
|
|
* In the EEPROM all addresses are initialized to zero.
|
|
* This way we serialize unused values as "0" instead of "null".
|
|
*
|
|
* These two techniques help keep reduce the size of saved projects.
|
|
*/
|
|
function EEPROM(x, y, scope = globalScope, dir = "RIGHT", bitWidth = 8, addressWidth = 8, data = null) {
|
|
RAM.call(this, x, y, scope, dir, bitWidth, addressWidth);
|
|
this.data = data || this.data;
|
|
}
|
|
EEPROM.prototype = Object.create(RAM.prototype);
|
|
EEPROM.prototype.tooltipText = "Electrically Erasable Programmable Read-Only Memory";
|
|
EEPROM.prototype.constructor = EEPROM;
|
|
EEPROM.prototype.shortName = "EEPROM";
|
|
EEPROM.prototype.maxAddressWidth = 10;
|
|
EEPROM.prototype.helplink = "https://docs.circuitverse.org/#/memoryElements?id=eeprom";
|
|
EEPROM.prototype.mutableProperties = {
|
|
"addressWidth": {
|
|
name: "Address Width",
|
|
type: "number",
|
|
max: "10",
|
|
min: "1",
|
|
func: "changeAddressWidth",
|
|
},
|
|
"dump": RAM.prototype.mutableProperties.dump,
|
|
"reset": RAM.prototype.mutableProperties.reset,
|
|
}
|
|
EEPROM.prototype.customSave = function () {
|
|
var saveInfo = RAM.prototype.customSave.call(this);
|
|
|
|
// Normalize this.data to use zeroes instead of null when serialized.
|
|
var data = this.data;
|
|
for (var i = 0; i < data.length; i++) {
|
|
data[i] = data[i] || 0;
|
|
}
|
|
|
|
saveInfo.constructorParamaters.push(data);
|
|
return saveInfo;
|
|
}
|
|
|
|
//This is a EERAM without a clock - not normal
|
|
//reset is supported
|
|
EEPROM.moduleVerilog = function () {
|
|
return `
|
|
module EEPROM(dout, addr, din, we, dmp, rst);
|
|
parameter WIDTH = 8;
|
|
parameter ADDR = 10;
|
|
output [WIDTH-1:0] dout;
|
|
input [ADDR-1:0] addr;
|
|
input [WIDTH-1:0] din;
|
|
input we;
|
|
input dmp;
|
|
input rst;
|
|
reg [WIDTH-1:0] mem[2**ADDR-1:0];
|
|
integer j;
|
|
|
|
assign dout = mem[addr];
|
|
|
|
always @ (*) begin
|
|
if (!rst)
|
|
for (j=0; j < 2**ADDR-1; j=j+1) begin
|
|
mem[j] = 0;
|
|
end
|
|
if (!we)
|
|
mem[addr] = din;
|
|
dout = mem[addr];
|
|
end
|
|
endmodule
|
|
`;
|
|
}
|