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

Subversion Repositories i2c_to_wb

[/] [i2c_to_wb/] [trunk/] [sim/] [models/] [wb_slave_model.v] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 qaztronic
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// Copyright (C) 2009 Authors and OPENCORES.ORG                 ////
4
////                                                              ////
5
//// This source file may be used and distributed without         ////
6
//// restriction provided that this copyright statement is not    ////
7
//// removed from the file and that any derivative work contains  ////
8
//// the original copyright notice and the associated disclaimer. ////
9
////                                                              ////
10
//// This source file is free software; you can redistribute it   ////
11
//// and/or modify it under the terms of the GNU Lesser General   ////
12
//// Public License as published by the Free Software Foundation; ////
13
//// either version 2.1 of the License, or (at your option) any   ////
14
//// later version.                                               ////
15
////                                                              ////
16
//// This source is distributed in the hope that it will be       ////
17
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
18
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
19
//// PURPOSE.  See the GNU Lesser General Public License for more ////
20
//// details.                                                     ////
21
////                                                              ////
22
//// You should have received a copy of the GNU Lesser General    ////
23
//// Public License along with this source; if not, download it   ////
24
//// from http://www.opencores.org/lgpl.shtml                     ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27 2 qaztronic
 
28
`timescale 1ns/10ps
29
 
30
 
31
module wb_slave_model(  clk_i, rst_i, dat_o, dat_i, adr_i,
32
                        cyc_i, stb_i, we_i, sel_i,
33
                        ack_o, err_o, rty_o );
34
 
35
  parameter DWIDTH    = 8;
36
  parameter AWIDTH    = 8;
37
  parameter ACK_DELAY = 2;
38
  parameter SLAVE_RAM_INIT = "wb_slave_model.txt";
39
 
40
  input                         clk_i;
41
  input                         rst_i;
42
  output [DWIDTH-1:0]           dat_o;
43
  input  [DWIDTH-1:0]           dat_i;
44
  input  [AWIDTH-1:0]           adr_i;
45
  input                         cyc_i;
46
  input                         stb_i;
47
  input                         we_i;
48
  input  [( (DWIDTH/8) - 1 ):0] sel_i;
49
  output                        ack_o;
50
  output                        err_o;
51
  output                        rty_o;
52
 
53
 
54
 
55
 
56
 
57
  // --------------------------------------------------------------------
58
  //  slave ram
59
  reg [7:0] ram[2**AWIDTH-1:0];
60
 
61
  initial
62
    $readmemh( SLAVE_RAM_INIT, ram );
63
 
64
  // --------------------------------------------------------------------
65
  //  
66
  generate
67
    case( DWIDTH )
68
      8:        begin
69
                  initial
70
                    $display( "###- wb_slave_model(): WISHBONE 8 BIT SLAVE MODEL INSTANTIATED " );
71
 
72
                  always @ (posedge clk_i)
73
                    if (we_i & cyc_i & stb_i & sel_i[0])
74
                      ram[adr_i] <= dat_i[7:0];
75
 
76
                  assign dat_o = ram[adr_i];
77
 
78
                end
79
 
80
      16:       begin
81
                  initial
82
                    $display( "###- wb_slave_model(): WISHBONE 16 BIT SLAVE MODEL INSTANTIATED " );
83
 
84
                  always @ (posedge clk_i)
85
                    if (we_i & cyc_i & stb_i & sel_i[0])
86
                      ram[{adr_i[AWIDTH-1:1], 1'b0}] <= dat_i[7:0];
87
 
88
                  always @ (posedge clk_i)
89
                    if (we_i & cyc_i & stb_i & sel_i[1])
90
                      ram[{adr_i[AWIDTH-1:1], 1'b1}] <= dat_i[15:8];
91
 
92
                  assign dat_o = { ram[{adr_i[AWIDTH-1:1], 1'b1}], ram[{adr_i[AWIDTH-1:1], 1'b0}] };
93
 
94
                end
95
 
96
      32:       begin
97
                  initial
98
                    $display( "###- wb_slave_model(): WISHBONE 32 BIT SLAVE MODEL INSTANTIATED " );
99
 
100
                  always @ (posedge clk_i)
101
                    if (we_i & cyc_i & stb_i & sel_i[0])
102
                      ram[{adr_i[AWIDTH-1:2], 2'b00}] <= dat_i[7:0];
103
 
104
                  always @ (posedge clk_i)
105
                    if (we_i & cyc_i & stb_i & sel_i[1])
106
                      ram[{adr_i[AWIDTH-1:2], 2'b01}] <= dat_i[15:8];
107
 
108
                  always @ (posedge clk_i)
109
                    if (we_i & cyc_i & stb_i & sel_i[2])
110
                      ram[{adr_i[AWIDTH-1:2], 2'b10}] <= dat_i[23:16];
111
 
112
                  always @ (posedge clk_i)
113
                    if (we_i & cyc_i & stb_i & sel_i[3])
114
                      ram[{adr_i[AWIDTH-1:2], 2'b11}] <= dat_i[31:24];
115
 
116
                  assign dat_o = { ram[{adr_i[AWIDTH-1:2], 2'b11}], ram[{adr_i[AWIDTH-1:2], 2'b10}], ram[{adr_i[AWIDTH-1:2], 2'b01}], ram[{adr_i[AWIDTH-1:2], 2'b00}] };
117
 
118
                end
119
 
120
      default:  begin
121
                  localparam SLAVE_SIZE = -1;
122
                  initial
123
                    begin
124
                      $display( "!!!- wb_slave_model(): invalad DWIDTH parameter" );
125
                      $stop();
126
                    end
127
                end
128
    endcase
129
  endgenerate
130
 
131
 
132
  // --------------------------------------------------------------------
133
  //  ack delay
134
  reg ack_delayed;
135
 
136
  initial
137
    ack_delayed = 1'b0;
138
 
139
  always @(posedge clk_i or cyc_i or stb_i)
140
    begin
141
      if(cyc_i & stb_i)
142
        begin
143
          ack_delayed = 1'b0;
144
          repeat(ACK_DELAY) @(posedge clk_i);
145
          if(cyc_i & stb_i)
146
            ack_delayed = 1'b1;
147
          else
148
            ack_delayed = 1'b0;
149
        end
150
      else
151
        ack_delayed = 1'b0;
152
    end
153
 
154
  // --------------------------------------------------------------------
155
  //  assign outputs  
156
  assign ack_o = ack_delayed;
157
  assign err_o = 1'b0;
158
  assign rty_o = 1'b0;
159
 
160
 
161 5 qaztronic
endmodule

powered by: WebSVN 2.1.0

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