Tengo un Spartan-6 FPGA conectado a la interfaz de memoria AEMIF en una SoC Da365 de DM365 que controlo. El AEMIF está configurado en el modo Seleccionar luz estroboscópica. Estoy tratando de implementar la lectura / escritura de memoria en el FPGA a través de esa interfaz, pero no está funcionando. El hardware funciona y esta funcionalidad ha estado funcionando antes de escribirse en VHDL (no escrito por mí). Soy nuevo en HDLs, así que quizás haya algo obviamente falso aquí.
Es difícil decir lo que realmente sucede, ya que el reloj es de 60MHz y mi analizador de alcance / lógica se esfuerza por ir tan rápido.
Editar: desde entonces he conseguido este trabajo. Establecer drive_data de forma combinatoria significa en la lectura, el valor de la memoria anterior se eliminó en el bus de datos, y luego la lógica secuencial recogería la nueva dirección y cambiaría los datos durante el ciclo.
module main(
input EM_A_3,
input EM_A_7,
input EM_CLK,
inout [15:0] EM_D,
input EM_nCE1,
input EM_nOE,
input EM_nWE
);
wire [1:0] em_addr;
/* temporary storage for emif "registers" */
reg [15:0] mem [0:3];
reg [15:0] em_outdata;
supply0 rst; // reset always 0 for now
wire drive_data;
initial
begin: FOO
integer i;
for (i = 0; i < 4; i = i + 1) begin
mem[i] = 8'b0;
end
em_outdata = 8'b1;
end
// drive EM_D when CE1, OE are low, and WE is high
assign drive_data = !EM_nCE1 && !EM_nOE && EM_nWE;
assign EM_D = drive_data ? em_outdata : 8'bz;
assign em_addr = {EM_A_7, EM_A_3};
// clocked version (not working yet)
always @ (posedge EM_CLK)
begin
if (!EM_nCE1 && !EM_nWE) begin
mem[em_addr] <= EM_D;
end
if (!EM_nCE1 && !EM_nOE && EM_nWE) begin
em_outdata <= mem[em_addr];
end
end
endmodule