⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 afifo36_internal.v

📁 DDR2源代码 DDR2源代码 DDR2源代码
💻 V
📖 第 1 页 / 共 5 页
字号:
	    deassign rd_prefetch;	    deassign wr_addr;	    deassign wr1_addr;	    deassign rdcount_flag;	    deassign rd_flag;	    deassign rdprefetch_flag;	    deassign wr_flag;	    deassign wr1_flag;	    deassign awr_flag;	    	end    initial begin	case (DATA_WIDTH)	    4 : begin		    if (FIFO_SIZE == 36)			addr_limit = 8192;		    else			addr_limit = 4096;		end	    9 : begin		    if (FIFO_SIZE == 36)			addr_limit = 4096;		    else			addr_limit = 2048;		end	   18 : begin	            if (FIFO_SIZE == 36)			addr_limit = 2048;		    else			addr_limit = 1024;		end	   36 : begin	            if (FIFO_SIZE == 36)			addr_limit = 1024;		    else			addr_limit = 512;		end	   72 : begin		    addr_limit = 512;		end	endcase		case (EN_SYN)	    "FALSE" : sync = 0;	    "TRUE" : sync = 1;	endcase // case(EN_SYN)	case (FIRST_WORD_FALL_THROUGH)	    "FALSE" : begin		          fwft = 0;		          if (EN_SYN == "FALSE") begin			      ae_empty = ALMOST_EMPTY_OFFSET - 1;	                      ae_full = ALMOST_FULL_OFFSET;			  end			  else begin			      ae_empty = ALMOST_EMPTY_OFFSET;	                      ae_full = ALMOST_FULL_OFFSET;			  end		      end	    "TRUE"  : begin		          fwft = 1;		          ae_empty = ALMOST_EMPTY_OFFSET - 2;	                  ae_full = ALMOST_FULL_OFFSET;	              end	endcase	    end // initial begin        always @(posedge RDCLK) begin	if (sync == 1'b1) begin	    do_outreg = do_out;	    dop_outreg = dop_out;	    if (RDEN == 1'b1) begin		if (empty_out == 1'b0) begin		    		    do_out = mem[rdcount_out];		    dop_out = memp[rdcount_out];		    		    rdcount_out = (rdcount_out + 1) % addr_limit;		    		    if (rdcount_out == 0)			rdcount_flag = ~rdcount_flag;		end	    end 	    rderr_out = (RDEN == 1'b1) && (empty_out == 1'b1);	    	    	    if (WREN == 1'b1) begin		empty_out = 1'b0;	    end	    else if (rdcount_out == wr_addr && rdcount_flag == wr_flag)		empty_out = 1'b1;	    if ((((rdcount_out + ae_empty) >= wr_addr) && (rdcount_flag == wr_flag)) || (((rdcount_out + ae_empty) >= (wr_addr + addr_limit) && (rdcount_flag != wr_flag)))) begin		almostempty_out = 1'b1;	    end	    if ((((rdcount_out + addr_limit) > (wr_addr + ae_full)) && (rdcount_flag == wr_flag)) || ((rdcount_out > (wr_addr + ae_full)) && (rdcount_flag != wr_flag))) begin		if (wr_addr <= wr_addr + ae_full || rdcount_flag == wr_flag)		    almostfull_out = 1'b0;	    end	end	else if (sync == 1'b0) begin	    rden_reg = RDEN;	    if (fwft == 1'b0) begin		if ((rden_reg == 1'b1) && (rd_addr != rdcount_out)) begin		    do_out = do_in;		    if (DATA_WIDTH != 4) 			dop_out = dop_in;		    rd_addr = (rd_addr + 1) % addr_limit;		    if (rd_addr == 0)			rd_flag = ~rd_flag;		end		if (((rd_addr == rdcount_out) && (empty_ram[3] == 1'b0)) ||		    ((rden_reg == 1'b1) && (empty_ram[1] == 1'b0))) begin		    do_in = mem[rdcount_out];		    dop_in = memp[rdcount_out];		    		    #1;		    rdcount_out = (rdcount_out + 1) % addr_limit;		    if (rdcount_out == 0) begin			rdcount_flag = ~rdcount_flag;		    end		end	    end	    if (fwft == 1'b1) begin		if ((rden_reg == 1'b1) && (rd_addr != rd_prefetch)) begin		    rd_prefetch = (rd_prefetch + 1) % addr_limit;		    if (rd_prefetch == 0)			rdprefetch_flag = ~rdprefetch_flag;		end		if ((rd_prefetch == rd_addr) && (rd_addr != rdcount_out)) begin		    do_out = do_in;		    if (DATA_WIDTH != 4) 			dop_out = dop_in;		    rd_addr = (rd_addr + 1) % addr_limit;		    if (rd_addr == 0)			rd_flag = ~rd_flag;		end		if (((rd_addr == rdcount_out) && (empty_ram[3] == 1'b0)) ||		    ((rden_reg == 1'b1) && (empty_ram[1] == 1'b0)) ||		    ((rden_reg == 1'b0) && (empty_ram[1] == 1'b0) && (rd_addr == rdcount_out))) begin		    		    do_in = mem[rdcount_out];		    dop_in = memp[rdcount_out];				    #1;		    rdcount_out = (rdcount_out + 1) % addr_limit;		    if (rdcount_out == 0)			rdcount_flag = ~rdcount_flag;		end	    end // if (fwft == 1'b1)	    	    	    rderr_out = (rden_reg == 1'b1) && (empty_out == 1'b1);	    almostempty_out = almostempty_int[3];	    if ((((rdcount_out + ae_empty) >= wr_addr) && (rdcount_flag == awr_flag)) || (((rdcount_out + ae_empty) >= (wr_addr + addr_limit)) && (rdcount_flag != awr_flag))) begin		almostempty_int[3] = 1'b1;		almostempty_int[2] = 1'b1;		almostempty_int[1] = 1'b1;		almostempty_int[0] = 1'b1;	    end	    else if (almostempty_int[2] == 1'b0) begin		if (rdcount_out <= rdcount_out + ae_empty || rdcount_flag != awr_flag) begin		    almostempty_int[3] = almostempty_int[0];		    almostempty_int[0] = 1'b0;		    end	    end	    	    if ((((rdcount_out + addr_limit) > (wr_addr + ae_full)) && (rdcount_flag == awr_flag)) || ((rdcount_out > (wr_addr + ae_full)) && (rdcount_flag != awr_flag))) begin		if (((rden_reg == 1'b1) && (empty_out == 1'b0)) || ((((rd_addr + 1) % addr_limit) == rdcount_out) && (almostfull_int[1] == 1'b1))) begin		    almostfull_int[2] = almostfull_int[1];		    almostfull_int[1] = 1'b0;		end	    end	    else begin		almostfull_int[2] = 1'b1;		almostfull_int[1] = 1'b1;	    end	    if (fwft == 1'b0) begin		if ((rdcount_out == rd_addr) && (rdcount_flag == rd_flag)) begin		    empty_out = 1'b1;		end		else begin		    empty_out = 1'b0;		end	    end // if (fwft == 1'b0)	    else if (fwft == 1'b1) begin		if ((rd_prefetch == rd_addr) && (rdprefetch_flag == rd_flag)) begin		    empty_out = 1'b1;		end		else begin		    empty_out = 1'b0;		end	    end	    if ((rdcount_out == wr_addr) && (rdcount_flag == awr_flag)) begin		empty_ram[2] = 1'b1;		empty_ram[1] = 1'b1;		empty_ram[0] = 1'b1;	    end	    else begin		empty_ram[2] = empty_ram[1];		empty_ram[1] = empty_ram[0];		empty_ram[0] = 1'b0;	    end	    	    if ((rdcount_out == wr1_addr) && (rdcount_flag == wr1_flag)) begin		empty_ram[3] = 1'b1;	    end	    else begin		empty_ram[3] = 1'b0;	    end	    wr1_addr = wr_addr;	    wr1_flag = awr_flag;	end // if (sync == 1'b0)    end // always @ (posedge RDCLK)        always @(posedge WRCLK) begin	if (sync == 1'b1) begin	    if (WREN == 1'b1) begin		if (full_out == 1'b0) begin		    mem[wr_addr] = DI;		    memp[wr_addr] = DIP;		    		    wr_addr = (wr_addr + 1) % addr_limit;		    if (wr_addr == 0)			wr_flag = ~wr_flag;		end			    end 	    wrerr_out = (WREN == 1'b1) && (full_out == 1'b1);	    	    	    if (RDEN == 1'b1) begin		full_out = 1'b0;	    end	    else if (rdcount_out == wr_addr && rdcount_flag != wr_flag)		full_out = 1'b1;	    if ((((rdcount_out + ae_empty) < wr_addr) && (rdcount_flag == wr_flag)) || (((rdcount_out + ae_empty) < (wr_addr + addr_limit) && (rdcount_flag != wr_flag)))) begin				if (rdcount_out <= rdcount_out + ae_empty || rdcount_flag != wr_flag)		    almostempty_out = 1'b0;	    end	    if ((((rdcount_out + addr_limit) <= (wr_addr + ae_full)) && (rdcount_flag == wr_flag)) || ((rdcount_out <= (wr_addr + ae_full)) && (rdcount_flag != wr_flag))) begin		almostfull_out = 1'b1;	    end	    	end	else if (sync == 1'b0) begin	    wren_reg = WREN;	    if (wren_reg == 1'b1 && (full_out == 1'b0)) begin				mem[wr_addr] = DI;		memp[wr_addr] = DIP;				#1;		wr_addr = (wr_addr + 1) % addr_limit;		if (wr_addr == 0)		    awr_flag = ~awr_flag;		if (wr_addr == addr_limit - 1)		    wr_flag = ~wr_flag;	    end	    wrerr_out = (wren_reg == 1'b1) && (full_out == 1'b1);	    almostfull_out = almostfull_int[3];	    if ((((rdcount_out + addr_limit) <= (wr_addr + ae_full)) && (rdcount_flag == awr_flag)) || ((rdcount_out <= (wr_addr + ae_full)) && (rdcount_flag != awr_flag))) begin		almostfull_int[3] = 1'b1;		almostfull_int[2] = 1'b1;		almostfull_int[1] = 1'b1;		almostfull_int[0] = 1'b1;	    end	    else if (almostfull_int[2] == 1'b0) begin		if (wr_addr <= wr_addr + ae_full || rdcount_flag == awr_flag) begin		    almostfull_int[3] = almostfull_int[0];		    almostfull_int[0] = 1'b0;		    end	    end	    if ((((rdcount_out + ae_empty) < wr_addr) && (rdcount_flag == awr_flag)) || (((rdcount_out + ae_empty) < (wr_addr + addr_limit)) && (rdcount_flag != awr_flag))) begin		if (wren_reg == 1'b1) begin		    almostempty_int[2] = almostempty_int[1];		    almostempty_int[1] = 1'b0;		end	    end	    else begin		almostempty_int[2] = 1'b1;		almostempty_int[1] = 1'b1;	    end	    if (wren_reg == 1'b1 || full_out == 1'b1)		full_out = full_int[1];	    if (((rdcount_out == wr_addr) || (rdcount_out - 1 == wr_addr || (rdcount_out + addr_limit - 1 == wr_addr))) && almostfull_out) begin		full_int[1] = 1'b1;		full_int[0] = 1'b1;	    end	    else begin		full_int[1] = full_int[0];		full_int[0] = 0;	    end	    	end // if (sync == 1'b0)    end // always @ (posedge WRCLK)        always @(do_out or dop_out or do_outreg or dop_outreg) begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -