异步FIFO原理及使用

时间:2025-11-02  作者:Diven  阅读:0

可以先配合异步FIFO基础知识食用

异步FIFO原理及使用

Part.1

第一块Binary LogIC:判断二进制Pointer什么时候+1,生成ptr_bin_next信号

assign wptr_bin_next = wptr_bin + (winc & (!wfull));

Part.2

第二块Gray LogIC:由Binary Pointer生成Gary Pointer,其实这里根据经典AFIFO论文[1]里应该是用新的wptr_bin_next生成wptr_gray_next,这样wptr_bin和wptr_gray可以同步更新。(这里为了Pass牛客网的测试案例,需要将wptr_bin_next改为 wptr_bin生成,这样格雷码指针会比二进制指针慢一拍)

assign wptr_gray_next = wptr_bin_next ^ (wptr_bin_next >> 1);

新态逻辑写完后赋值给Reg变量

{wptr_bin,wptr_gray} <= {wptr_bin_next, wptr_gray_next};

Part.3

第三块Empty Logic:将wptr_gray在read时钟域打2拍,做空判断

assign rempty =  rptr_gray == wptr_gray_rr2;

Part.4

第四块Full Logic:将rptr_gray在write时钟域打2拍,做满判断

assign wfull = wptr_gray == {~rptr_gray_wr2[ADDR_WIDTH:ADDR_WIDTH-1], rptr_gray_wr2[ADDR_WIDTH-2:0]};

Part.5

第五块Full Logic:例化RAM,addr为ptr_bin次高位到最低位

最后添加一点点细节,形成完整代码

