基于循环队列的FIFO缓存设计实现

2023-09-08 09:33:36 来源:FPGA之家

内容

FIFO缓存是介于两个子系统之间的弹性存储器,其概念图如图1所示。它有两个控制信号,wr和rd,用于读操作和写操作。当wr被插入时,输入的数据被写入缓存,此时读操作被忽视。FIFO缓存的head一般情况下总是有效的,因此可在任意时间被读取。rd信号实际上就像“remove”信号;当其被插入的时候,FIFO缓存的第一个项(即head)被移除,下一个项变为可用项。


(相关资料图)

图1 FIFO缓存的概念框图

在许多应用中,FIFO缓存是一种临界组件,其实现的优化相当复杂。在本节中,我们介绍一种简单的、真实的基于循环序列设计的FIFO缓存。更有效的、基于指定器件实现的FIFO缓存可在Altera或Xilinx的相关手册中找到。

基于循环队列的实现

一种实现FIFO缓存的方法是给寄存器文件添加一个控制电路。寄存器文件通过两个指针像循环队列一样来排列寄存器。写指针(writeponiter)指向队列的头(head);读指针(read poniter)指向队列的尾(tail)。每次读操作或写操作,指针都会前进一个位置。8-字循环队列的操作如图2所示。

图2 基于循环队列的FIFO缓存

FIFO缓存通常包括两个标志信号,full和empty,相应地来指示FIFO满(即不可写)或FIFO空(即不可读)。这两种情况发生在读指针和写指针相等的时候,如图2(a)、(f)和(i)所示的情况。控制器最难的设计任务是获取一种分辨这两种情形的机制。一种方案是使用触发器来跟踪empty和full标志。当系统被初始化时,触发器被设置为1和0;然后在每一个时钟周期根据wr和rd的值来修改。

代码 FIFO缓存

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798modulefifo#(parameterB=8, // number of bits in a wordW=3 // number of address bits)(// global clock and aysn resetinputclk,inputrst_n,// fifo interface// fifo control signnalinputrd,inputwr,// fifo status signaloutputempty,outputfull,// fifo data businput[B-1:0] w_data,output[B-1:0] r_data);// signal declarationreg[B-1:0] array_reg [2**W-1:0]; // register arrayreg[W-1:0] w_ptr_reg, w_ptr_next, w_ptr_succ;reg[W-1:0] r_ptr_reg, r_ptr_next, r_ptr_succ;regfull_reg, empty_reg, full_next, empty_next;wirewr_en;// body// register file write operationalways@(posedgeclk)if(wr_en)array_reg[w_ptr_reg] <= w_data;// register file read operationassignr_data = array_reg[r_ptr_reg];// write enabled only when FIFO is not fullassignwr_en = wr & ~full_reg;// fifo control logic// register for read and write pointersalways@(posedgeclk, negedgerst_n)if(!rst_n)beginw_ptr_reg <= 0;r_ptr_reg <= 0;full_reg <= 1"b0;empty_reg <= 1"b1;endelsebeginw_ptr_reg <= w_ptr_next;r_ptr_reg <= r_ptr_next;full_reg <= full_next;empty_reg <= empty_next;end// next-state logic for read and write pointersalways@*begin// successive pointer valuesw_ptr_succ = w_ptr_reg + 1;r_ptr_succ = r_ptr_reg + 1;// default: keep old valuesw_ptr_next = w_ptr_reg;r_ptr_next = r_ptr_reg;full_next = full_reg;empty_next = empty_reg;case({wr, rd})// 2"b00: no op2"b01: // readif(~empty_reg) // not emptybeginr_ptr_next = r_ptr_succ;full_next = 1"b0;if(r_ptr_succ==w_ptr_reg)empty_next = 1"b1;end2"b10: // writeif(~full_reg) // not fullbeginw_ptr_next = w_ptr_succ;empty_next = 1"b0;if(w_ptr_succ==r_ptr_reg)full_next = 1"b1;end2"b11: // write and readbeginw_ptr_next = w_ptr_succ;r_ptr_next = r_ptr_succ;endendcaseend// outputassignfull = full_reg;assignempty = empty_reg;endmodule

代码被分为寄存器文件和FIFO控制器两部分。控制器由两个指针和两个标志触发器组成,它们的次态逻辑会检测wr和rd信号,以采取相应的动作。举例说,在“10”条件下,即暗示只发生写操作。先检查标志触发器,以确保缓存不为满。如果满足条件,我们将写指针前进一位,并清除空标志。再多存储一个字(偏移地址为1所对应的数据)可能使得FIFO缓存满,即新的写指针赶上了读指针,我们使用w_ptr_succ==r_ptr_reg表达式来描述这一情况。

