Advertisement
kekellner

RAM.v

Nov 16th, 2024
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module RAM (
  2.     input clock,
  3.     input [7:0] address1,
  4.     input [7:0] address2,
  5.     input [7:0] regWrite,
  6.     input WE,
  7.     input Z,
  8.     input C,
  9.     input [7:0] PIND,
  10.     input [7:0] PINC,
  11.     input [7:0] PINB,
  12.     output [7:0] data1,
  13.     output [7:0] data2,
  14.     output [7:0] PORTD,
  15.     output [7:0] PORTC,
  16.     output [7:0] PORTB,
  17.     output Z_decode,
  18.     output C_decode
  19. );
  20.     // RAM completa (Incluye registros, I/O, espacio genérico)
  21.     reg [7:0] mem[0:255];
  22.  
  23.     /*
  24.      Las instrucciones IN, OUT, SBI, CBI se escriben utilizando direcciones
  25.      bajas, PERO realmente se mappean a direcciones más altas.
  26.  
  27.      Es decir, cuando utilizamos la instrucción IN tiene este opcode
  28.  
  29.      1000_0AAd_dddd_AAAA
  30.  
  31.      Las letras A hacen referencia a localidades desde la 0 hasta la 64, pero
  32.      realmente tenemos que sumarle 0x20 a la localidad indicada. Esto lo hacemos
  33.      mejor en el decoder
  34.     */
  35.  
  36.     // Read from RAM (ANY address)
  37.     assign data1 = mem[address1];
  38.     assign data2 = mem[address2];
  39.  
  40.     // Writing to RAM (ANY address)
  41.     always @(posedge clock) begin
  42.         if (WE) mem[address1] <= regWrite;
  43.     end
  44.  
  45.     /*
  46.      En el ATmega328p realmente sólo hay 3 sets de pines y estos se pueden
  47.      configurar como una ENTRADA o como una SALIDA. En nuestro caso vamos a
  48.      implementar 6 sets de pines en total: 3 sets de entrada y 3 sets de salida.
  49.  
  50.      Esto es para simplificar el funcionamiento.
  51.  */
  52.  
  53.     // Output ports
  54.     assign PORTB = mem[8'h25];
  55.     assign PORTC = mem[8'h28];
  56.     assign PORTD = mem[8'h2B];
  57.  
  58.     // Input ports
  59.     // Este bloque actualiza los registros de los puertos y el SREG
  60.     always @(PIND, PINC, PINB, Z, C) begin
  61.         mem[8'h29] <= PIND;
  62.         mem[8'h26] <= PINC;
  63.         mem[8'h23] <= PINB;
  64.         mem[8'h5F] <= {6'b0, Z, C};
  65.     end
  66.  
  67.     // SREG Output
  68.     assign Z_decode = mem[8'h5F][1];
  69.     assign C_decode = mem[8'h5F][0];
  70. endmodule
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement