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

Subversion Repositories wb2axi4

[/] [wb2axi4/] [trunk/] [rtl/] [axi_ingress.sv] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alzhang
//Author     : Alex Zhang (cgzhangwei@gmail.com)
2
//Date       : 03-11-2015
3
//Basic : How to storage the AXI info and data into sram or fifo.
4
`include "wb2axi_parameters.vh"
5 3 alzhang
 
6 2 alzhang
module axi_ingress (
7
axi_clk,
8
reset_n,
9
AXI_IF,
10
fifo_full,
11
fifo_addr_info,
12
fifo_data_info,
13
fifo_addr_wr,
14
fifo_data_wr
15
);
16 3 alzhang
parameter  AXI_ID_W         = `WB2AXI_AXI_ID_W   ;
17
parameter  AXI_ADDR_W       = `WB2AXI_AXI_ADDR_W ;
18
parameter  AXI_DATA_W       = `WB2AXI_AXI_DATA_W ;
19
parameter  AXI_PROT_W       = `WB2AXI_AXI_PROT_W ;
20
parameter  AXI_STB_W        = `WB2AXI_AXI_STB_W  ;
21
parameter  AXI_LEN_W        = `WB2AXI_AXI_LEN_W  ;
22
parameter  AXI_SIZE_W       = `WB2AXI_AXI_SIZE_W ;
23
parameter  AXI_BURST_W      = `WB2AXI_AXI_BURST_W;
24
parameter  AXI_LOCK_W       = `WB2AXI_AXI_LOCK_W ;
25
parameter  AXI_CACHE_W      = `WB2AXI_AXI_CACHE_W;
26
parameter  AXI_RESP_W       = `WB2AXI_AXI_RESP_W ;
27
parameter  AXI_MAX_RESP_W   = 3;
28
parameter  FIFO_ADR_W       = 10;
29
parameter  FIFO_DAT_W       = 10;
30
 
31 2 alzhang
input                axi_clk;
32
input                reset_n;
33
axi_if.target        AXI_IF;
34
output               fifo_full;
35 3 alzhang
output [FIFO_ADR_W-1:0] fifo_addr_info;
36
output [FIFO_DAT_W-1:0] fifo_data_info;
37 2 alzhang
output reg           fifo_addr_wr;
38
output reg           fifo_data_wr;
39
localparam     ST_W = 2;
40
localparam  ST_IDLE = 2'b00;
41
localparam ST_WDATA = 2'b01;
42
localparam ST_BRESP = 2'b10;
43
localparam AXI_MAX_RESP_VAL = {AXI_MAX_RESP_W{1'b1}};
44
 
45
wire   input_addr_event;
46
wire   input_data_event;
47
wire   inc_bresp;
48
wire   dec_bresp;
49
wire   bresp_cnt_max;
50
 
51
 
52
reg [ST_W-1:0]            state;
53
reg [ST_W-1:0]            next_state;
54
reg [AXI_MAX_RESP_W-1:0]  bresp_pending_cnt;  //responses pending to generate
55 3 alzhang
reg [AXI_ID_W-1:0]       last_wid;
56
reg [FIFO_ADR_W-1:0]         fifo_addr_in;
57
reg [FIFO_DAT_W-1:0]         fifo_data_in;
58 2 alzhang
 
59
assign input_addr_event = AXI_IF.AWVALID & AXI_IF.AWREADY;
60 3 alzhang
assign input_data_event = AXI_IF.WVALID  & AXI_IF.WREADY;
61 2 alzhang
assign inc_bresp = AXI_IF.WLAST & input_data_event;
62
assign dec_bresp = AXI_IF.BREADY & AXI_IF.BVALID;
63
assign bresp_cnt_max = (bresp_pending_cnt == AXI_MAX_RESP_VAL);
64
 
65
always_comb begin
66
  next_state   = state;
67
  fifo_addr_wr = 0;
68
 
69
  case (state)
70
    ST_IDLE : begin
71
      if(input_addr_event) begin
72
        fifo_addr_wr = 1;
73
        fifo_addr_in = {AXI_IF.AWID, AXI_IF.AWADDR, AXI_IF.AWLEN, AXI_IF.AWSIZE, AXI_IF.AWBURST, AXI_IF.AWLOCK, AXI_IF.AWCACHE, AXI_IF.AWPROT, 1'b1}; //Wr address info
74
        next_state = ST_WDATA;
75
      end else begin
76
        fifo_addr_wr = 0;
77
        next_state = ST_IDLE;
78
      end
79
    end
80
    ST_WDATA: begin
81
      if (input_data_event) begin
82
        fifo_data_wr = 1;
83
        fifo_data_in = {AXI_IF.WID, AXI_IF.WDATA, AXI_IF.WSTRB, AXI_IF.WLAST, AXI_IF.WVALID};
84
        next_state = ST_BRESP;
85
      end else begin
86
        fifo_data_wr = 0;
87
        next_state = ST_WDATA;
88
      end
89
    end
90
    ST_BRESP : begin
91
      next_state = ST_IDLE;
92
    end
93
 
94
 
95
  endcase
96
end
97
 
98
always @(posedge axi_clk or negedge reset_n) begin
99
  if (~reset_n) begin
100
    state <= ST_IDLE;
101
    bresp_pending_cnt <= 0;
102
    last_wid   <= 0;
103
  end else begin
104
    state <= next_state;
105
    bresp_pending_cnt <= ( inc_bresp & !dec_bresp) ? bresp_pending_cnt +1 :
106
                         (!inc_bresp &  dec_bresp) ? bresp_pending_cnt -1 : bresp_pending_cnt ;
107
    last_wid <= input_data_event ? AXI_IF.WID : last_wid;
108
 
109
  end
110
end
111
 
112
assign AXI_IF.BRESP = 2'b00; //Response is always OK.
113
assign AXI_IF.BID   = last_wid;
114
assign AXI_IF.BVALID= (state == ST_BRESP) && bresp_pending_cnt !=0;
115
assign AXI_IF.ARREADY = 0;
116
assign AXI_IF.RDATA   = 0;
117
assign AXI_IF.RRESP   = 0;
118
assign AXI_IF.RLAST   = 0;
119
assign AXI_IF.RVALID  = 0;
120 3 alzhang
assign AXI_IF.AWREADY = (state ==ST_IDLE || state==ST_WDATA) & ~fifo_full & ~bresp_cnt_max;
121 2 alzhang
assign AXI_IF.WREADY  = ~fifo_full & ~bresp_cnt_max;
122
 
123
assign fifo_addr_info = fifo_addr_in;
124
assign fifo_data_info = fifo_data_in;
125
 
126
endmodule

powered by: WebSVN 2.1.0

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