You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
2.0 KiB
Verilog

// 该模块根据外部传进来的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