controlador Verilog SRAM

1

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.

    
pregunta Lee Brown

0 respuestas

Lea otras preguntas en las etiquetas