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 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 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_edge_detect
75
    i_sync_mem_oe_n(
76
                    .async_sig(mem_oe_n),
77
                    .sync_out(sync_mem_oe_n),
78
                    .clk(wb_clk_i),
79
                    .rise(sync_mem_oe_n_rise),
80
                    .fall(sync_mem_oe_n_fall)
81
                  );
82
 
83
  sync
84
    i_sync_mem_cs_n(
85
            .async_sig(mem_cs_n),
86
            .sync_out(sync_mem_cs_n),
87
            .clk(wb_clk_i)
88
          );
89
 
90
  sync_edge_detect
91
    i_sync_mem_we_n(
92
                    .async_sig(mem_we_n),
93
                    .sync_out(sync_mem_we_n),
94
                    .clk(wb_clk_i),
95
                    .rise(sync_mem_we_n_rise),
96
                    .fall(sync_mem_we_n_fall)
97
                  );
98
 
99
 
100
// --------------------------------------------------------------------
101
//  state machine
102
  wb_async_mem_sm #( .DW(DW), .AW(AW) )
103
    i_wb_async_mem_sm
104
    (
105
      .wb_data_i(wb_data_i),
106
//       .wb_data_o(wb_data_o),
107
      .wb_addr_i(wb_addr_o),
108
//       .wb_sel_o(wb_sel_o),
109
      .wb_we_o(wb_we_o),
110
      .wb_cyc_o(wb_cyc_o),
111
      .wb_stb_o(wb_stb_o),
112
      .wb_ack_i(wb_ack_i),
113
      .wb_err_i(wb_err_i),
114
      .wb_rty_i(wb_rty_i),
115
 
116
      .mem_d(sync_mem_d),
117
      .mem_a(sync_mem_a),
118
      .mem_oe_n(sync_mem_oe_n),
119
      .mem_bls_n(sync_mem_bls_n),
120
      .mem_we_n(sync_mem_we_n),
121
      .mem_cs_n(sync_mem_cs_n),
122
 
123
      .mem_we_n_fall(sync_mem_we_n_fall),
124
      .mem_oe_n_fall(sync_mem_oe_n_fall),
125
 
126
      .wb_clk_i(wb_clk_i),
127
      .wb_rst_i(wb_rst_i)
128
    );
129
 
130
 
131
 
132
// --------------------------------------------------------------------
133
//  wb_data_i flop
134
  reg [(DW-1):0] wb_data_i_r;
135
 
136
  always @(posedge wb_clk_i)
137
    if(wb_ack_i)
138
      wb_data_i_r <= wb_data_i;
139
 
140
 
141
// --------------------------------------------------------------------
142
//  wb_data_o flop
143
  reg [(DW-1):0] wb_data_o_r;
144
 
145
  always @(posedge wb_clk_i)
146
    if(~sync_mem_we_n)
147
      wb_data_o_r <= sync_mem_d;
148
 
149
 
150
// --------------------------------------------------------------------
151
//  outputs
152
 
153
  assign mem_d = (~sync_mem_oe_n & ~sync_mem_cs_n ) ? wb_data_i_r : 'bz;
154
 
155
  assign wb_addr_o = sync_mem_a;
156
  assign wb_data_o = wb_data_o_r;
157
  assign wb_sel_o = ~sync_mem_bls_n;
158
 
159
 
160
endmodule
161
 

powered by: WebSVN 2.1.0

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