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

Subversion Repositories wb2axi4

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

Go to most recent revision | 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
module axi_ingress (
6
axi_clk,
7
reset_n,
8
AXI_IF,
9
fifo_full,
10
fifo_addr_info,
11
fifo_data_info,
12
fifo_addr_wr,
13
fifo_data_wr
14
);
15
parameter  AXI_WID_W      = 5;
16
parameter  AXI_MAX_RESP_W = 3;
17
input                axi_clk;
18
input                reset_n;
19
axi_if.target        AXI_IF;
20
output               fifo_full;
21
output [FIFO_AW-1:0] fifo_addr_info;
22
output [FIFO_DW-1:0] fifo_data_info;
23
output reg           fifo_addr_wr;
24
output reg           fifo_data_wr;
25
localparam     ST_W = 2;
26
localparam  ST_IDLE = 2'b00;
27
localparam ST_WDATA = 2'b01;
28
localparam ST_BRESP = 2'b10;
29
localparam AXI_MAX_RESP_VAL = {AXI_MAX_RESP_W{1'b1}};
30
 
31
wire   input_addr_event;
32
wire   input_data_event;
33
wire   inc_bresp;
34
wire   dec_bresp;
35
wire   bresp_cnt_max;
36
 
37
 
38
reg [ST_W-1:0]            state;
39
reg [ST_W-1:0]            next_state;
40
reg [AXI_MAX_RESP_W-1:0]  bresp_pending_cnt;  //responses pending to generate
41
reg [AXI_WID_W-1:0]       last_wid;
42
reg [FIFO_AW-1:0]         fifo_addr_in;
43
reg [FIFO_DW-1:0]         fifo_data_in;
44
 
45
assign input_addr_event = AXI_IF.AWVALID & AXI_IF.AWREADY;
46
assign input_data_event = AXI_FI.WVALID  & AXI_IF.WREADY;
47
assign inc_bresp = AXI_IF.WLAST & input_data_event;
48
assign dec_bresp = AXI_IF.BREADY & AXI_IF.BVALID;
49
assign bresp_cnt_max = (bresp_pending_cnt == AXI_MAX_RESP_VAL);
50
 
51
always_comb begin
52
  next_state   = state;
53
  fifo_addr_wr = 0;
54
 
55
  case (state)
56
    ST_IDLE : begin
57
      if(input_addr_event) begin
58
        fifo_addr_wr = 1;
59
        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
60
        next_state = ST_WDATA;
61
      end else begin
62
        fifo_addr_wr = 0;
63
        next_state = ST_IDLE;
64
      end
65
    end
66
    ST_WDATA: begin
67
      if (input_data_event) begin
68
        fifo_data_wr = 1;
69
        fifo_data_in = {AXI_IF.WID, AXI_IF.WDATA, AXI_IF.WSTRB, AXI_IF.WLAST, AXI_IF.WVALID};
70
        next_state = ST_BRESP;
71
      end else begin
72
        fifo_data_wr = 0;
73
        next_state = ST_WDATA;
74
      end
75
    end
76
    ST_BRESP : begin
77
      next_state = ST_IDLE;
78
    end
79
 
80
 
81
  endcase
82
end
83
 
84
always @(posedge axi_clk or negedge reset_n) begin
85
  if (~reset_n) begin
86
    state <= ST_IDLE;
87
    bresp_pending_cnt <= 0;
88
    last_wid   <= 0;
89
  end else begin
90
    state <= next_state;
91
    bresp_pending_cnt <= ( inc_bresp & !dec_bresp) ? bresp_pending_cnt +1 :
92
                         (!inc_bresp &  dec_bresp) ? bresp_pending_cnt -1 : bresp_pending_cnt ;
93
    last_wid <= input_data_event ? AXI_IF.WID : last_wid;
94
 
95
  end
96
end
97
 
98
assign AXI_IF.BRESP = 2'b00; //Response is always OK.
99
assign AXI_IF.BID   = last_wid;
100
assign AXI_IF.BVALID= (state == ST_BRESP) && bresp_pending_cnt !=0;
101
assign AXI_IF.ARREADY = 0;
102
assign AXI_IF.RDATA   = 0;
103
assign AXI_IF.RRESP   = 0;
104
assign AXI_IF.RLAST   = 0;
105
assign AXI_IF.RVALID  = 0;
106
assign AIX_IF.AWREADY = (state ==ST_IDLE || state==ST_WDATA) & ~fifo_full & ~bresp_cnt_max;
107
assign AXI_IF.WREADY  = ~fifo_full & ~bresp_cnt_max;
108
 
109
assign fifo_addr_info = fifo_addr_in;
110
assign fifo_data_info = fifo_data_in;
111
 
112
endmodule

powered by: WebSVN 2.1.0

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