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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [orpsocv2/] [boards/] [actel/] [ordb1a3pe1500/] [rtl/] [verilog/] [versatile_mem_ctrl/] [rtl/] [verilog/] [versatile_mem_ctrl_wb.v] - Blame information for rev 408

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 408 julius
`timescale 1ns/1ns
2
module versatile_mem_ctrl_wb
3
  (
4
   // wishbone side
5
   wb_adr_i_v, wb_dat_i_v, wb_dat_o_v,
6
   wb_stb_i, wb_cyc_i, wb_ack_o,
7
   wb_clk, wb_rst,
8
    // SDRAM controller interface
9
   sdram_dat_o, sdram_fifo_empty, sdram_fifo_rd_adr, sdram_fifo_rd_data, sdram_fifo_re,
10
   sdram_dat_i, sdram_fifo_wr, sdram_fifo_we, sdram_burst_reading,
11
   debug_wb_fsm_state, debug_ingress_fifo_empty, debug_egress_fifo_empty,
12
   sdram_clk, sdram_rst
13
 
14
);
15
 
16
parameter nr_of_wb_ports = 3;
17
 
18
input  [36*nr_of_wb_ports-1:0]  wb_adr_i_v;
19
input  [36*nr_of_wb_ports-1:0]  wb_dat_i_v;
20
input  [0:nr_of_wb_ports-1]     wb_stb_i;
21
input  [0:nr_of_wb_ports-1]     wb_cyc_i;
22
output [32*nr_of_wb_ports-1:0]  wb_dat_o_v;
23
output [0:nr_of_wb_ports-1]     wb_ack_o;
24
input                           wb_clk;
25
input                           wb_rst;
26
 
27
output [35:0]               sdram_dat_o;
28
output [0:nr_of_wb_ports-1] sdram_fifo_empty;
29
input                       sdram_fifo_rd_adr, sdram_fifo_rd_data;
30
input  [0:nr_of_wb_ports-1] sdram_fifo_re;
31
input  [31:0]               sdram_dat_i;
32
input                       sdram_fifo_wr;
33
input  [0:nr_of_wb_ports-1] sdram_fifo_we;
34
input                       sdram_burst_reading;
35
input                       sdram_clk;
36
input                       sdram_rst;
37
 
38
   output [(2*nr_of_wb_ports)-1:0] debug_wb_fsm_state;
39
   output [nr_of_wb_ports-1:0]   debug_ingress_fifo_empty;
40
   output [nr_of_wb_ports-1:0]   debug_egress_fifo_empty;
41
 
42
 
43
 
44
parameter linear       = 2'b00;
45
parameter wrap4        = 2'b01;
46
parameter wrap8        = 2'b10;
47
parameter wrap16       = 2'b11;
48
parameter classic      = 3'b000;
49
parameter endofburst   = 3'b111;
50
 
51
`define CTI_I 2:0
52
`define BTE_I 4:3
53
`define WE_I  5
54
 
55
parameter idle = 2'b00;
56
parameter rd   = 2'b01;
57
parameter wr   = 2'b10;
58
parameter fe   = 2'b11;
59
 
60
reg [1:0] wb_state[0:nr_of_wb_ports-1];
61
 
62
wire [35:0] wb_adr_i[0:nr_of_wb_ports-1];
63
wire [35:0] wb_dat_i[0:nr_of_wb_ports-1];
64
wire [36*nr_of_wb_ports-1:0] egress_fifo_di;
65
wire [31:0] wb_dat_o;
66
 
67
wire [0:nr_of_wb_ports] stall;
68
wire [0:nr_of_wb_ports-1] state_idle;
69
wire [0:nr_of_wb_ports-1] egress_fifo_we,  egress_fifo_full;
70
wire [0:nr_of_wb_ports-1] ingress_fifo_re, ingress_fifo_empty;
71
 
72
   wire [1:0]              debug_each_wb_fsm_state [0:nr_of_wb_ports-1];
73
 
74
 
75
genvar i;
76
 
77
assign stall[0] = 1'b0;
78
 
