Facebook
From Sharp Partdridge, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 57
  1. `include "defines.vh"
  2. module reg_file_interface_unit #(
  3.         parameter INSTR_WIDTH  = 16,   // instructions are 16 bits in width
  4.         parameter DATA_WIDTH   = 8,    // registers are 8 bits in width
  5.         parameter R_ADDR_WIDTH = 5     // 32 registers
  6.     )(
  7.         input  wire [`OPCODE_COUNT-1:0] opcode_type,
  8.         input  wire    [DATA_WIDTH-1:0] writeback_value,
  9.                   input  wire  [R_ADDR_WIDTH-1:0] opcode_rd,
  10.         input  wire  [R_ADDR_WIDTH-1:0] opcode_rr,
  11.         input  wire [`SIGNAL_COUNT-1:0] signals,
  12.         output wire  [R_ADDR_WIDTH-1:0] rr_addr,
  13.         output wire  [R_ADDR_WIDTH-1:0] rd_addr,
  14.         inout  wire    [DATA_WIDTH-1:0] rr_data,
  15.         inout  wire    [DATA_WIDTH-1:0] rd_data,
  16.         output wire                     rr_cs,
  17.         output wire                     rd_cs,
  18.         output wire                     rr_we,
  19.         output wire                     rd_we,
  20.         output wire                     rr_oe,
  21.         output wire                     rd_oe
  22.     );
  23.     /* Toate asignarile de mai jos presupun ca instructiunea
  24.      * curenta (instruction) este de tipul:
  25.      * [opcode] Rd Rr,
  26.      * caz in care va accesa de doua ori register file-ul:
  27.      * o data in starea de instruction decode/register fetch,
  28.      * pentru a citi valorile ambelor registre, si a doua oara
  29.      * in write-back, pentru a depune rezultatul (alu_out) in
  30.      * registrul Rd.
  31.      * Evident, nu toate instructiunile sunt de acest tip.
  32.      * In laburi ulterioare vom modifica aici.
  33.      */
  34.          
  35.          
  36.          /* TODO : Modificati flag-urile de lucru cu registrele generale astfel incat noile instructiuni sa se execute corect. */
  37.          wire [R_ADDR_WIDTH-1:0] internal_rr_addr;
  38.     wire [R_ADDR_WIDTH-1:0] internal_rd_addr;
  39.  
  40.         /* Internal */
  41.     assign internal_rd_addr =
  42.             signals[`CONTROL_REG_RD_READ] ?
  43.                 (opcode_type == `TYPE_LD_X || opcode_type == `TYPE_ST_X) ? `XL :
  44.                 (opcode_type == `TYPE_LD_Y || opcode_type == `TYPE_ST_Y) ? `YL :
  45.                 (opcode_type == `TYPE_LD_Z || opcode_type == `TYPE_ST_Z) ? `ZL :
  46.                 opcode_rd :
  47.             signals[`CONTROL_REG_RD_WRITE] ?
  48.                 opcode_rd :
  49.             {R_ADDR_WIDTH{1'bx}};
  50.     assign internal_rr_addr =
  51.             signals[`CONTROL_REG_RR_READ] ?
  52.                 (opcode_type == `TYPE_LD_X || opcode_type == `TYPE_ST_X) ? `XH :
  53.                 (opcode_type == `TYPE_LD_Y || opcode_type == `TYPE_ST_Y) ? `YH :
  54.                 (opcode_type == `TYPE_LD_Z || opcode_type == `TYPE_ST_Z) ? `ZH :
  55.                  opcode_rr :
  56.             {R_ADDR_WIDTH{1'bx}};
  57.  
  58.     assign rd_data = signals[`CONTROL_REG_RD_WRITE] ? writeback_value :
  59.                      {DATA_WIDTH{1'bz}};
  60.     assign rr_data = {DATA_WIDTH{1'bz}};
  61.     assign rd_we   = signals[`CONTROL_REG_RD_READ]  ? 1'b0 :
  62.                      signals[`CONTROL_REG_RD_WRITE] ? 1'b1 : 1'bx;
  63.     assign rr_we   = signals[`CONTROL_REG_RR_READ]  ? 1'b0 : 1'bx;
  64.     assign rd_oe   = signals[`CONTROL_REG_RD_READ]  ? 1'b1 : 1'bx;
  65.     assign rr_oe   = signals[`CONTROL_REG_RR_READ]  ? 1'b1 : 1'bx;
  66.     assign rd_cs   = signals[`CONTROL_REG_RD_READ] ||
  67.                      signals[`CONTROL_REG_RD_WRITE];
  68.     assign rr_cs   = signals[`CONTROL_REG_RR_READ];
  69.     assign rd_addr = (rd_cs) ? internal_rd_addr : {R_ADDR_WIDTH{1'bx}};
  70.     assign rr_addr = (rr_cs) ? internal_rr_addr : {R_ADDR_WIDTH{1'bx}};
  71.  
  72. endmodule
  73.