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

Subversion Repositories wb_async_mem_bridge

[/] [wb_async_mem_bridge/] [trunk/] [src/] [wb_async_mem_bridge.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 qaztronic
// --------------------------------------------------------------------
2
//
3
// --------------------------------------------------------------------
4
 
5
`include "timescale.v"
6
 
7
 
8
module
9
  wb_async_mem_bridge
10
  #(
11
    parameter DW = 32,
12
    parameter AW = 32
13
  )
14
  (
15
    input   [(DW-1):0]  wb_data_i,
16
    output  [(DW-1):0]  wb_data_o,
17
    output  [(AW-1):0]  wb_addr_o,
18
    output  [3:0]       wb_sel_o,
19
    output              wb_we_o,
20
    output              wb_cyc_o,
21
    output              wb_stb_o,
22
    input               wb_ack_i,
23
    input               wb_err_i,
24
    input               wb_rty_i,
25
 
26
    inout   [(DW-1):0]  mem_d,
27
    input   [(AW-1):0]  mem_a,
28
    input               mem_oe_n,
29
    input   [3:0]       mem_bls_n,
30
    input               mem_we_n,
31
    input               mem_cs_n,
32
 
33
    input               wb_clk_i,
34
    input               wb_rst_i
35
  );
36
 
37
 
38
// --------------------------------------------------------------------
39
//  sync data & bls
40
  wire [(DW-1):0] sync_mem_d;
41
  wire [(AW-1):0] sync_mem_a;
42
  wire [3:0] sync_mem_bls_n;
43
 
44
  genvar i;
45
 
46
  generate
47
    for( i = 0; i < DW; i = i + 1 )
48
      begin: sync_data_loop
49
        sync i_sync( .async_sig(mem_d[i]), .sync_out(sync_mem_d[i]), .clk(wb_clk_i) );
50
      end
51
  endgenerate
52
 
53
  generate
54
    for( i = 0; i < AW; i = i + 1 )
55
      begin: sync_addr_loop
56
        sync i_sync( .async_sig(mem_a[i]), .sync_out(sync_mem_a[i]), .clk(wb_clk_i) );
57
      end
58
  endgenerate
59
 
60
  generate
61
    for( i = 0; i < 4; i = i + 1 )
62
      begin: sync_bls_loop
63
        sync i_sync( .async_sig(mem_bls_n[i]), .sync_out(sync_mem_bls_n[i]), .clk(wb_clk_i) );
64
      end
65
  endgenerate
66
 
67
 
68
// --------------------------------------------------------------------
69
//  sync mem_cs_n & mem_oe_n & mem_we_n
70
  wire sync_mem_oe_n, sync_mem_oe_n_rise, sync_mem_oe_n_fall;
71
  wire sync_mem_cs_n;
72
  wire sync_mem_we_n, sync_mem_we_n_rise, sync_mem_we_n_fall;
73
 
74
  sync
75
    (
76
            .async_sig(),
77
            .sync_out(),
78
            .clk(wb_clk_i)
79
          );
80
 
81
  sync_edge_detect
82
    i_sync_mem_oe_n(
83
                    .async_sig(mem_oe_n),
84
                    .sync_out(sync_mem_oe_n),
85
                    .clk(wb_clk_i),
86
                    .rise(sync_mem_oe_n_rise),
87
                    .fall(sync_mem_oe_n_fall)
88
                  );
89
 
90
  sync
91
    i_sync_mem_cs_n(
92
            .async_sig(mem_cs_n),
93
            .sync_out(sync_mem_cs_n),
94
            .clk(wb_clk_i)
95
          );
96
 
97
  sync_edge_detect
98
    i_sync_mem_we_n(
99
                    .async_sig(mem_we_n),
100
                    .sync_out(sync_mem_we_n),
101
                    .clk(wb_clk_i),
102
                    .rise(sync_mem_we_n_rise),
103
                    .fall(sync_mem_we_n_fall)
104
                  );
105
 
106
 
107
// --------------------------------------------------------------------
108
//  state machine
109
  wb_async_mem_sm #( .DW(DW), .AW(AW) )
110
    i_wb_async_mem_sm
111
    (
112
      .wb_data_i(wb_data_i),
113
//       .wb_data_o(wb_data_o),
114
      .wb_addr_i(wb_addr_o),
115
//       .wb_sel_o(wb_sel_o),
116
      .wb_we_o(wb_we_o),
117
      .wb_cyc_o(wb_cyc_o),
118
      .wb_stb_o(wb_stb_o),
119
      .wb_ack_i(wb_ack_i),
120
      .wb_err_i(wb_err_i),
121
      .wb_rty_i(wb_rty_i),
122
 
123
      .mem_d(sync_mem_d),
124
      .mem_a(sync_mem_a),
125
      .mem_oe_n(sync_mem_oe_n),
126
      .mem_bls_n(sync_mem_bls_n),
127
      .mem_we_n(sync_mem_we_n),
128
      .mem_cs_n(sync_mem_cs_n),
129
 
130
      .mem_we_n_fall(sync_mem_we_n_fall),
131
      .mem_oe_n_fall(sync_mem_oe_n_fall),
132
 
133
      .wb_clk_i(wb_clk_i),
134
      .wb_rst_i(wb_rst_i)
135
    );
136
 
137
 
138
 
139
// --------------------------------------------------------------------
140
//  wb_data_i flop
141
  reg [(DW-1):0] wb_data_i_r;
142
 
143
  always @(posedge wb_clk_i)
144
    if(wb_ack_i)
145
      wb_data_i_r <= wb_data_i;
146
 
147
 
148
// --------------------------------------------------------------------
149
//  wb_data_o flop
150
  reg [(DW-1):0] wb_data_o_r;
151
 
152
  always @(posedge wb_clk_i)
153
    if(~sync_mem_we_n)
154
      wb_data_o_r <= sync_mem_d;
155
 
156
 
157
// --------------------------------------------------------------------
158
//  outputs
159
 
160
  assign mem_d = (~sync_mem_oe_n & ~sync_mem_cs_n ) ? wb_data_i_r : 'bz;
161
 
162
  assign wb_addr_o = sync_mem_a;
163
  assign wb_data_o = wb_data_o_r;
164
  assign wb_sel_o = ~sync_mem_bls_n;
165
 
166
 
167
endmodule
168
 

powered by: WebSVN 2.1.0

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