加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
sync_fifo.v 1.35 KB
一键复制 编辑 原始数据 按行查看 历史
Xintian Zhang 提交于 2022-10-27 21:32 . 1027
module sync_fifo #(
parameter WIDTH = 1,
parameter DEPTH_POWER = 1
) (
input push_en_i,
input pop_en_i,
input [WIDTH-1:0] push_data_i,
output [WIDTH-1:0] pop_data_o,
output [DEPTH_POWER:0] level_o,
output full_o,
output empty_o,
output reg overflow_o,
output reg underflow_o,
input clk,
input rst_n
);
reg [WIDTH-1:0] mem [2**DEPTH_POWER-1:0];
reg [DEPTH_POWER:0] rd_idx;
reg [DEPTH_POWER:0] wr_idx;
always @(posedge clk,negedge rst_n) begin
if(!rst_n) begin
rd_idx <= 0;
wr_idx <= 0;
end
else begin
case ({push_en_i,pop_en_i})
2'b11: begin
mem[wr_idx] <= push_data_i;
wr_idx <= wr_idx + 1;
rd_idx <= rd_idx + 1;
end
2'b10: begin
mem[wr_idx] <= push_data_i;
wr_idx <= wr_idx + 1;
end
2'b01: begin
rd_idx <= rd_idx + 1;
end
endcase
end
end
assign pop_data_o = mem[rd_idx];
assign level_o = wr_idx - rd_idx;
assign full_o = level_o == 2**DEPTH_POWER;
assign empty_o = level_o == 0;
always @(posedge clk,negedge rst_n) begin
if(!rst_n) begin
overflow_o <= 0;
underflow_o <= 0;
end
else if(full_o && push_en_i) overflow_o <= 1;
else if(empty_o && pop_en_i) underflow_o <= 1;
end
endmodule
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化