aboutsummaryrefslogtreecommitdiff
path: root/hdl/master_wb.v
blob: cae1dfc0d5a37d422f345db3473ed96b75e37547 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    22:35:43 10/10/2015 
// Design Name: 
// Module Name:    master_wb 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module master_wb(
    
    input clk,
    input rst,
    
    output reg done_o,
    
    // mem signals
    input  wire         d_read_en,
    input  wire         d_write_en,
    input  wire [31:0]  d_addr,
    input  wire [31:0]  d_write_data,
    output reg  [31:0]  d_data_out,
    
    // wb signals
    input  [31:0] wbm_dat_i,
    input  wbm_ack_i,
    output reg [31:0] wbm_dat_o,
    output reg wbm_we_o,
    output [3:0] wbm_sel_o,
    output reg [31:0] wbm_adr_o,
    output reg wbm_cyc_o,
    output reg wbm_stb_o
);

    reg [1:0] state_r;
    
    assign wbm_sel_o = 4'b1111;
    
    localparam IDLE      = 0;
    localparam WRITE_ACK = 1;
    localparam READ_ACK  = 2;
    
    reg rd_r, wr_r;
    

    always@(posedge clk, posedge rst) 
        
        if(rst) begin
             state_r    <= IDLE;
             
             done_o     <= 1'b0;
             wbm_adr_o <= 0;
             wbm_dat_o  <= 0;
             wbm_we_o   <= 1'b0;
             wbm_stb_o  <= 1'b0;
             wbm_cyc_o  <= 1'b0;
             
             d_data_out <= 0;
             
             rd_r <= 0;
             wr_r <= 0;
        end else begin
        
            rd_r <= d_read_en;
            wr_r <= d_write_en;
        
            done_o <= 1'b0;
            
            case(state_r) 
                IDLE: 
                    if(d_write_en && !wr_r) begin
                        wbm_adr_o <= d_addr;
                        wbm_dat_o  <= d_write_data;
                        wbm_we_o   <= 1'b1;
                        wbm_stb_o  <= 1'b1;
                        wbm_cyc_o  <= 1'b1;
                    
                        state_r    <= WRITE_ACK;
                    end else if (d_read_en && !rd_r) begin
                        wbm_adr_o <= d_addr;
                        wbm_stb_o  <= 1'b1;
                        wbm_cyc_o  <= 1'b1;
                        
                        state_r <= READ_ACK;
                    end
                WRITE_ACK: 
                    if(wbm_ack_i) begin
                        wbm_we_o   <= 1'b0;
                        wbm_stb_o  <= 1'b0;
                        wbm_cyc_o  <= 1'b0;
                        
                        done_o     <= 1'b1;
                        state_r    <= IDLE;
                    end
                READ_ACK:
                    if(wbm_ack_i) begin
                        wbm_stb_o  <= 1'b0;
                        wbm_cyc_o  <= 1'b0;
                        
                        d_data_out <= wbm_dat_i;
                        
                        done_o     <= 1'b1;
                        state_r    <= IDLE;
                    end

            endcase
        end
  



endmodule