FIFO(First Input First Output),即先进先出队列。在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开。这就是一种先进先出机制,先排队的客户先行结账离开。
不同速率时钟域的转换当由慢时钟域到快时钟域,肯定需要一个buffer做缓冲,这样才能完成时钟域的转换。一般这种情况都选择FIFO来做缓冲当读写FIFO的时钟不同那么称为异步FIFO。
FIFO就是一个“环形存储器”读操作会把读指针指向下一个读数据,写操作会把写指针指向下一个写数据地址。当读指针追上写指针时称作读空,当写地址追上读地址时称为写满。
module ex_fifo(
input wire w_clk,
input wire r_clk,
input wire rst_n,
input wire w_en,
input wire [7:0] w_data,
output wire w_full,
output wire r_empty,
input wire r_en,
output wire [7:0] r_data
);
wire [8:0] r_gaddr;
wire [8:0] w_addr;
wire [8:0] w_gaddr;
wire [8:0] r_addr;
//例化模块连接
w_ctrl w_ctrl_inst(
input .w_clk (w_clk),
input .rst_n (rst_n),
input .w_en (w_en),//写使能
input .r_gaddr (r_gaddr),//读时钟域过来的格雷码读地址指针
output .w_full (w_full),
output .w_addr (w_addr),//256深度FIFO写二进制地址
output .w_gaddr (w_gaddr)//写FIFO地址格雷码编码
);
fifomem fifomem_inst(
(w_clk),
(r_clk),
(w_en),//来自FIFO写控制模块
(w_data),//来自外部数据源
(w_addr),
(r_empty),
(r_addr),//来自FIFO的写控制模块
(r_data) //读数据是从内部RAM中读取
);
r_ctrl r_ctrl_inst(
(r_clk),
(rst_n),
(r_en),//读使能
(w_gaddr),//写时钟域过来的格雷码读地址指针
(r_empty),
(r_addr),//256深度FIFO读二进制地址
(r_gaddr)//读FIFO地址格雷码编码
);
endmodule
主要是读写控制的编写和FIFO寄存器的模块编写。