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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [gleichmann/] [miscellaneous/] [ahb2wb.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
//                              -*- Mode: Verilog -*-
2
// Filename        : ahb2wb.v
3
// Description     : this module makes up the interface between the AMBA
4
//                   AHB slave and the Wishbone slave
5
// Author          : Thomas Ameseder
6
// Created On      : Mon Mar 01 13:55:59 2004
7
//
8
// CVS entries:
9
//   $Author: tame $
10
//   $Date: 2006/08/14 15:25:09 $
11
//   $Revision: 1.1 $
12
//   $State: Exp $
13
 
14
 
15
 
16
// synopsys translate_off
17
//`include "mc_defines.v"
18
// synopsys translate_on
19
 
20
// synopsys translate_off
21
`timescale 1ns/10ps
22
// synopsys translate_on
23
 
24
// AHB responses
25
`define HRESP_OK    2'b00
26
`define HRESP_ERROR 2'b01
27
`define HRESP_RETRY 2'b10
28
`define HRESP_SPLIT 2'b11               // unused
29
`define HRESP_UNDEF 2'bxx
30
 
31
 
32
 
33
module ahb2wb
34
  // AMBA interface
35
  (hclk, hresetn, hsel, hready_ba, haddr, hwrite, htrans, hsize, hburst,
36
   hwdata, hmaster, hmastlock, hready, hresp, hrdata, hsplit,
37
 
38
  // Wishbone interface
39
   wb_inta_i, wbm_adr_o, wbm_dat_o, wbm_sel_o, wbm_we_o,
40
   wbm_stb_o, wbm_cyc_o, wbm_dat_i, wbm_ack_i, wbm_rty_i, wbm_err_i,
41
 
42
  // miscellaneous signals
43
   irq_o
44
  );
45
 
46
 
47
   parameter HAMAX = 8;
48
   parameter HDMAX = 8;
49
 
50
   // AHB state machine
51
   parameter [1:0 ] IDLE = 2'b 00,
52
                    SELECTED = 2'b 01,
53
                    RESP_1 = 2'b 10,
54
                    RESP_2 = 2'b 11;
55
 
56
 
57
   input              hclk,
58
                      hresetn;
59
   input              hsel,
60
                      hready_ba,
61
                      hwrite,
62
                      hmastlock;          // unused
63
   input [HAMAX-1:0]  haddr;
64
   input [1:0]        htrans;             // unused
65
   input [2:0]        hsize,
66
                      hburst;             // unused
67
   input [HDMAX-1:0]  hwdata;
68
   input [3:0]        hmaster;            // unused
69
   input              wb_inta_i,
70
                      wbm_ack_i,
71
                      wbm_rty_i,
72
                      wbm_err_i;
73
   input [HDMAX-1:0]  wbm_dat_i;
74
 
75
   output             hready;
76
   output [1:0]       hresp;
77
   output [HDMAX-1:0] hrdata;
78
   output [15:0]      hsplit;
79
 
80
   output             wbm_we_o,
81
                      wbm_stb_o,
82
                      wbm_cyc_o;
83
   output [HAMAX-1:0] wbm_adr_o;
84
   output [HDMAX-1:0] wbm_dat_o;
85
   output [3:0]       wbm_sel_o;
86
 
87
   output             irq_o;
88
 
89
   reg                wbm_stb_o, wbm_we_o, irq_o;
90
   reg [3:0]          wbm_sel_o;
91
   reg                hready;
92
   reg [1:0]          hresp;
93
   reg [HDMAX-1:0]    hrdata;
94
   reg [15:0]         hsplit;
95
   reg [HAMAX-1:0]    wbm_adr_o;
96
   reg                wbm_cyc_o;
97
   reg [HDMAX-1:0]    wbm_dat_o;
98
 
99
 
100
   /****  MODULE BODY  ****/
101
 
102
   // local signals
103
   wire               wb_stb_start_next, wb_stb_end_next, wb_cyc_next;
104
 
105
   reg                hready_s;
106
   reg [1:0]          hresp_s;
107
   reg [HDMAX-1:0]    hrdata_s;
108
   reg [15:0]         hsplit_s;
109
   reg [1:0]          state, next_state;
110
 
111
 
112
   assign             wb_stb_start_next =  hready_ba & hsel;
113
   assign             wb_stb_end_next =  wbm_ack_i  | wbm_err_i | wbm_rty_i;
114
   assign             wb_cyc_next =  hready_ba;
115
 
116
 
117
   /*  model wishbone output signals  */
118
   always @ (posedge hclk or negedge hresetn) begin
119
      if (!hresetn) begin
120
         wbm_we_o <= #1 1'b  0;
121
         wbm_sel_o <= #1 4'h 0;
122
         wbm_cyc_o <= #1 0;
123
         wbm_stb_o <= #1 0;
124
         wbm_adr_o <= #1 0;
125
         wbm_dat_o <= #1 0;
126
      end else begin
127
 
128
         // wishbone cycle must not be shorter than strobe signal
129
         if (wb_cyc_next)
130
           wbm_cyc_o <= #1 1;
131
         else if (!wb_cyc_next & wbm_stb_o & !wb_stb_end_next)
132
           wbm_cyc_o <= #1 1;
133
         else
134
           wbm_cyc_o <= #1 0;
135
 
136
         // strobe has to be high until slave
137
         // acknowledges or signals an error
138
         if (wb_stb_end_next) begin
139
            wbm_stb_o <= #1 0;
140
            wbm_we_o <= #1 1'h  0;
141
         end else if (wb_stb_start_next) begin
142
            wbm_dat_o <= #1 hwdata;
143
            wbm_adr_o <= #1 haddr;
144
            wbm_stb_o <= #1 1;
145
            wbm_we_o  <= #1 hwrite;
146
            case (hsize)
147
              0: wbm_sel_o <= #1 4'h 1;
148
              1: wbm_sel_o <= #1 4'h 3;
149
              2: wbm_sel_o <= #1 4'h f;
150
              default: wbm_sel_o <= #1 4'h x;
151
            endcase
152
         end else if (!wbm_cyc_o) begin // propagate address, data
153
            wbm_dat_o <= #1 hwdata;     // and write signals
154
            wbm_adr_o <= #1 haddr;
155
            wbm_we_o  <= #1 hwrite;
156
         end
157
      end
158
   end // always @ (posedge hclk or negedge hresetn)
159
 
160
 
161
   /*  model ahb response signals  */
162
   always @ ( /*`HRESP_ERROR or `HRESP_OK or `HRESP_RETRY
163
             or `HRESP_UNDEF or */ hresp or state or wb_cyc_next
164
             or wb_stb_start_next or wbm_ack_i or wbm_dat_i
165
             or wbm_err_i or wbm_rty_i) begin
166
 
167
      // defaults to avoid latches
168
      hsplit_s = 16'b 0; // no split transactions
169
      hready_s = 1;
170
      hresp_s = `HRESP_OK;
171
      hrdata_s = 8'b 0;
172
      next_state = IDLE;
173
 
174
      case (state)
175
        IDLE: begin
176
           if (wb_stb_start_next) begin
177
              next_state = SELECTED;
178
              hready_s = 0;
179
           end
180
        end
181
        SELECTED: begin
182
           hready_s = 0;
183
           next_state = SELECTED;
184
           if (wbm_err_i) begin
185
              hresp_s = `HRESP_ERROR;
186
              hready_s = 0;
187
              next_state = RESP_1;
188
           end else if (wbm_rty_i) begin
189
              hresp_s = `HRESP_RETRY;
190
              hready_s = 0;
191
              next_state = RESP_1;
192
           end else if (wbm_ack_i) begin
193
              hresp_s = `HRESP_OK;
194
              hready_s = 1;
195
              hrdata_s = wbm_dat_i;
196
              next_state = RESP_2;
197
           end
198
        end
199
        RESP_1: begin              // for two-cycle error or retry responses
200
           hready_s = 1;
201
           hresp_s = hresp;        // keep previous response
202
           if (wb_cyc_next)        // only change state when ahb arbiter is ready to sample
203
             next_state = RESP_2;
204
           else begin
205
              next_state = RESP_1;
206
              hready_s = 0;
207
           end
208
        end
209
        RESP_2: begin
210
           hready_s = 1;
211
           if (wb_cyc_next) begin  // only change state when ahb arbiter is ready to sample
212
              hresp_s = `HRESP_OK;
213
              hready_s = 1;
214
              next_state = IDLE;
215
           end else begin
216
              next_state = RESP_2;
217
              hresp_s = hresp;     // keep previous response
218
           end
219
        end
220
        default: begin             // for simulation purposes
221
           next_state = IDLE;
222
           hready_s = 1'b x;
223
           hresp_s = `HRESP_UNDEF;
224
           hrdata_s = 8'b x;
225
           hsplit_s = 16'b 0;
226
        end
227
      endcase // case(state)
228
   end // always @ (...
229
 
230
 
231
   // change state, propagate interrupt
232
   always @ (posedge hclk or negedge hresetn) begin
233
      if (!hresetn) begin
234
         state  <= #1 IDLE;
235
         hresp  <= #1 `HRESP_UNDEF;
236
         hrdata <= #1  8'b x;
237
         hsplit <= #1 16'b 0;
238
         hready <= #1 1'b 1;
239
         irq_o  <= #1 1'b 0;
240
      end else begin
241
         state  <= #1 next_state;
242
         hresp  <= #1 hresp_s;
243
         hrdata <= #1 hrdata_s;
244
         hsplit <= #1 hsplit_s;
245
         hready <= #1 hready_s;
246
         irq_o  <= #1  wb_inta_i;
247
      end
248
   end
249
 
250
 
251
endmodule // ahb2wb
252
 
253
 
254
 

powered by: WebSVN 2.1.0

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