📄 afifo36_internal.v
字号:
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 + -