根据图2,我写了下面的testbench,其RTL仿真结果与图2一致。

代码 FIFO缓存的testbench

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100`timescale1ns/1nsmodulefifo_tb;localparam T=20; // clock period// global clock and asyn resetregclk, rst_n;// fifo interfaceregrd, wr;wireempty, full;reg[7:0] w_data;wire[7:0] r_data;// fifo instantiationfifo #(.B(8), .W(3)) fifo_inst(.clk(clk), .rst_n(rst_n),.rd(rd), .wr(wr),.empty(empty), .full(full),.w_data(w_data), .r_data(r_data));// clcokalwaysbeginclk = 1"b0;#(T/2);clk = 1"b1;#(T/2);end// resetinitialbeginrst_n = 1"b0;#(T/2)rst_n = 1"b1;end// stimulus bodyinitialbegin// initial input; emptyrd=0; wr=0; w_data=8"h00;@(posedgerst_n); // wait to deassert rst_n@(negedgeclk); // wait for a clock// 1 writewr=1; w_data=8"h11;@(negedgeclk); // wait to assert wrwr=0;@(negedgeclk); // wait to deassert wr// 3 writeswr=1;repeat(3)beginw_data=w_data+8"h11;@(negedgeclk);endwr=0;@(negedgeclk);// 1 readrd=1;@(negedgeclk); // wait to assert rdrd=0;@(negedgeclk) // wait to deassert rd// 4 writeswr=1;repeat(4)beginw_data=w_data+8"h11;@(negedgeclk);endwr=0;@(negedgeclk);// 1 write; fullwr=1; w_data=8"hAA;@(negedgeclk);wr=0;@(negedgeclk);// 2 readsrd=1;repeat(2) @(negedgeclk);rd=0;@(negedgeclk);// 5 readsrd=1;repeat(5) @(negedgeclk);rd=0;@(negedgeclk);// 1 read; emptyrd=1;@(negedgeclk);rd=0;@(negedgeclk);$stop;endendmodule

图3 RTL级仿真波形

审核编辑:刘清

标签

汤臣倍健2021年市占率10.3% 稳居行业第一

VDS行业发展空间较大、集中度较低。国内膳食营养补充剂(VDS)发展历史尚短,居民的消费意识和习惯尚未完...

2022-05-22 21:06:33

郴州安仁文旅项目集中开工 总投资1000万元

3月16日,安仁县举行文旅项目集中开工活动,县委书记王洪灿在开工仪式上宣布:湘南起义旧址群——朱毛井...

2022-03-20 15:40:46

2022年郴州计划重点推进文旅项目101个 总投资354亿元

3月16日,我市举行全市文旅项目和城市大提质大融城项目集中开工仪式,市委书记吴巨培宣布项目开工。郴州...

2022-03-20 15:39:41

宿州泗县深入推进文旅融合发展 擦亮城市品牌

近年来,泗县以争创安徽省文化旅游名县为目标,深入推进文旅融合发展,努力擦亮水韵泗州 运河名城城市...

2022-03-20 15:38:59

汽车零部件产业“领头羊” 锦州力争一季度“开门红”

3月16日,记者从锦州汽车零部件产业的领头羊——锦州万得集团获悉,今年前两个月,企业订单充足,正铆足...

2022-03-20 15:37:41

油价或有望冲击“九元”大关 宁波新能源汽车市场如何

新一轮国内成品油调价窗口于3月17日24时开启,油价或有望冲击九元大关。前一天晚上11点,鄞州区不少加油...

2022-03-20 15:34:38

从水塘到“云”端 全国最大高邮鸭养殖基地实现智慧养殖

随着新一代数字技术的蓬勃发展,以新兴技术推动现代化新农村建设正成为助力乡村振兴的重要手段。1个人能...

2022-03-20 15:33:17

淡季不忘引流 京郊民宿市场有望迎来回暖

旅游淡季中的京郊民宿有望成为市场中最先复苏的板块。3月17日,北京商报记者调查发现,虽然正值旅游淡季...

2022-03-20 15:32:01

镇江乡村一二三产业融合发展 闯出“镇江之路”

从烹饪江鲜河豚的个体小饭店到规模化的江岛乡村旅游产业集群,从白兔草莓丁庄葡萄的单个农户种植到茅山...

2022-03-20 15:31:11

总投资30亿元 盐城东台8个重大产业项目相继开工

总投资30亿元的精密电子元器件项目、同益电子项目,总投资10亿元的金利美精密组件项目、天永智能设备项...

2022-03-20 15:30:13
x 广告
x 广告

Copyright  2015-2023 今日粮油网版权所有  备案号:沪ICP备2023005074号-40   联系邮箱:5 85 59 73 @qq.com