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

Subversion Repositories dma_axi

[/] [dma_axi/] [trunk/] [src/] [dma_axi64/] [dma_axi64_core0_axim_cmd.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 eyalhoc
//---------------------------------------------------------
2
//-- File generated by RobustVerilog parser
3
//-- Version: 1.0
4
//-- Invoked Fri Mar 25 23:36:55 2011
5
//--
6
//-- Source file: dma_core_axim_cmd.v
7
//---------------------------------------------------------
8
 
9
 
10
 
11
module dma_axi64_core0_axim_cmd(clk,reset,ch_num,burst_start,burst_addr,burst_size,end_line_cmd,extra_bit,cmd_port,joint_req,joint_pending,cmd_pending,cmd_full,cmd_split,cmd_num,cmd_line,page_cross,AID,AADDR,APORT,ALEN,ASIZE,AVALID,AREADY,AWVALID,AJOINT,axim_timeout_num,axim_timeout);
12
 
13
   parameter                  AXI_WORD_SIZE = 0 ? 2'b10 : 2'b11;
14
   parameter                  AXI_3 = 0 ? 2 : 3;
15
 
16
   input               clk;
17
   input               reset;
18
 
19
   input [2:0]               ch_num;
20
 
21
   input               burst_start;
22
   input [32-1:0]      burst_addr;
23
   input [8-1:0]     burst_size;
24
   input               end_line_cmd;
25
   input               extra_bit;
26
   input               cmd_port;
27
   input               joint_req;
28
 
29
   output               joint_pending;
30
   output               cmd_pending;
31
   input               cmd_full;
32
   output               cmd_split;
33
   output [2:0]           cmd_num;
34
   output               cmd_line;
35
 
36
   output               page_cross;
37
 
38
   output [`CMD_BITS-1:0]     AID;
39
   output [32-1:0]     AADDR;
40
   output               APORT;
41
   output [`LEN_BITS-1:0]     ALEN;
42
   output [1:0]           ASIZE;
43
   output               AVALID;
44
   input               AREADY;
45
   input               AWVALID;
46
   output               AJOINT;
47
 
48
   output [2:0]           axim_timeout_num;
49
   output               axim_timeout;
50
 
51
 
52
 
53
   reg [`CMD_BITS-1:0]           AID;
54
   reg [`CMD_BITS-1:0]           AID_reg;
55
   reg [32-1:0]           AADDR;
56
   reg                   APORT;
57
   reg [`LEN_BITS-1:0]           ALEN;
58
   reg [1:0]               ASIZE;
59
   reg                   AVALID_reg;
60
   reg                   AJOINT;
61
 
62
 
63
   wire [`CMD_BITS-1:0]       AID_pre;
64
   wire [32-1:0]       AADDR_pre;
65
   wire [1:0]               ASIZE_pre;
66
   wire [`LEN_BITS-1:0]       ALEN_pre;
67
   wire [8-1:0]      burst_length;
68
 
69
   wire               cmd;
70
   reg                   cmd_pending;
71
   wire               cmd_line_pre;
72
   wire               cmd_line;
73
 
74
   wire               high_addr_pre;
75
   wire               high_addr;
76
   wire [8:0]               burst_reach_pre;
77
   reg [8:0]               burst_reach;
78
   reg                   joint_cross;
79
   wire               page_cross_pre;
80
   wire               page_cross;
81
   wire               cross_start;
82
   wire               cross_start_d;
83
   wire [8:0]               max_burst;
84
   reg [8:0]               max_burst_d;
85
   reg                   next_burst;
86
   reg [8-1:0]       next_burst_size;
87
   wire               next_burst_start;
88
 
89
 
90
 
91
 
92
   assign               high_addr_pre    = burst_addr[11:8] == 4'hf;
93
   assign               burst_reach_pre  = burst_addr[7:0] + burst_size;
94
   assign               page_cross       = high_addr & (burst_reach > {1'b1, {8{1'b0}}});
95
   assign               max_burst        = {1'b1, {8{1'b0}}} - burst_addr[7:0];
96
   assign               next_burst_start = next_burst & (~AVALID_reg) & (~cmd_full);
97
   assign               cross_start      = burst_start & page_cross;
98
 
99
 
100
   prgen_delay #(1) delay_high_addr (.clk(clk), .reset(reset), .din(high_addr_pre), .dout(high_addr));
101
   prgen_delay #(1) delay_cross_start (.clk(clk), .reset(reset), .din(cross_start), .dout(cross_start_d));
102
 
103
 
104
   always @(posedge clk or posedge reset)
105
     if (reset)
106
       burst_reach <= #1 {9{1'b0}};
107
     else if (high_addr_pre)
108
       burst_reach <= #1 burst_reach_pre;
109
 
110
   always @(posedge clk or posedge reset)
111
     if (reset)
112
       next_burst <= #1 1'b0;
113
     else if (next_burst_start)
114
       next_burst <= #1 1'b0;
115
     else if (cross_start)
116
       next_burst <= #1 1'b1;
117
 
118
   always @(posedge clk or posedge reset)
119
     if (reset)
120
       max_burst_d <= #1 {9{1'b0}};
121
     else if (cross_start)
122
       max_burst_d <= #1 max_burst;
123
 
124
   always @(posedge clk or posedge reset)
125
     if (reset)
126
       next_burst_size <= #1 {8{1'b0}};
127
     else if (cross_start)
128
       next_burst_size <= #1 burst_size;
129
     else if (cross_start_d)
130
       next_burst_size <= #1 next_burst_size - max_burst_d;
131
 
132
   assign               cmd_split       = cross_start_d;
133
 
134
   assign               cmd             = AVALID & AREADY;
135
   assign               cmd_num         = AID[2:0];
136
   assign               cmd_line_pre    = cmd & AID[6];
137
 
138
   assign               joint_pending   = AVALID & (~AREADY) & AJOINT;
139
 
140
   always @(posedge clk or posedge reset)
141
     if (reset)
142
       cmd_pending <= #1 1'b0;
143
     else if (burst_start)
144
       cmd_pending <= #1 1'b1;
145
     else if (cmd & (~next_burst))
146
       cmd_pending <= #1 1'b0;
147
 
148
 
149
   prgen_delay #(1) delay_cmd_line (.clk(clk), .reset(reset), .din(cmd_line_pre), .dout(cmd_line));
150
 
151
   assign               AID_pre = {
152
                     end_line_cmd,   //[6]
153
                     ASIZE_pre[1:0], //[5:4]
154
                     extra_bit,      //[3]
155
                     ch_num[2:0]     //[2:0]
156
                     };
157
 
158
   assign               AADDR_pre = burst_addr;
159
 
160
   assign               ASIZE_pre =
161
                  burst_size == 'd1 ? 2'b00 :
162
                  burst_size == 'd2 ? 2'b01 :
163
                  burst_size == 'd4 ? 2'b10 :
164
                  AXI_WORD_SIZE;
165
 
166
   assign               burst_length =
167
                  next_burst    ? next_burst_size :
168
                  page_cross    ? max_burst       : burst_size;
169
 
170
   assign               ALEN_pre =
171
                  burst_length[8-1:AXI_3] == 'd0 ? {`LEN_BITS{1'b0}} :
172
                  burst_length[8-1:AXI_3] - 1'b1;
173
 
174
 
175
   always @(posedge clk or posedge reset)
176
     if (reset)
177
       begin
178
      ASIZE  <= #1 {2{1'b0}};
179
      AJOINT <= #1 1'b0;
180
       end
181
     else if (burst_start)
182
       begin
183
      ASIZE  <= #1 ASIZE_pre;
184
      AJOINT <= #1 joint_req;
185
       end
186
 
187
   always @(posedge clk or posedge reset)
188
     if (reset)
189
       AID_reg <= #1 {`CMD_BITS{1'b0}};
190
     else if (burst_start)
191
       AID_reg <= #1 AID_pre;
192
 
193
   always @(AID_reg or next_burst)
194
     begin
195
    AID               = AID_reg;
196
    AID[`ID_END_LINE] = AID_reg[`ID_END_LINE] & (~next_burst);
197
    AID[`ID_LAST]     = AID_reg[`ID_LAST] & (~next_burst);
198
     end
199
 
200
   always @(posedge clk or posedge reset)
201
     if (reset)
202
       AADDR  <= #1 {32{1'b0}};
203
     else if (next_burst_start)
204
       AADDR  <= #1 {AADDR[32-1:12], {12{1'b1}}} + 1'b1;
205
     else if (burst_start)
206
       AADDR  <= #1 AADDR_pre;
207
 
208
   always @(posedge clk or posedge reset)
209
     if (reset)
210
       APORT <= #1 1'b0;
211
     else if (burst_start)
212
       APORT <= #1 cmd_port;
213
 
214
   always @(posedge clk or posedge reset)
215
     if (reset)
216
       ALEN   <= #1 {`LEN_BITS{1'b0}};
217
     else if (burst_start | next_burst_start)
218
       ALEN   <= #1 ALEN_pre;
219
 
220
   always @(posedge clk or posedge reset)
221
     if (reset)
222
       AVALID_reg <= #1 1'b0;
223
     else if (AVALID & AREADY)
224
       AVALID_reg <= #1 1'b0;
225
     else if ((burst_start & (burst_size > 'd0)) | next_burst_start)
226
       AVALID_reg <= #1 1'b1;
227
 
228
   assign AVALID = AJOINT ? AVALID_reg & (~AWVALID) : AVALID_reg;
229
 
230
   dma_axi64_core0_axim_timeout  dma_axi64_axim_timeout (
231
                         .clk(clk),
232
                         .reset(reset),
233
                         .VALID(AVALID),
234
                         .READY(AREADY),
235
                         .ID(AID),
236
                         .axim_timeout_num(axim_timeout_num),
237
                         .axim_timeout(axim_timeout)
238
                         );
239
 
240
 
241
endmodule
242
 
243
 
244
 
245
 
246
 

powered by: WebSVN 2.1.0

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