OpenCores
URL https://opencores.org/ocsvn/zet86/zet86/trunk

Subversion Repositories zet86

[/] [zet86/] [tags/] [INITIAL/] [rtl-model/] [regfile.v] - Blame information for rev 49

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 zeus
`timescale 1ns/10ps
2
 
3
module regfile(a, b, c, cs, ip, d, s, flags, wr, wrfl, wrhi, clk, rst,
4
               addr_a, addr_b, addr_c, addr_d, addr_s, iflags, word_op,
5
               o_byte, c_byte, cx_zero);
6
  // IO Ports
7
  output [15:0] a, b, c, s;
8
  output [15:0] cs;
9
  input  [3:0]  addr_a, addr_b, addr_c, addr_d;
10
  input  [1:0]  addr_s;
11
  input  [8:0]  iflags;
12
  input  [31:0] d;
13
  input         wrfl, wrhi, word_op, clk, rst, o_byte, c_byte;
14
  input         wr;
15
  output        cx_zero;
16
  output [15:0] ip;
17
  output reg [8:0] flags;
18
 
19
  // Net declarations
20
  reg [15:0] r[15:0];
21
  wire [7:0] a8, b8, c8;
22
 
23
  // Assignments
24
  assign a = (o_byte & ~addr_a[3]) ? { {8{a8[7]}}, a8} : r[addr_a];
25
  assign a8 = addr_a[2] ? r[addr_a[1:0]][15:8] : r[addr_a][7:0];
26
 
27
  assign b = (o_byte & ~addr_b[3]) ? { {8{b8[7]}}, b8} : r[addr_b];
28
  assign b8 = addr_b[2] ? r[addr_b[1:0]][15:8] : r[addr_b][7:0];
29
 
30
  assign c = (c_byte & ~addr_c[3]) ? { {8{c8[7]}}, c8} : r[addr_c];
31
  assign c8 = addr_c[2] ? r[addr_c[1:0]][15:8] : r[addr_c][7:0];
32
 
33
  assign s = r[{2'b10,addr_s}];
34
 
35
  assign cs = r[9];
36
  assign cx_zero = (addr_d==4'd1) ? (d==16'd0) : (r[1]==16'd0);
37
 
38
  assign ip = r[15];
39
 
40
  // Behaviour
41
  always @(posedge clk)
42
    if (rst) begin
43
      r[0]  <= 16'd0; r[1]  <= 16'd0;
44
      r[2]  <= 16'd0; r[3]  <= 16'd0;
45
      r[4]  <= 16'd0; r[5]  <= 16'd0;
46
      r[6]  <= 16'd0; r[7]  <= 16'd0;
47
      r[8]  <= 16'd0; r[9]  <= 16'hf000;
48
      r[10] <= 16'd0; r[11] <= 16'd0;
49
      r[12] <= 16'd0; r[13] <= 16'd0;
50
      r[14] <= 16'd0; r[15] <= 16'hfff0;
51
      flags <= 9'd0;
52
    end else
53
      begin
54
        if (wr) begin
55
          if (word_op | addr_d[3:2]==2'b10)
56
             r[addr_d] <= word_op ? d[15:0] : {{8{d[7]}},d[7:0]};
57
          else if (addr_d[3]~^addr_d[2]) r[addr_d][7:0] <= d[7:0];
58
          else r[{2'b0,addr_d[1:0]}][15:8] <= d[7:0];
59
        end
60
        if (wrfl) flags <= iflags;
61
        if (wrhi) r[4'd2] <= d[31:16];
62
      end
63
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.