`timescale 1ns/1nsModule dual_port_RAM #(parameter DEPTH = 16, parameter WIDTH = 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr //深度对2取对数,得到地址的位宽。 ,input [WIDTH-1:0] wdata //数据写入 ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr //深度对2取对数,得到地址的位宽。 ,output reg [WIDTH-1:0] rdata //数据输出);reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];always @(posedge wclk) begin if(wenc) RAM_MEM[waddr] <= wdata;end always @(posedge rclk) begin if(renc) rdata <= RAM_MEM[raddr];end endmodule  module asyn_fifo#(    parameter   WIDTH = 8,    parameter   DEPTH = 16)(    input                   wclk    ,     input                   rclk    ,       input                   wrstn   ,    input                   rrstn   ,    input                   winc    ,    input                   rinc    ,    input       [WIDTH-1:0] wdata   ,    output wire             wfull   ,    output wire             rempty  ,    output wire [WIDTH-1:0] rdata);    parameter ADDR_WIDTH = $clog2(DEPTH);    reg [ADDR_WIDTH:0] wptr_bin;    reg [ADDR_WIDTH:0] rptr_bin;    wire [ADDR_WIDTH:0] wptr_bin_next;    wire [ADDR_WIDTH:0] rptr_bin_next;    assign wptr_bin_next = wptr_bin + (winc & (!wfull));    assign rptr_bin_next = rptr_bin + (rinc & (!rempty));    reg [ADDR_WIDTH:0] wptr_gray;    reg [ADDR_WIDTH:0] rptr_gray;    wire [ADDR_WIDTH:0] wptr_gray_next;    wire [ADDR_WIDTH:0] rptr_gray_next;    assign wptr_gray_next = wptr_bin_next ^ (wptr_bin_next >> 1); assign rptr_gray_next = rptr_bin_next ^ (rptr_bin_next >> 1); always @ (posedge wclk or negedge wrstn) begin if (!wrstn) begin {wptr_bin,wptr_gray} <= 'd0; end else {wptr_bin,wptr_gray} <= {wptr_bin_next, wptr_gray_next}; end always @ (posedge rclk or negedge rrstn) begin if (!rrstn) begin {rptr_bin,rptr_gray} <= 'd0; end else {rptr_bin,rptr_gray} <= {rptr_bin_next, rptr_gray_next}; end reg [ADDR_WIDTH:0] rptr_gray_wr,rptr_gray_wr2; always @ (posedge wclk or negedge wrstn) begin if (!wrstn) begin {rptr_gray_wr,rptr_gray_wr2} <= 'd0; end else {rptr_gray_wr2,rptr_gray_wr} <= {rptr_gray_wr,rptr_gray}; end assign wfull = wptr_gray == {~rptr_gray_wr2[ADDR_WIDTH:ADDR_WIDTH-1], rptr_gray_wr2[ADDR_WIDTH-2:0]}; reg [ADDR_WIDTH:0] wptr_gray_rr,wptr_gray_rr2; always @ (posedge rclk or negedge rrstn) begin if (!rrstn) begin {wptr_gray_rr2,wptr_gray_rr} <= 'd0; end else {wptr_gray_rr2,wptr_gray_rr} <= {wptr_gray_rr,wptr_gray}; end assign rempty = rptr_gray == wptr_gray_rr2; wire wenc, renc; wire [ADDR_WIDTH-1:0] raddr, waddr; assign wenc = winc & !wfull; assign renc = rinc & !rempty; assign raddr = rptr_bin[ADDR_WIDTH-1:0]; assign waddr = wptr_bin[ADDR_WIDTH-1:0]; dual_port_RAM #(.DEPTH(DEPTH), .WIDTH(WIDTH)) u_dual_port_RAM ( .wclk(wclk), .rclk(rclk), .wenc(wenc), .renc(renc), .raddr(raddr), .waddr(waddr), .wdata(wdata), .rdata(rdata) ); endModule

编辑:黄飞

猜您喜欢

可调电阻作为重要的电子元器件,应用于各类电路调节中。三环集团(CCTC)作为国内知名的电子元件制造企业,其生产的可调电阻因质量稳定、性能优良而深受市场欢迎。本文...
2014-07-30 15:56:41

IC温度传感器是什么IC温度传感器是一种集成电路芯片,用于测量环境温度。它通过从芯片中获取的输出信号来计算环境的温度。IC温度传感器的工作原理基于温度对半导体...
2024-03-14 16:51:00

碳化硅结型场效应管(JFET)是重要的半导体器件,其独特的特性使其在现代电子设备中是不可少的配件。碳化硅材料具有优异的高温性能和抗辐射能力,使得JFET在恶劣环...
2012-06-24 00:00:00

FH(风华高科)光敏电阻品牌很好的性能和的应用领域,逐渐成为了行业内的一颗璀璨明星。那么,这个受到瞩目的品牌究竟属于哪个国家呢?本文将为您详细解读FH(风华高科...
2017-02-02 06:59:30

贴片电阻的精度,通常用百分比表示,例如±1%,±5%,指的是电阻实际阻值与标称阻值之间的最大偏差范围。精度越高,实际阻值越接近标称值。精度对电路的影响主要体现在...
2024-11-29 10:25:36


PIN二极管是特殊的半导体器件,其结构由三个区域组成:P型、I型(本征)和N型。应用于射频和微波电路中,尤其是在调制解调器、开关电源和光电探测器等领域。本文将详...
2025-04-08 21:01:07

传感器专家网消息,当地时间1月16日,电源、汽车和物联网半导体领域的领导者英飞凌科技股份公司宣布成立一个新的业务部门,将现有的传感器和射频(RF)业务合并为一个...
2025-01-17 19:03:00

端板作为现代工业和建筑中不可少的构件,具有多项显著优势。端板的强度和稳定性极高,能够有效承受重物和外力,确保结构的安全性。端板的设计灵活多样,可以根据具体需求定...
2024-09-24 00:00:00

可调电阻作为电子元器件中的重要组成部分,应用于各种电子设备中。TA-I(大毅)作为国内知名的可调电阻品牌,优良的品质和多样的产品线,赢得了市场的认可。本文将详细...
2016-12-11 06:36:06