79
`define INDEX (nr_of_wb_ports-i)*36-1:(nr_of_wb_ports-1-i)*36
80
generate
81
    for (i=0;i<nr_of_wb_ports;i=i+1) begin : vector2array
82
        assign wb_adr_i[i] = wb_adr_i_v[`INDEX];
83
        assign wb_dat_i[i] = wb_dat_i_v[`INDEX];
84
        assign egress_fifo_di[`INDEX] = (state_idle[i]) ?
85
                                        wb_adr_i[i] : wb_dat_i[i];
86
 
87
    end
88
endgenerate
89
 
90
   // Debug output assignments
91
   generate
92
      for (i=0;i<nr_of_wb_ports;i=i+1) begin : vector2debugarray
93
         assign debug_wb_fsm_state[(nr_of_wb_ports-i)*2-1:(nr_of_wb_ports-1-i)*2] = debug_each_wb_fsm_state[i];
94
      end
95
   endgenerate
96
   assign debug_ingress_fifo_empty = ingress_fifo_empty;
97
   assign debug_egress_fifo_empty = egress_fifo_we;
98
 
99
 
100
generate
101
    for (i=0;i<nr_of_wb_ports;i=i+1) begin : fsm
102
        fsm_wb fsm_wb_i
103
          (
104
           .stall_i(stall[i]),
105
           .stall_o(stall[i+1]),
106
           .we_i (wb_adr_i[i][`WE_I]),
107
           .cti_i(wb_adr_i[i][`CTI_I]),
108
           .bte_i(wb_adr_i[i][`BTE_I]),
109
           .stb_i(wb_stb_i[i]),
110
           .cyc_i(wb_cyc_i[i]),
111
           .ack_o(wb_ack_o[i]),
112
           .egress_fifo_we(egress_fifo_we[i]),
113
           .egress_fifo_full(egress_fifo_full[i]),
114
            .ingress_fifo_re(ingress_fifo_re[i]),
115
           .ingress_fifo_empty(ingress_fifo_empty[i]),
116
           .state_idle(state_idle[i]),
117
           .sdram_burst_reading(sdram_burst_reading),
118
           .debug_state(debug_each_wb_fsm_state[i]),
119
           .wb_clk(wb_clk),
120
           .wb_rst(wb_rst)
121
           );
122
    end
123
endgenerate
124
 
125
egress_fifo # (
126
               .a_hi_size(4),.a_lo_size(4),.nr_of_queues(nr_of_wb_ports),
127
               .data_width(36))
128
   egress_FIFO(
129
               .d(egress_fifo_di),
130
               .fifo_full(egress_fifo_full),
131
               .write(|(egress_fifo_we)),
132
               .write_enable(egress_fifo_we),
133
               .q(sdram_dat_o),
134
               .fifo_empty(sdram_fifo_empty),
135
               .read_adr(sdram_fifo_rd_adr),
136
               .read_data(sdram_fifo_rd_data),
137
               .read_enable(sdram_fifo_re),
138
               .clk1(wb_clk),
139
               .rst1(wb_rst),
140
               .clk2(sdram_clk),
141
               .rst2(sdram_rst)
142
               );
143
 
144
   async_fifo_mq # (
145
                    .a_hi_size(4),.a_lo_size(4),.nr_of_queues(nr_of_wb_ports),
146
                    .data_width(32))
147
   ingress_FIFO(
148
                .d(sdram_dat_i), .fifo_full(), .write(sdram_fifo_wr),
149
                .write_enable(sdram_fifo_we), .q(wb_dat_o),
150
                .fifo_empty(ingress_fifo_empty), .read(|(ingress_fifo_re)),
151
                .read_enable(ingress_fifo_re), .clk1(sdram_clk),
152
                .rst1(sdram_rst), .clk2(wb_clk), .rst2(wb_rst)
153
                );
154
 
155
assign wb_dat_o_v = {nr_of_wb_ports{wb_dat_o}};
156
 
157
endmodule

powered by: WebSVN 2.1.0

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