// 该模块根据外部传进来的fifo部分的管脚, 控制fifo的写入
// 复位完毕之后, 且fifo中式空的, 才开始写一些临时生成的数据, 直到写满
module fifo_wr(
    input wr_clk,
    input rst,

    input is_empty, // fifo中是否是空的, 该信号不是wr_clk时钟控制, 属于外部的读时钟域
    input is_almost_full, // 快满了
    input is_wr_rst_busy,  // 是否还在复位中, 可以进行写入操作本身了

    // 
    output reg fifo_wr_en,  // 是否打开写功能
    output reg [7:0] fifo_wr_data  // 需要写入的数据
);

// 对外部时钟域, is_empty 打拍, 获取同步到当前时钟域的 is_empty
reg is_empty_0;
reg is_empty_1;

always @(posedge wr_clk or negedge rst) begin
    if (!rst) begin
        is_empty_0 <= 1'b0;
        is_empty_1 <= 1'b0;
    end
    else begin
        is_empty_0 <= is_empty;
        is_empty_1 <= is_empty_0;
    end
end


// 对是否打开写功能, 进行控制
always @(posedge wr_clk or negedge rst) begin
    if (!rst) begin
        fifo_wr_en <= 1'b0;
    end
    else if (!is_wr_rst_busy) begin  // fifo 复位完毕
        if (is_empty_1) begin  // // 打两拍确定是空的, 才可以写入
            fifo_wr_en <= 1'b1;
        end
        else if(is_almost_full) begin  // 这其实是上个时钟周期的值了快写满了,还有1个空位, 
        // 如果当上个时钟周期和当前时钟周期之间有写入, 那当前时钟周期实际已经满了, 再写就溢出了
            fifo_wr_en <= 1'b0;
        end
        else begin
        end
    end
    else begin
    end
end


// 模拟生成写入的数据
always @(posedge wr_clk or negedge rst) begin
    if (!rst) begin
        fifo_wr_data <= 8'b0;
    end
    else if(fifo_wr_en && fifo_wr_data < 8'd254) begin  // ip核你输入256的深度, 但是只能写255个数据, 也是就是0~254
        fifo_wr_data <= fifo_wr_data + 8'b1;  // 最后253会走到这个分支, 进行加1 变成254, 也就是0~254
    end
    else begin
        fifo_wr_data <= 8'b0;
    end
end

endmodule