Estoy intentando implementar un módulo de controlador SRAM. Está estructurado de la siguiente manera
Conexiones externas:
- extA [18: 0] - dirección
- extIO [7: 0] - entrada / salida bidireccional
- OE, WE, CE - señales de control
Conexiones internas:
- intA [17: 0] - dirección
- intIO [15: 0] - entrada / salida bidireccional
- EN, RDY, RW - control singals
Básicamente, estoy intentando implementar un módulo que divide intIO en dos extIOs secuenciales. Aquí hay un código que he encontrado hasta ahora:
module SRAM_Controller(clk,intA,intIOin,intIOout,extA,extIO,OE,WE,CE,rw,en,reset,rdy);
input clk, en, rw,reset,rdy;
input [17:0] intA;
input [15:0] intIOin;
output reg [15:0] intIOout;
output reg [18:0] extA;
inout [7:0] extIO;
output reg OE,WE,CE;
reg [7:0] Dout;
reg [15:0] Din;
reg counter = 1'b0;
assign extIO = (rdy && OE) ? Dout: 8'bz;
always @(posedge clk)
begin
if (reset) begin
//RESET?
end
else begin
if (en) begin
CE<=1'b0;
if(rdy) begin
extA[17:0]<=intA;
extA[18] <= counter;
case(rw)
1'b0: // WRITE
begin
case(counter)
1'b0: begin
WE<=1'b0;
OE<=1'b1;
Dout<=intIOin[7:0];
counter<=1'b1;
end
1'b1: begin
Dout<=intIOin[15:8];
counter<=1'b0;
end
endcase
end
1'b1: // READ
begin
case(counter)
1'b0:
begin
WE<=1'b1;
OE<=1'b0;
intIOout[7:0]=extIO;
counter<=1'b1;
end
1'b1:
begin
extA[18]<=1'b1;
intIOout[15:8]<=extIO;
counter<=1'b0;
end
endcase
end
endcase
end
end
else begin
CE<=1'b1;
end
end
end
endmodule
Y aquí hay un banco de pruebas para ello:
module SRAM_Controller_tb();
reg clk;
reg [17:0] intA;
wire [15:0] intIOin;
wire [15:0] intIOout;
wire [18:0] extA;
wire [7:0] extIO;
reg rw, en, reset,rdy;
wire OE, WE, CE;
reg [15:0] datout;
wire [15:0] datin;
SRAM_Controller DUT(.clk(clk),.intA(intA),.intIO(intIO),.extA(extA),
.extIO(extIO),.OE(OE),.WE(WE),.CE(CE),.rw(rw),.en(en),.reset(reset),.rdy(rdy));
assign datin = intIO;
assign intIOin = !rw ? datout: 16'bz;
initial begin
#1
clk = 0;
en = 1;
rdy = 1;
rw = 0;
intA = 18'b010010001100111001;
datout<= 16'hCA7E;
#4
intA = 18'b100001001000001111;
datout<= 16'h23F6;
#6
rdy = 0;
rw = 1;
intA = 18'b0;
#4
rdy =1;
#4
rdy = 0;
end
always begin
#1 clk = !clk;
end
endmodule
Esta es la simulación de ModelSim para ella:
Megustaríasabercómosolucionarestosproblemas:
laseñaldeextIOseretrasaconrespectoalaextAparaunciclodereloj(noestoysegurodequépartedemicódigocausademora)
lasseñalesextIOeintIOoutretienenlosbits"F6" de la transacción de escritura anterior.
Por favor, perdóname por cualquier error obvio en el código, es mi primera vez que uso Verilog.