1.1 diff -r 000000000000 -r 11aef665a5d8 rtl/verilog/master_ctrl.v 1.2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 +++ b/rtl/verilog/master_ctrl.v Fri Aug 13 10:43:05 2010 +0100 1.4 @@ -0,0 +1,1188 @@ 1.5 +// ============================================================================= 1.6 +// COPYRIGHT NOTICE 1.7 +// Copyright 2006 (c) Lattice Semiconductor Corporation 1.8 +// ALL RIGHTS RESERVED 1.9 +// This confidential and proprietary software may be used only as authorised by 1.10 +// a licensing agreement from Lattice Semiconductor Corporation. 1.11 +// The entire notice above must be reproduced on all authorized copies and 1.12 +// copies may only be made to the extent permitted by a licensing agreement from 1.13 +// Lattice Semiconductor Corporation. 1.14 +// 1.15 +// Lattice Semiconductor Corporation TEL : 1-800-Lattice (USA and Canada) 1.16 +// 5555 NE Moore Court 408-826-6000 (other locations) 1.17 +// Hillsboro, OR 97124 web : http://www.latticesemi.com/ 1.18 +// U.S.A email: techsupport@latticesemi.com 1.19 +// =============================================================================/ 1.20 +// FILE DETAILS 1.21 +// Project : LM32 DMA Component 1.22 +// File : master_ctrl.v 1.23 +// Title : DMA Master controller 1.24 +// Dependencies : None 1.25 +// 1.26 +// Version 3.1 1.27 +// 1. Make DMA Engine compliant to Rule 3.100 of Wishbone Spec which defines 1.28 +// alignement of bytes in sub-word transfers. 1.29 +// 2. Removed glitch that did not pause the burst write when the read burst 1.30 +// was paused by the "read slave". 1.31 +// 1.32 +// Version 7.0SP2, 3.0 1.33 +// 1. Read and Write channel of DMA controller are working in parallel, 1.34 +// due to that now as soon as FIFO is not empty write channel of the DMA 1.35 +// controller start writing data to the slave. 1.36 +// 2. Burst Size supported by DMA controller is increased to support bigger 1.37 +// burst (from current value of 4 and 8 to 16 and 32). Now 4 different type 1.38 +// of burst sizes are supported by the DMA controller 4, 8, 16 and 32. 1.39 +// For this Burst Size field of the control register is increased to 2 bits. 1.40 +// 3. Glitch is removed on the S_ACK_O signal. 1.41 +// 1.42 +// Version 7.0 1.43 +// 1. Initial Release 1.44 +// 1.45 +// ============================================================================= 1.46 + 1.47 +`ifndef MASTER_CTRL_FILE 1.48 + `define MASTER_CTRL_FILE 1.49 + `include "system_conf.v" 1.50 +module MASTER_CTRL 1.51 + #(parameter LENGTH_WIDTH = 16, 1.52 + parameter FIFO_IMPLEMENTATION = "EBR") 1.53 + ( 1.54 + //master read port 1.55 + MA_ADR_O, 1.56 + MA_SEL_O, 1.57 + MA_WE_O, 1.58 + MA_STB_O, 1.59 + MA_CYC_O, 1.60 + MA_CTI_O, 1.61 + MA_LOCK_O, 1.62 + MA_DAT_I, //32bits 1.63 + MA_ACK_I, 1.64 + MA_ERR_I, 1.65 + MA_RTY_I, 1.66 + //master write port 1.67 + MB_ADR_O, 1.68 + MB_SEL_O, 1.69 + MB_DAT_O, //32bits 1.70 + MB_WE_O, 1.71 + MB_STB_O, 1.72 + MB_CYC_O, 1.73 + MB_CTI_O, 1.74 + MB_LOCK_O, 1.75 + MB_ACK_I, 1.76 + MB_ERR_I, 1.77 + MB_RTY_I, 1.78 + //register interface 1.79 + M_SEL_O, 1.80 + reg_start, 1.81 + reg_status, 1.82 + reg_interrupt, 1.83 + reg_busy, 1.84 + data_length, 1.85 + reg_cntlg, 1.86 + reg_bt2,reg_bt1,reg_bt0, 1.87 + incr_unit, 1.88 + reg_s_con, 1.89 + reg_d_con, 1.90 + reg_00_data, 1.91 + reg_04_data, 1.92 + //system clock and reset 1.93 + CLK_I, 1.94 + RST_I 1.95 + ); 1.96 + //master read port 1.97 + output [31:0] MA_ADR_O; 1.98 + output [3:0] MA_SEL_O; 1.99 + output MA_WE_O; 1.100 + output MA_STB_O; 1.101 + output MA_CYC_O; 1.102 + output [2:0] MA_CTI_O; 1.103 + output MA_LOCK_O; 1.104 + input [31:0] MA_DAT_I; //32bits 1.105 + input MA_ACK_I; 1.106 + input MA_ERR_I; 1.107 + input MA_RTY_I; 1.108 + //master write port 1.109 + output [31:0] MB_ADR_O; 1.110 + output [3:0] MB_SEL_O; 1.111 + output [31:0] MB_DAT_O; //32bits 1.112 + output MB_WE_O; 1.113 + output MB_STB_O; 1.114 + output MB_CYC_O; 1.115 + output [2:0] MB_CTI_O; 1.116 + output MB_LOCK_O; 1.117 + input MB_ACK_I; 1.118 + input MB_ERR_I; 1.119 + input MB_RTY_I; 1.120 + 1.121 + //register interface 1.122 + input [3:0] M_SEL_O; 1.123 + input reg_start; 1.124 + output reg_status; 1.125 + output reg_interrupt; 1.126 + output reg_busy; 1.127 + input [LENGTH_WIDTH-1:0] data_length; 1.128 + output reg_cntlg; 1.129 + input reg_bt2,reg_bt1,reg_bt0; 1.130 + input [2:0] incr_unit; 1.131 + input reg_s_con; 1.132 + input reg_d_con; 1.133 + input [31:0] reg_00_data; 1.134 + input [31:0] reg_04_data; 1.135 + //system clock and reset 1.136 + input CLK_I; 1.137 + input RST_I; 1.138 + 1.139 + parameter lat_family = `LATTICE_FAMILY; 1.140 + parameter UDLY = 1; 1.141 + //Read FSM States encoding 1.142 + parameter ST_IDLE = 3'b000; 1.143 + parameter ST_READ = 3'b001; 1.144 + parameter ST_RDADDR = 3'b010; 1.145 + parameter ST_RDFIFO = 3'b011; 1.146 + parameter ST_WAIT_WRITE_FINISH = 3'b100; 1.147 + 1.148 + //Write FSM States encoding 1.149 + parameter ST_WRITE_IDLE = 4'b0000; 1.150 + parameter ST_WRITE = 4'b0001; 1.151 + parameter ST_WRADDR = 4'b0010; 1.152 + parameter ST_CNTLNGTH = 4'b0011; 1.153 + parameter ST_JUSTICE = 4'b0100; 1.154 + parameter ST_FIFO_EMPTY = 4'b0101; 1.155 + parameter ST_WRITE_WAIT = 4'b0110; 1.156 + parameter ST_FIFO_AEMPTY = 4'b1010; 1.157 + parameter ST_FIFO_RESUME = 4'b1000; 1.158 + 1.159 + // FSM for normal data transfer 1.160 + parameter ST_IDLE1 = 3'b000; 1.161 + parameter ST_READ1 = 3'b001; 1.162 + parameter ST_WRITE1 = 3'b010; 1.163 + parameter ST_RDADDR1 = 3'b011; 1.164 + parameter ST_WRADDR1 = 3'b100; 1.165 + parameter ST_CNTLNGTH1 = 3'b101; 1.166 + parameter ST_JUSTICE1 = 3'b110; 1.167 + parameter ST_RDFIFO1 = 3'b111; 1.168 + reg [2:0] status; 1.169 + reg var_length; 1.170 + 1.171 + 1.172 + //fifo status 1.173 + 1.174 + reg [2:0] status1; 1.175 + reg [3:0] status2; 1.176 + reg var_length2; 1.177 + reg var_length1; 1.178 + reg MA_STB_O; 1.179 + reg MB_STB_O; 1.180 + reg MA_CYC_O; 1.181 + reg MB_CYC_O; 1.182 + reg [2:0] MA_CTI_O; 1.183 + reg [2:0] MB_CTI_O; 1.184 + wire MA_WE_O = 1'b0; 1.185 + wire MB_WE_O = 1'b1; 1.186 + reg [31:0] MA_ADR_O; 1.187 + reg [31:0] MB_ADR_O; 1.188 + reg [3:0] MA_SEL_O; 1.189 + reg [3:0] MB_SEL_O; 1.190 + wire MA_LOCK_O = 0; //reg_bt2 ? (status1 == ST_READ) && (!(MA_CTI_O == 3'h7)) : 1'b0; 1.191 + wire MB_LOCK_O = 0; //reg_bt2 ? (status2 == ST_WRITE) && (!(MB_CTI_O == 3'h7)) : 1'b0; 1.192 + 1.193 + wire reg_busy = reg_bt2 ? !(status1 == ST_IDLE) : !(status == ST_IDLE1); 1.194 + wire reg_interrupt; 1.195 + wire reg_status; 1.196 + 1.197 + wire reg_cntlg; 1.198 + reg start_flag; 1.199 + reg [5:0] burst_size; 1.200 + reg [5:0] burst_cnt; 1.201 + reg fifo_wr; 1.202 + reg fifo_rd; 1.203 + reg [31:0] fifo_din; 1.204 + wire [31:0] fifo_dout; 1.205 + wire fifo_empty; 1.206 + wire fifo_aempty; 1.207 + reg fifo_clear; 1.208 + reg [31:0] first_data; 1.209 + reg first_data_flag; 1.210 + wire [31:0] MB_DAT_O = first_data_flag ? first_data : fifo_dout; 1.211 + reg latch_start; 1.212 + 1.213 + reg reg_status1, reg_status2; 1.214 + reg reg_interrupt1, reg_interrupt2; 1.215 + reg end_of_transfer; 1.216 + reg burst_completed; 1.217 + reg donot_start_again; 1.218 + reg [5:0] burst_size2; 1.219 + reg [5:0] burst_cnt2; 1.220 + 1.221 + reg reg_cntlg_burst, reg_cntlg_normal; 1.222 + reg reg_status_normal, reg_interrupt_normal; 1.223 + reg direct_data; 1.224 + 1.225 + always @(posedge CLK_I or posedge RST_I) 1.226 + if(RST_I) 1.227 + begin 1.228 + first_data <= #UDLY 'h0; 1.229 + first_data_flag <= #UDLY 1'b0; 1.230 + end 1.231 + else if((start_flag || direct_data) & !reg_bt2 & MA_ACK_I) 1.232 + begin 1.233 + first_data <= #UDLY MA_DAT_I; 1.234 + first_data_flag <= #UDLY 1'b1; 1.235 + end 1.236 + else if(first_data_flag & MB_ACK_I) 1.237 + begin 1.238 + first_data_flag <= #UDLY 1'b0; 1.239 + end 1.240 + 1.241 + assign reg_status = reg_bt2 ? (reg_status1 | reg_status2) : reg_status_normal; 1.242 + assign reg_interrupt = reg_bt2 ? (reg_interrupt1 | reg_interrupt2) : reg_interrupt_normal; 1.243 + assign reg_cntlg = reg_bt2 ? reg_cntlg_burst : reg_cntlg_normal; 1.244 + 1.245 + 1.246 + //FSM 1.247 + always @(posedge CLK_I or posedge RST_I) 1.248 + if(RST_I) 1.249 + begin 1.250 + status1 <= #UDLY ST_IDLE; 1.251 + var_length1 <= #UDLY 1'b0; 1.252 + MA_ADR_O <= #UDLY 32'h0; 1.253 + MA_SEL_O <= #UDLY 4'b1111; 1.254 + MA_CYC_O <= #UDLY 1'b0; 1.255 + MA_CTI_O <= #UDLY 3'h0; 1.256 + MA_STB_O <= #UDLY 1'b0; 1.257 + reg_status1 <= #UDLY 1'b0; 1.258 + reg_interrupt1 <= #UDLY 1'b0; 1.259 + start_flag <= #UDLY 1'b0; 1.260 + burst_size <= #UDLY 5'h0; 1.261 + burst_cnt <= #UDLY 5'h0; 1.262 + fifo_clear <= #UDLY 1'b0; 1.263 + latch_start <= #UDLY 1'b0; 1.264 + fifo_wr <= #UDLY 1'b0; 1.265 + 1.266 + status2 <= #UDLY ST_WRITE_IDLE; 1.267 + MB_ADR_O <= #UDLY 32'h0; 1.268 + MB_SEL_O <= #UDLY 4'b1111; 1.269 + MB_CYC_O <= #UDLY 1'b0; 1.270 + MB_CTI_O <= #UDLY 3'h0; 1.271 + MB_STB_O <= #UDLY 1'b0; 1.272 + reg_status2 <= #UDLY 1'b0; 1.273 + reg_interrupt2 <= #UDLY 1'b0; 1.274 + reg_cntlg_burst <= #UDLY 1'b0; 1.275 + burst_size2 <= #UDLY 5'h0; 1.276 + burst_cnt2 <= #UDLY 5'h0; 1.277 + fifo_rd <= #UDLY 1'b0; 1.278 + end_of_transfer <= #UDLY 1'b0; 1.279 + var_length2 <= #UDLY 1'b0; 1.280 + burst_completed <= #UDLY 1'b0; 1.281 + donot_start_again <= #UDLY 1'b0; 1.282 + 1.283 + status <= #UDLY ST_IDLE1; 1.284 + var_length <= #UDLY 1'b0; 1.285 + reg_status_normal <= #UDLY 1'b0; 1.286 + reg_interrupt_normal <= #UDLY 1'b0; 1.287 + reg_cntlg_normal <= #UDLY 1'b0; 1.288 + direct_data <= #UDLY 1'b0; 1.289 + end 1.290 + else 1.291 + begin 1.292 + if (reg_bt2) begin 1.293 + // Read Burst 1.294 + if ((MB_RTY_I && (!(|data_length))) || (MB_ERR_I && (status2 == ST_WRITE))) 1.295 + begin 1.296 + status1 <= #UDLY ST_IDLE; 1.297 + end 1.298 + else 1.299 + begin 1.300 + case(status1) 1.301 + ST_IDLE: 1.302 + begin 1.303 + if(fifo_wr) 1.304 + fifo_wr <= #UDLY 1'b0; 1.305 + if(MA_ACK_I) 1.306 + begin 1.307 + MA_CYC_O <= #UDLY 1'b0; 1.308 + MA_STB_O <= #UDLY 1'b0; 1.309 + MA_CTI_O <= #UDLY 3'h0; 1.310 + end 1.311 + if(reg_start | latch_start) 1.312 + begin 1.313 + if(fifo_empty) 1.314 + begin 1.315 + if(latch_start) 1.316 + latch_start <= #UDLY 1'b0; 1.317 + status1 <= #UDLY ST_READ; 1.318 + MA_CYC_O <= #UDLY 1'b1; 1.319 + MA_STB_O <= #UDLY 1'b1; 1.320 + MA_ADR_O <= #UDLY reg_00_data; 1.321 + case (reg_00_data[1:0]) 1.322 + 2'b01: MA_SEL_O <= #UDLY {1'b0,M_SEL_O[3:1]}; 1.323 + 2'b10: MA_SEL_O <= #UDLY {2'b00,M_SEL_O[3:2]}; 1.324 + 2'b11: MA_SEL_O <= #UDLY {3'b00,M_SEL_O[3:3]}; 1.325 + default: 1.326 + MA_SEL_O <= #UDLY M_SEL_O; 1.327 + endcase 1.328 + set_cti_a; 1.329 + start_flag <= #UDLY 1'b1; 1.330 + if(!(|data_length)) 1.331 + var_length1 <= #UDLY 1'b1; 1.332 + else 1.333 + var_length1 <= #UDLY 1'b0; 1.334 + burst_size <= #UDLY reg_bt1 ? (reg_bt0 ? 5'h1f : 5'hf) : (reg_bt0 ? 5'h7 : 5'h3); 1.335 + burst_cnt <= #UDLY reg_bt1 ? (reg_bt0 ? 5'h1f : 5'hf) : (reg_bt0 ? 5'h7 : 5'h3); 1.336 + end 1.337 + else 1.338 + status1 <= #UDLY ST_RDFIFO; 1.339 + end 1.340 + else 1.341 + status1 <= #UDLY ST_IDLE; 1.342 + reg_interrupt1 <= #UDLY 1'b0; 1.343 + end 1.344 + 1.345 + ST_WAIT_WRITE_FINISH: 1.346 + begin 1.347 + fifo_wr <= #UDLY 1'b0; 1.348 + if (status2 == ST_WRITE) 1.349 + start_flag <= #UDLY 1'b0; 1.350 + if(end_of_transfer) 1.351 + begin 1.352 + if(!reg_s_con) 1.353 + MA_ADR_O <= #UDLY MA_ADR_O + incr_unit; 1.354 + if (incr_unit == 3'b001) 1.355 + MA_SEL_O <= #UDLY {MA_SEL_O[0], MA_SEL_O[3:1]}; 1.356 + else 1.357 + if (incr_unit == 3'b010) 1.358 + MA_SEL_O <= #UDLY {MA_SEL_O[1:0], MA_SEL_O[3:2]}; 1.359 + 1.360 + status1 <= #UDLY ST_RDADDR; 1.361 + burst_cnt <= #UDLY burst_size; 1.362 + end 1.363 + else 1.364 + begin 1.365 + if(burst_completed) 1.366 + status1 <= #UDLY ST_IDLE; 1.367 + end 1.368 + end 1.369 + 1.370 + ST_RDFIFO: 1.371 + begin 1.372 + if(fifo_empty) 1.373 + begin 1.374 + status1 <= #UDLY ST_IDLE; 1.375 + fifo_clear <= #UDLY 1'b0; 1.376 + latch_start <= #UDLY 1'b1; 1.377 + end 1.378 + else 1.379 + fifo_clear <= #UDLY !fifo_clear; 1.380 + end 1.381 + 1.382 + ST_RDADDR: 1.383 + begin 1.384 + MA_CYC_O <= #UDLY 1'b1; 1.385 + MA_STB_O <= #UDLY 1'b1; 1.386 + set_cti_a; 1.387 + status1 <= #UDLY ST_READ; 1.388 + end 1.389 + 1.390 + ST_READ: 1.391 + begin 1.392 + write_fifo; 1.393 + if(MA_ACK_I) 1.394 + begin 1.395 + if(start_flag) 1.396 + begin 1.397 + if(burst_cnt == 0) 1.398 + begin 1.399 + MA_CYC_O <= #UDLY 1'b0; 1.400 + MA_STB_O <= #UDLY 1'b0; 1.401 + MA_CTI_O <= #UDLY 3'h0; 1.402 + status1 <= #UDLY ST_WAIT_WRITE_FINISH; 1.403 + end 1.404 + else 1.405 + begin 1.406 + if(burst_cnt == 1) 1.407 + MA_CTI_O <= #UDLY 3'h7; 1.408 + burst_cnt <= #UDLY burst_cnt - 1; 1.409 + if(!reg_s_con) 1.410 + MA_ADR_O <= #UDLY MA_ADR_O + incr_unit; 1.411 + if (incr_unit == 3'b001) 1.412 + MA_SEL_O <= #UDLY {MA_SEL_O[0], MA_SEL_O[3:1]}; 1.413 + else 1.414 + if (incr_unit == 3'b010) 1.415 + MA_SEL_O <= #UDLY {MA_SEL_O[1:0], MA_SEL_O[3:2]}; 1.416 + end 1.417 + end 1.418 + else 1.419 + begin 1.420 + if(burst_cnt == 0) 1.421 + begin 1.422 + MA_CYC_O <= #UDLY 1'b0; 1.423 + MA_STB_O <= #UDLY 1'b0; 1.424 + MA_CTI_O <= #UDLY 3'h0; 1.425 + status1 <= #UDLY ST_WAIT_WRITE_FINISH; 1.426 + end 1.427 + else 1.428 + begin 1.429 + if(burst_cnt == 1) 1.430 + MA_CTI_O <= #UDLY 3'h7; 1.431 + if(!reg_s_con) 1.432 + MA_ADR_O <= #UDLY MA_ADR_O + incr_unit; 1.433 + if (incr_unit == 3'b001) 1.434 + MA_SEL_O <= #UDLY {MA_SEL_O[0], MA_SEL_O[3:1]}; 1.435 + else 1.436 + if (incr_unit == 3'b010) 1.437 + MA_SEL_O <= #UDLY {MA_SEL_O[1:0], MA_SEL_O[3:2]}; 1.438 + burst_cnt <= #UDLY burst_cnt - 1; 1.439 + end 1.440 + end 1.441 + end 1.442 + else if(MA_RTY_I) 1.443 + begin 1.444 + if(var_length1) 1.445 + begin 1.446 + MA_CYC_O <= #UDLY 1'b0; 1.447 + MA_STB_O <= #UDLY 1'b0; 1.448 + MA_CTI_O <= #UDLY 3'h0; 1.449 + status1 <= #UDLY ST_IDLE; 1.450 + reg_status1 <= #UDLY 1'b0; 1.451 + reg_interrupt1 <= #UDLY 1'b1; 1.452 + start_flag <= #UDLY 1'b0; 1.453 + end 1.454 + end 1.455 + else if(MA_ERR_I) 1.456 + begin 1.457 + MA_CYC_O <= #UDLY 1'b0; 1.458 + MA_STB_O <= #UDLY 1'b0; 1.459 + MA_CTI_O <= #UDLY 3'h0; 1.460 + status1 <= #UDLY ST_IDLE; 1.461 + reg_status1 <= #UDLY 1'b1; 1.462 + reg_interrupt1 <= #UDLY 1'b1; 1.463 + start_flag <= #UDLY 1'b0; 1.464 + end 1.465 + end 1.466 + 1.467 + default: 1.468 + begin 1.469 + status1 <= #UDLY ST_IDLE; 1.470 + var_length1 <= #UDLY 1'b0; 1.471 + MA_ADR_O <= #UDLY 32'h0; 1.472 + MA_SEL_O <= #UDLY 4'b1111; 1.473 + MA_CYC_O <= #UDLY 1'b0; 1.474 + MA_CTI_O <= #UDLY 3'h0; 1.475 + MA_STB_O <= #UDLY 1'b0; 1.476 + reg_status1 <= #UDLY 1'b0; 1.477 + reg_interrupt1 <= #UDLY 1'b0; 1.478 + start_flag <= #UDLY 1'b0; 1.479 + burst_size <= #UDLY 5'h0; 1.480 + burst_cnt <= #UDLY 5'h0; 1.481 + fifo_clear <= #UDLY 1'b0; 1.482 + latch_start <= #UDLY 1'b0; 1.483 + fifo_wr <= #UDLY 1'b0; 1.484 + end 1.485 + endcase 1.486 + end 1.487 + // Write Burst 1.488 + if ((MA_RTY_I && (!(|data_length))) || (MA_ERR_I && (status1 == ST_READ))) 1.489 + begin 1.490 + status2 <= #UDLY ST_WRITE_IDLE; 1.491 + donot_start_again <= #UDLY 1'b1; 1.492 + end 1.493 + else 1.494 + begin 1.495 + case(status2) 1.496 + ST_WRITE_IDLE: 1.497 + begin 1.498 + if(reg_start) 1.499 + begin 1.500 + MB_ADR_O <= #UDLY reg_04_data; 1.501 + case (reg_04_data[1:0]) 1.502 + 2'b01: MB_SEL_O <= #UDLY {1'b0,M_SEL_O[3:1]}; 1.503 + 2'b10: MB_SEL_O <= #UDLY {2'b00,M_SEL_O[3:2]}; 1.504 + 2'b11: MB_SEL_O <= #UDLY {3'b00,M_SEL_O[3:3]}; 1.505 + default: 1.506 + MB_SEL_O <= #UDLY M_SEL_O; 1.507 + endcase 1.508 + if(!(|data_length)) 1.509 + var_length2 <= #UDLY 1'b1; 1.510 + else 1.511 + var_length2 <= #UDLY 1'b0; 1.512 + burst_size2 <= #UDLY reg_bt1 ? (reg_bt0 ? 5'h1f : 5'hf) : (reg_bt0 ? 5'h7 : 5'h3); 1.513 + burst_cnt2 <= #UDLY reg_bt1 ? (reg_bt0 ? 5'h1f : 5'hf) : (reg_bt0 ? 5'h7 : 5'h3); 1.514 + if(!fifo_empty) 1.515 + status2 <= #UDLY ST_FIFO_EMPTY; 1.516 + else 1.517 + donot_start_again <= #UDLY 1'b0; 1.518 + end 1.519 + if(fifo_empty) 1.520 + begin 1.521 + if(MB_ACK_I) 1.522 + begin 1.523 + MB_CYC_O <= #UDLY 1'b0; 1.524 + MB_STB_O <= #UDLY 1'b0; 1.525 + MB_CTI_O <= #UDLY 3'h0; 1.526 + fifo_rd <= #UDLY 1'b0; 1.527 + end 1.528 + burst_cnt2 <= #UDLY 5'h0; 1.529 + end 1.530 + else 1.531 + begin 1.532 + if(donot_start_again) 1.533 + begin 1.534 + if(MB_ACK_I) 1.535 + begin 1.536 + if(!reg_d_con) 1.537 + MB_ADR_O <= #UDLY MB_ADR_O + incr_unit; 1.538 + if (incr_unit == 3'b001) 1.539 + MB_SEL_O <= #UDLY {MB_SEL_O[0], MB_SEL_O[3:1]}; 1.540 + else 1.541 + if (incr_unit == 3'b010) 1.542 + MB_SEL_O <= #UDLY {MB_SEL_O[1:0], MB_SEL_O[3:2]}; 1.543 + end 1.544 + end 1.545 + end 1.546 + 1.547 + if(!fifo_empty && !donot_start_again) 1.548 + begin 1.549 + if(start_flag) 1.550 + begin 1.551 + set_cti_b; 1.552 + status2 <= #UDLY ST_WRITE_WAIT; 1.553 + read_fifo; 1.554 + burst_cnt2 <= #UDLY reg_bt1 ? (reg_bt0 ? 5'h1f : 5'hf) : (reg_bt0 ? 5'h7 : 5'h3); 1.555 + end 1.556 + else 1.557 + begin 1.558 + if(!reg_d_con) 1.559 + MB_ADR_O <= #UDLY MB_ADR_O + incr_unit; 1.560 + if (incr_unit == 3'b001) 1.561 + MB_SEL_O <= #UDLY {MB_SEL_O[0], MB_SEL_O[3:1]}; 1.562 + else 1.563 + if (incr_unit == 3'b010) 1.564 + MB_SEL_O <= #UDLY {MB_SEL_O[1:0], MB_SEL_O[3:2]}; 1.565 + status2 <= #UDLY ST_WRADDR; 1.566 + read_fifo; 1.567 + burst_cnt2 <= #UDLY reg_bt1 ? (reg_bt0 ? 5'h1f : 5'hf) : (reg_bt0 ? 5'h7 : 5'h3); 1.568 + end 1.569 + end 1.570 + end_of_transfer <= #UDLY 1'b0; 1.571 + burst_completed <= #UDLY 1'b0; 1.572 + reg_interrupt2 <= #UDLY 1'b0; 1.573 + end 1.574 + 1.575 + ST_FIFO_EMPTY: 1.576 + begin 1.577 + if(fifo_empty) 1.578 + begin 1.579 + status2 <= #UDLY ST_WRITE_IDLE; 1.580 + donot_start_again <= #UDLY 1'b0; 1.581 + end 1.582 + end 1.583 + 1.584 + ST_WRADDR: 1.585 + begin 1.586 + burst_cnt2 <= #UDLY burst_size2; 1.587 + MB_CYC_O <= #UDLY 1'b1; 1.588 + MB_STB_O <= #UDLY 1'b1; 1.589 + 1.590 + if (fifo_aempty && (burst_size2 > 5'h2)) 1.591 + begin 1.592 + MB_CTI_O <= #UDLY 3'b000; 1.593 + status2 <= #UDLY ST_FIFO_AEMPTY; 1.594 + fifo_rd <= #UDLY 1'b0; 1.595 + end 1.596 + else 1.597 + begin 1.598 + set_cti_b; 1.599 + status2 <= #UDLY ST_WRITE; 1.600 + end 1.601 + end 1.602 + 1.603 + ST_WRITE_WAIT: 1.604 + begin 1.605 + MB_CYC_O <= #UDLY 1'b1; 1.606 + MB_STB_O <= #UDLY 1'b1; 1.607 + 1.608 + if (fifo_aempty && (burst_size2 > 5'h2)) 1.609 + begin 1.610 + MB_CTI_O <= #UDLY 3'b000; 1.611 + status2 <= #UDLY ST_FIFO_AEMPTY; 1.612 + fifo_rd <= #UDLY 1'b0; 1.613 + end 1.614 + else 1.615 + begin 1.616 + set_cti_b; 1.617 + status2 <= #UDLY ST_WRITE; 1.618 + end 1.619 + end 1.620 + 1.621 + ST_FIFO_AEMPTY: 1.622 + begin 1.623 + if (MB_ACK_I) 1.624 + begin 1.625 + MB_CYC_O <= #UDLY 1'b0; 1.626 + MB_STB_O <= #UDLY 1'b0; 1.627 + 1.628 + burst_cnt2 <= #UDLY burst_cnt2 - 1; 1.629 + 1.630 + if (!reg_d_con) 1.631 + MB_ADR_O <= #UDLY MB_ADR_O + incr_unit; 1.632 + 1.633 + if (incr_unit == 3'b001) 1.634 + MB_SEL_O <= #UDLY {MB_SEL_O[0], MB_SEL_O[3:1]}; 1.635 + else 1.636 + if (incr_unit == 3'b010) 1.637 + MB_SEL_O <= #UDLY {MB_SEL_O[1:0], MB_SEL_O[3:2]}; 1.638 + end 1.639 + 1.640 + if (!MB_CYC_O && !fifo_aempty) 1.641 + begin 1.642 + status2 <= #UDLY ST_FIFO_RESUME; 1.643 + read_fifo; 1.644 + end 1.645 + end 1.646 + 1.647 + ST_FIFO_RESUME: 1.648 + begin 1.649 + MB_CYC_O <= #UDLY 1'b1; 1.650 + MB_STB_O <= #UDLY 1'b1; 1.651 + 1.652 + if (fifo_aempty && (burst_cnt2 > 5'h2)) 1.653 + begin 1.654 + MB_CTI_O <= #UDLY 3'b000; 1.655 + status2 <= #UDLY ST_FIFO_AEMPTY; 1.656 + fifo_rd <= #UDLY 1'b0; 1.657 + end 1.658 + else 1.659 + begin 1.660 + set_cti_b; 1.661 + status2 <= #UDLY ST_WRITE; 1.662 + end 1.663 + end 1.664 + 1.665 + ST_WRITE: 1.666 + begin 1.667 + if (MB_ACK_I) 1.668 + begin 1.669 + if(var_length2) 1.670 + begin 1.671 + if(burst_cnt2 == 0) 1.672 + begin 1.673 + MB_CYC_O <= #UDLY 1'b0; 1.674 + MB_STB_O <= #UDLY 1'b0; 1.675 + MB_CTI_O <= #UDLY 3'h0; 1.676 + end_of_transfer <= #UDLY 1'b1; 1.677 + status2 <= #UDLY ST_WRITE_IDLE; 1.678 + fifo_rd <= #UDLY 1'b0; 1.679 + burst_cnt2 <= #UDLY burst_size2; 1.680 + end 1.681 + else 1.682 + begin 1.683 + if(burst_cnt2 == 1) 1.684 + MB_CTI_O <= #UDLY 3'h7; 1.685 + else 1.686 + set_cti_b; 1.687 + if(!reg_d_con) 1.688 + MB_ADR_O <= #UDLY MB_ADR_O + incr_unit; 1.689 + if (incr_unit == 3'b001) 1.690 + MB_SEL_O <= #UDLY {MB_SEL_O[0], MB_SEL_O[3:1]}; 1.691 + else 1.692 + if (incr_unit == 3'b010) 1.693 + MB_SEL_O <= #UDLY {MB_SEL_O[1:0], MB_SEL_O[3:2]}; 1.694 + read_fifo; 1.695 + burst_cnt2 <= #UDLY burst_cnt2 - 1; 1.696 + end 1.697 + end 1.698 + else 1.699 + begin 1.700 + if(burst_cnt2 == 0) 1.701 + begin 1.702 + MB_CYC_O <= #UDLY 1'b0; 1.703 + MB_STB_O <= #UDLY 1'b0; 1.704 + MB_CTI_O <= #UDLY 3'h0; 1.705 + reg_cntlg_burst <= #UDLY 1'b1; 1.706 + status2 <= #UDLY ST_CNTLNGTH; 1.707 + fifo_rd <= #UDLY 1'b0; 1.708 + burst_cnt2 <= #UDLY burst_size2; 1.709 + end 1.710 + else 1.711 + begin 1.712 + if ((fifo_aempty && (burst_cnt2 > 5'h2)) || (burst_cnt2 == 5'h1)) 1.713 + MB_CTI_O <= #UDLY 3'h7; 1.714 + else 1.715 + set_cti_b; 1.716 + 1.717 + burst_cnt2 <= #UDLY burst_cnt2 - 1; 1.718 + 1.719 + if(!reg_d_con) 1.720 + MB_ADR_O <= #UDLY MB_ADR_O + incr_unit; 1.721 + 1.722 + if (incr_unit == 3'b001) 1.723 + MB_SEL_O <= #UDLY {MB_SEL_O[0], MB_SEL_O[3:1]}; 1.724 + else 1.725 + if (incr_unit == 3'b010) 1.726 + MB_SEL_O <= #UDLY {MB_SEL_O[1:0], MB_SEL_O[3:2]}; 1.727 + 1.728 + if (fifo_aempty && (burst_cnt2 > 5'h2)) 1.729 + begin 1.730 + status2 <= #UDLY ST_FIFO_AEMPTY; 1.731 + fifo_rd <= 1'b0; 1.732 + end 1.733 + else 1.734 + read_fifo; 1.735 + end 1.736 + end 1.737 + end 1.738 + 1.739 + else if(MB_RTY_I) 1.740 + begin 1.741 + if(var_length2) 1.742 + begin 1.743 + MB_CYC_O <= #UDLY 1'b0; 1.744 + MB_STB_O <= #UDLY 1'b0; 1.745 + MB_CTI_O <= #UDLY 3'h0; 1.746 + status2 <= #UDLY ST_WRITE_IDLE; 1.747 + reg_status2 <= #UDLY 1'b0; 1.748 + reg_interrupt2 <= #UDLY 1'b1; 1.749 + var_length2 <= #UDLY 1'b0; 1.750 + donot_start_again <= #UDLY 1'b1; 1.751 + fifo_rd <= #UDLY 1'b0; 1.752 + end 1.753 + end // if (MB_RTY_I) 1.754 + 1.755 + else if(MB_ERR_I) 1.756 + begin 1.757 + MB_CYC_O <= #UDLY 1'b0; 1.758 + MB_STB_O <= #UDLY 1'b0; 1.759 + MB_CTI_O <= #UDLY 3'h0; 1.760 + status2 <= #UDLY ST_WRITE_IDLE; 1.761 + reg_status2 <= #UDLY 1'b1; 1.762 + reg_interrupt2 <= #UDLY 1'b1; 1.763 + donot_start_again <= #UDLY 1'b1; 1.764 + fifo_rd <= #UDLY 1'b0; 1.765 + end // if (MB_ERR_I) 1.766 + 1.767 + end 1.768 + 1.769 + ST_CNTLNGTH: 1.770 + begin 1.771 + reg_cntlg_burst <= #UDLY 1'b0; 1.772 + status2 <= #UDLY ST_JUSTICE; 1.773 + end 1.774 + 1.775 + ST_JUSTICE: 1.776 + begin 1.777 + if(!(|data_length)) 1.778 + begin 1.779 + status2 <= #UDLY ST_WRITE_IDLE; 1.780 + reg_status2 <= #UDLY 1'b0; 1.781 + reg_interrupt2 <= #UDLY 1'b1; 1.782 + burst_completed <= #UDLY 1'b1; 1.783 + end 1.784 + else 1.785 + begin 1.786 + end_of_transfer <= #UDLY 1'b1; 1.787 + status2 <= ST_WRITE_IDLE; 1.788 + end 1.789 + end 1.790 + 1.791 + default: 1.792 + begin 1.793 + status2 <= #UDLY ST_WRITE_IDLE; 1.794 + MB_ADR_O <= #UDLY 32'h0; 1.795 + MB_SEL_O <= #UDLY 4'b1111; 1.796 + MB_CYC_O <= #UDLY 1'b0; 1.797 + MB_CTI_O <= #UDLY 3'h0; 1.798 + MB_STB_O <= #UDLY 1'b0; 1.799 + reg_status2 <= #UDLY 1'b0; 1.800 + reg_interrupt2 <= #UDLY 1'b0; 1.801 + reg_cntlg_burst <= #UDLY 1'b0; 1.802 + burst_size2 <= #UDLY 5'h0; 1.803 + burst_cnt2 <= #UDLY 5'h0; 1.804 + fifo_rd <= #UDLY 1'b0; 1.805 + end_of_transfer <= #UDLY 1'b0; 1.806 + var_length2 <= #UDLY 1'b0; 1.807 + burst_completed <= #UDLY 1'b0; 1.808 + donot_start_again <= #UDLY 1'b0; 1.809 + end 1.810 + endcase 1.811 + end 1.812 + end 1.813 + else begin 1.814 + // Read/Write Normal 1.815 + case(status) 1.816 + 1.817 + ST_IDLE1: 1.818 + begin 1.819 + if(reg_start | latch_start) 1.820 + begin 1.821 + if(fifo_empty) 1.822 + begin 1.823 + if(latch_start) 1.824 + latch_start <= #UDLY 1'b0; 1.825 + status <= #UDLY ST_READ1; 1.826 + MA_CYC_O <= #UDLY 1'b1; 1.827 + MA_STB_O <= #UDLY 1'b1; 1.828 + MA_ADR_O <= #UDLY reg_00_data; 1.829 + case (reg_00_data[1:0]) 1.830 + 2'b01: MA_SEL_O <= #UDLY {1'b0,M_SEL_O[3:1]}; 1.831 + 2'b10: MA_SEL_O <= #UDLY {2'b00,M_SEL_O[3:2]}; 1.832 + 2'b11: MA_SEL_O <= #UDLY {3'b00,M_SEL_O[3:3]}; 1.833 + default: 1.834 + MA_SEL_O <= #UDLY M_SEL_O; 1.835 + endcase 1.836 + MB_ADR_O <= #UDLY reg_04_data; 1.837 + case (reg_04_data[1:0]) 1.838 + 2'b01: MB_SEL_O <= #UDLY {1'b0,M_SEL_O[3:1]}; 1.839 + 2'b10: MB_SEL_O <= #UDLY {2'b00,M_SEL_O[3:2]}; 1.840 + 2'b11: MB_SEL_O <= #UDLY {3'b00,M_SEL_O[3:3]}; 1.841 + default: 1.842 + MB_SEL_O <= #UDLY M_SEL_O; 1.843 + endcase 1.844 + set_cti_a; 1.845 + start_flag <= #UDLY 1'b1; 1.846 + if(!(|data_length)) 1.847 + var_length <= #UDLY 1'b1; 1.848 + else 1.849 + var_length <= #UDLY 1'b0; 1.850 + burst_size <= #UDLY 5'h0; 1.851 + burst_cnt <= #UDLY 5'h0; 1.852 + end 1.853 + else 1.854 + begin 1.855 + status <= #UDLY ST_RDFIFO1; 1.856 + end 1.857 + end 1.858 + else 1.859 + begin 1.860 + status <= #UDLY ST_IDLE1; 1.861 + end 1.862 + reg_interrupt_normal <= #UDLY 1'b0; 1.863 + end 1.864 + ST_RDFIFO1: 1.865 + begin 1.866 + if(fifo_empty) 1.867 + begin 1.868 + status <= #UDLY ST_IDLE1; 1.869 + fifo_clear <= #UDLY 1'b0; 1.870 + latch_start <= #UDLY 1'b1; 1.871 + end 1.872 + else 1.873 + fifo_clear <= #UDLY !fifo_clear; 1.874 + end 1.875 + 1.876 + ST_RDADDR1: 1.877 + begin 1.878 + MA_CYC_O <= #UDLY 1'b1; 1.879 + MA_STB_O <= #UDLY 1'b1; 1.880 + set_cti_a; 1.881 + status <= #UDLY ST_READ1; 1.882 + direct_data <= #UDLY 1'b1; 1.883 + end 1.884 + 1.885 + ST_READ1: 1.886 + begin 1.887 + if(!start_flag) 1.888 + write_fifo; 1.889 + if(MA_ACK_I) 1.890 + begin 1.891 + if(start_flag) 1.892 + begin 1.893 + MA_CYC_O <= #UDLY 1'b0; 1.894 + MA_STB_O <= #UDLY 1'b0; 1.895 + MA_CTI_O <= #UDLY 3'h0; 1.896 + MB_CYC_O <= #UDLY 1'b1; 1.897 + MB_STB_O <= #UDLY 1'b1; 1.898 + set_cti_b; 1.899 + status <= #UDLY ST_WRITE1; 1.900 + start_flag <= #UDLY 1'b0; 1.901 + burst_cnt <= #UDLY burst_size; 1.902 + end 1.903 + else 1.904 + begin 1.905 + MA_CYC_O <= #UDLY 1'b0; 1.906 + MA_STB_O <= #UDLY 1'b0; 1.907 + MA_CTI_O <= #UDLY 3'h0; 1.908 + if(!reg_d_con) 1.909 + begin 1.910 + MB_ADR_O <= #UDLY MB_ADR_O + incr_unit; 1.911 + if (incr_unit == 3'b001) 1.912 + MB_SEL_O <= #UDLY {MB_SEL_O[0], MB_SEL_O[3:1]}; 1.913 + else 1.914 + if (incr_unit == 3'b010) 1.915 + MB_SEL_O <= #UDLY {MB_SEL_O[1:0], MB_SEL_O[3:2]}; 1.916 + end 1.917 + status <= #UDLY ST_WRADDR1; 1.918 + burst_cnt <= #UDLY burst_size; 1.919 + end 1.920 + end 1.921 + else if(MA_RTY_I) 1.922 + begin 1.923 + if(var_length) 1.924 + begin 1.925 + MA_CYC_O <= #UDLY 1'b0; 1.926 + MA_STB_O <= #UDLY 1'b0; 1.927 + MA_CTI_O <= #UDLY 3'h0; 1.928 + status <= #UDLY ST_IDLE1; 1.929 + reg_status_normal <= #UDLY 1'b0; 1.930 + reg_interrupt_normal <= #UDLY 1'b1; 1.931 + end 1.932 + end 1.933 + else if(MA_ERR_I) 1.934 + begin 1.935 + MA_CYC_O <= #UDLY 1'b0; 1.936 + MA_STB_O <= #UDLY 1'b0; 1.937 + MA_CTI_O <= #UDLY 3'h0; 1.938 + status <= #UDLY ST_IDLE1; 1.939 + reg_status_normal <= #UDLY 1'b1; 1.940 + reg_interrupt_normal <= #UDLY 1'b1; 1.941 + end 1.942 + end 1.943 + 1.944 + ST_WRADDR1: 1.945 + begin 1.946 + fifo_wr <= #UDLY 1'b0; 1.947 + MB_CYC_O <= #UDLY 1'b1; 1.948 + MB_STB_O <= #UDLY 1'b1; 1.949 + burst_cnt <= #UDLY burst_size; 1.950 + set_cti_b; 1.951 + status <= #UDLY ST_WRITE1; 1.952 + read_fifo; 1.953 + end 1.954 + 1.955 + ST_WRITE1: 1.956 + begin 1.957 + if(fifo_wr) 1.958 + fifo_wr <= #UDLY 1'b0; 1.959 + if(MB_ACK_I) 1.960 + begin 1.961 + direct_data <= #UDLY 1'b0; 1.962 + if(var_length) 1.963 + begin 1.964 + MB_CYC_O <= #UDLY 1'b0; 1.965 + MB_STB_O <= #UDLY 1'b0; 1.966 + MB_CTI_O <= #UDLY 3'h0; 1.967 + if(!reg_s_con) 1.968 + begin 1.969 + MA_ADR_O <= #UDLY MA_ADR_O + incr_unit; 1.970 + if (incr_unit == 3'b001) 1.971 + MA_SEL_O <= #UDLY {MA_SEL_O[0], MA_SEL_O[3:1]}; 1.972 + else 1.973 + if (incr_unit == 3'b010) 1.974 + MA_SEL_O <= #UDLY {MA_SEL_O[1:0], MA_SEL_O[3:2]}; 1.975 + end 1.976 + status <= #UDLY ST_RDADDR1; 1.977 + fifo_rd <= #UDLY 1'b0; 1.978 + burst_cnt <= #UDLY burst_size; 1.979 + end 1.980 + else 1.981 + begin 1.982 + MB_CYC_O <= #UDLY 1'b0; 1.983 + MB_STB_O <= #UDLY 1'b0; 1.984 + MB_CTI_O <= #UDLY 3'h0; 1.985 + reg_cntlg_normal <= #UDLY 1'b1; 1.986 + status <= #UDLY ST_CNTLNGTH1; 1.987 + fifo_rd <= #UDLY 1'b0; 1.988 + burst_cnt <= #UDLY burst_size; 1.989 + end 1.990 + end 1.991 + else if(MB_RTY_I) 1.992 + begin 1.993 + if(var_length) 1.994 + begin 1.995 + MB_CYC_O <= #UDLY 1'b0; 1.996 + MB_STB_O <= #UDLY 1'b0; 1.997 + MB_CTI_O <= #UDLY 3'h0; 1.998 + status <= #UDLY ST_IDLE1; 1.999 + reg_status_normal <= #UDLY 1'b0; 1.1000 + reg_interrupt_normal <= #UDLY 1'b1; 1.1001 + var_length <= #UDLY 1'b0; 1.1002 + fifo_rd <= #UDLY 1'b0; 1.1003 + end 1.1004 + end 1.1005 + else if(MB_ERR_I) 1.1006 + begin 1.1007 + MB_CYC_O <= #UDLY 1'b0; 1.1008 + MB_STB_O <= #UDLY 1'b0; 1.1009 + MB_CTI_O <= #UDLY 3'h0; 1.1010 + status <= #UDLY ST_IDLE1; 1.1011 + reg_status_normal <= #UDLY 1'b1; 1.1012 + reg_interrupt_normal <= #UDLY 1'b1; 1.1013 + fifo_rd <= #UDLY 1'b0; 1.1014 + end 1.1015 + end 1.1016 + 1.1017 + ST_CNTLNGTH1: 1.1018 + begin 1.1019 + reg_cntlg_normal <= #UDLY 1'b0; 1.1020 + status <= #UDLY ST_JUSTICE1; 1.1021 + end 1.1022 + 1.1023 + ST_JUSTICE1: 1.1024 + begin 1.1025 + if(!(|data_length)) 1.1026 + begin 1.1027 + status <= #UDLY ST_IDLE1; 1.1028 + reg_status_normal <= #UDLY 1'b0; 1.1029 + reg_interrupt_normal <= #UDLY 1'b1; 1.1030 + end 1.1031 + else 1.1032 + begin 1.1033 + if(!reg_s_con) 1.1034 + begin 1.1035 + MA_ADR_O <= #UDLY MA_ADR_O + incr_unit; 1.1036 + if (incr_unit == 3'b001) 1.1037 + MA_SEL_O <= #UDLY {MA_SEL_O[0], MA_SEL_O[3:1]}; 1.1038 + else 1.1039 + if (incr_unit == 3'b010) 1.1040 + MA_SEL_O <= #UDLY {MA_SEL_O[1:0], MA_SEL_O[3:2]}; 1.1041 + end 1.1042 + status <= #UDLY ST_RDADDR1; 1.1043 + end 1.1044 + end 1.1045 + 1.1046 + default: 1.1047 + begin 1.1048 + status <= #UDLY ST_IDLE1; 1.1049 + var_length <= #UDLY 1'b0; 1.1050 + MA_CYC_O <= #UDLY 1'b0; 1.1051 + MA_CTI_O <= #UDLY 3'h0; 1.1052 + MB_CYC_O <= #UDLY 1'b0; 1.1053 + MB_CTI_O <= #UDLY 3'h0; 1.1054 + MA_STB_O <= #UDLY 1'b0; 1.1055 + MB_STB_O <= #UDLY 1'b0; 1.1056 + reg_status_normal <= #UDLY 1'b0; 1.1057 + reg_interrupt_normal <= #UDLY 1'b0; 1.1058 + reg_cntlg_normal <= #UDLY 1'b0; 1.1059 + burst_size <= #UDLY 3'h0; 1.1060 + burst_cnt <= #UDLY 3'h0; 1.1061 + fifo_wr <= #UDLY 1'b0; 1.1062 + fifo_rd <= #UDLY 1'b0; 1.1063 + fifo_clear <= #UDLY 1'b0; 1.1064 + latch_start <= #UDLY 1'b0; 1.1065 + direct_data <= #UDLY 1'b0; 1.1066 + end 1.1067 + endcase 1.1068 + end 1.1069 + end 1.1070 + 1.1071 + //Task for generating write enable to the FIFO 1.1072 + task write_fifo; 1.1073 + begin 1.1074 + if(MA_ACK_I) 1.1075 + begin 1.1076 + fifo_wr <= #UDLY 1'b1; 1.1077 + fifo_din <= #UDLY MA_DAT_I; 1.1078 + end 1.1079 + else 1.1080 + begin 1.1081 + fifo_wr <= #UDLY 1'b0; 1.1082 + end 1.1083 + end 1.1084 + endtask 1.1085 + 1.1086 + //Task for generating read enable signal to the FIFO 1.1087 + task read_fifo; 1.1088 + begin 1.1089 + fifo_rd <= #UDLY 1'b1; 1.1090 + end 1.1091 + endtask 1.1092 + 1.1093 + //Task for setting wishbone CTI signal for read 1.1094 + //master port depending upon whether request is for burst 1.1095 + //transfer or classic cycle. 1.1096 + task set_cti_a; 1.1097 + begin 1.1098 + if(reg_bt2) 1.1099 + begin 1.1100 + if(reg_s_con) 1.1101 + MA_CTI_O <= #UDLY 3'b001; 1.1102 + else 1.1103 + MA_CTI_O <= #UDLY 3'b010; 1.1104 + end 1.1105 + else 1.1106 + MA_CTI_O <= #UDLY 3'b000; 1.1107 + end 1.1108 + endtask 1.1109 + 1.1110 + //Task for setting wishbone CTI signal for write 1.1111 + //master port depending upon whether request is for burst 1.1112 + //transfer or classic cycle. 1.1113 + task set_cti_b; 1.1114 + begin 1.1115 + if(reg_bt2) begin 1.1116 + if(reg_d_con) 1.1117 + MB_CTI_O <= #UDLY 3'b001; 1.1118 + else 1.1119 + MB_CTI_O <= #UDLY 3'b010; 1.1120 + end else 1.1121 + MB_CTI_O <= #UDLY 3'b000; 1.1122 + end 1.1123 + endtask 1.1124 + 1.1125 + //RdEn 1.1126 + reg fifo_rd_dly; 1.1127 + always @(posedge CLK_I or posedge RST_I) 1.1128 + if(RST_I) 1.1129 + fifo_rd_dly <= #UDLY 1'b0; 1.1130 + else 1.1131 + fifo_rd_dly <= #UDLY fifo_rd; 1.1132 + 1.1133 + wire RdEn = fifo_rd & (!fifo_rd_dly | (reg_bt2 ? (burst_cnt2[5:0] != 5'b00000) : (burst_cnt[5:0] != 5'b00000)) & MB_ACK_I) | fifo_clear; 1.1134 + 1.1135 + generate 1.1136 + if (lat_family == "SC" || lat_family == "SCM") begin 1.1137 + 1.1138 + pmi_fifo_dc #(.pmi_data_width_w(32), 1.1139 + .pmi_data_width_r(32), 1.1140 + .pmi_data_depth_w(32), 1.1141 + .pmi_data_depth_r(32), 1.1142 + .pmi_full_flag(32), 1.1143 + .pmi_empty_flag(0), 1.1144 + .pmi_almost_full_flag(28), 1.1145 + .pmi_almost_empty_flag(4), 1.1146 + .pmi_regmode("noreg"), 1.1147 + .pmi_family(`LATTICE_FAMILY), 1.1148 + .module_type("pmi_fifo_dc"), 1.1149 + .pmi_implementation(FIFO_IMPLEMENTATION)) 1.1150 + dma_fifo_dc ( 1.1151 + .Data(fifo_din), 1.1152 + .WrClock(CLK_I), 1.1153 + .RdClock(CLK_I), 1.1154 + .WrEn (fifo_wr), 1.1155 + .RdEn (RdEn), 1.1156 + .Reset (RST_I), 1.1157 + .RPReset(RST_I), 1.1158 + .Q (fifo_dout), 1.1159 + .Empty (fifo_empty), 1.1160 + .Full (), 1.1161 + .AlmostEmpty (), 1.1162 + .AlmostFull ()); 1.1163 + 1.1164 + 1.1165 + 1.1166 + end else begin 1.1167 + pmi_fifo #(.pmi_data_width(32), 1.1168 + .pmi_data_depth(32), 1.1169 + .pmi_full_flag(32), 1.1170 + .pmi_empty_flag(0), 1.1171 + .pmi_almost_full_flag(28), 1.1172 + .pmi_almost_empty_flag(1), 1.1173 + .pmi_regmode("noreg"), 1.1174 + .pmi_family(`LATTICE_FAMILY), 1.1175 + .module_type("pmi_fifo"), 1.1176 + .pmi_implementation(FIFO_IMPLEMENTATION)) 1.1177 + dma_fifo (.Data (fifo_din), 1.1178 + .Clock (CLK_I), 1.1179 + .WrEn (fifo_wr), 1.1180 + .RdEn (RdEn), 1.1181 + .Reset (RST_I), 1.1182 + .Q (fifo_dout), 1.1183 + .Empty (fifo_empty), 1.1184 + .Full (), 1.1185 + .AlmostEmpty (fifo_aempty), 1.1186 + .AlmostFull ()); 1.1187 + end 1.1188 + endgenerate 1.1189 + 1.1190 +endmodule // MASTER_CTRL 1.1191 + 1.1192 +`endif // MASTER_CTRL_FILE