在工程中找到fifo IP核自动生成的.VEO后缀的文件,这里就是fifo使用时需要实例化的接口列表。
- reg [1:0] state; // 状态流转计数
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if(!sys_rst_n) begin
- fifo_wr_en <= 1'b0;
- fifo_wr_data <= 8'd0;
- state <= 2'd0;
- dly_cnt <= 4'd0;
- wr_fifo_cnt <=0;
- end
- else begin
- case(state)
- 2'd0: begin
- if(empty && /*数据有效标志*/) begin //如果检测到FIFO将被读空
- state <= 2'd1; //就进入延时状态
- end
- else
- state <= state;
- end
- 2'd1: begin
- if(dly_cnt == 4'd10) begin //延时10拍 原因是FIFO IP核内部状态信号的更新存在延时 延迟10拍以等待状态信号更新完毕
- dly_cnt <= 4'd0;
- state <= 2'd2; //开始写操作
- fifo_wr_en <= 1'b1; //打开写使能
- end
- else
- dly_cnt <= dly_cnt + 4'd1;
- end
- 2'd2: begin
- if(full) begin //等待FIFO将被写满
- fifo_wr_en <= 1'b0; //关闭写使能
- fifo_wr_data <= 8'd0;
- state <= 2'd0; //回到第一个状态
- end
- else begin //如果FIFO没有被写满
- fifo_wr_data <= /*要写的数据*/ ;
- fifo_wr_en <= 1'b1; //则持续打开写使能
- end
- end
- default : state <= 2'd0;
- endcase
- end
- end
- endmodule
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if(!sys_rst_n) begin
- fifo_rd_en <= 1'b0;
- state <= 2'd0;
- dly_cnt <= 4'd0;
- data_fifo_en<= 1'b0;
- end
- else begin
- data_fifo_en<=1'b0;
- case(state)
- 2'd0: begin
- if(full) //如果检测到FIFO将被写满
- state <= 2'd1; //就进入延时状态
- else
- state <= state;
- end
- 2'd1: begin
- if(dly_cnt == 4'd10) begin //延时10拍, 原因是FIFO IP核内部状态信号的更新存在延时, 延迟10拍以等待状态信号更新完毕
- dly_cnt <= 4'd0;
- state <= 2'd2; //开始读操作
- end
- else
- dly_cnt <= dly_cnt + 4'd1;
- end
- 2'd2: begin
- data_fifo_en<=1'b0;
- if(empty) begin //等待FIFO将被读空
- fifo_rd_en <= 1'b0; //关闭读使能
- state <= 2'd0; //回到第一个状态
- end
- else begin //如果FIFO没有被读空
- fifo_rd_en <= 1'b1; //则持续打开读使能
- data_fifo_en<=1'b1;
- end
- end
- default : state <= 2'd0;
- endcase
- end
- end