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
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 |