RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基于循環(huán)隊列的FIFO緩存實現(xiàn)

Hack電子 ? 來源:Hack電子 ? 2023-09-11 10:12 ? 次閱讀

FIFO緩存是介于兩個子系統(tǒng)之間的彈性存儲器,其概念圖如圖1所示。它有兩個控制信號,wr和rd,用于讀操作和寫操作。當wr被插入時,輸入的數(shù)據(jù)被寫入緩存,此時讀操作被忽視。FIFO緩存的head一般情況下總是有效的,因此可在任意時間被讀取。rd信號實際上就像“remove”信號;當其被插入的時候,F(xiàn)IFO緩存的第一個項(即head)被移除,下一個項變?yōu)榭捎庙棥?/p>

d5f8bce2-5047-11ee-a25d-92fbcf53809c.png

圖1 FIFO緩存的概念框圖

在許多應用中,F(xiàn)IFO緩存是一種臨界組件,其實現(xiàn)的優(yōu)化相當復雜。在本節(jié)中,我們介紹一種簡單的、真實的基于循環(huán)序列設計的FIFO緩存。更有效的、基于指定器件實現(xiàn)的FIFO緩存可在Altera或Xilinx的相關(guān)手冊中找到。

基于循環(huán)隊列的實現(xiàn)

一種實現(xiàn)FIFO緩存的方法是給寄存器文件添加一個控制電路。寄存器文件通過兩個指針像循環(huán)隊列一樣來排列寄存器。寫指針(write poniter)指向隊列的頭(head);讀指針(read poniter)指向隊列的尾(tail)。每次讀操作或?qū)懖僮?,指針都會前進一個位置。8-字循環(huán)隊列的操作如圖2所示。

d6063bd8-5047-11ee-a25d-92fbcf53809c.jpg

圖2 基于循環(huán)隊列的FIFO緩存

FIFO緩存通常包括兩個標志信號,full和empty,相應地來指示FIFO滿(即不可寫)或FIFO空(即不可讀)。這兩種情況發(fā)生在讀指針和寫指針相等的時候,如圖2(a)、(f)和(i)所示的情況。控制器最難的設計任務是獲取一種分辨這兩種情形的機制。一種方案是使用觸發(fā)器來跟蹤empty和full標志。當系統(tǒng)被初始化時,觸發(fā)器被設置為1和0;然后在每一個時鐘周期根據(jù)wr和rd的值來修改。

代碼 FIFO緩存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
modulefifo
#(
parameterB=8, // number of bits in a word
W=3 // number of address bits
)
(
// global clock and aysn reset
inputclk,
inputrst_n,
// fifo interface
// fifo control signnal
inputrd,
inputwr,
// fifo status signal
outputempty,
outputfull,
// fifo data bus
input[B-1:0] w_data,
output[B-1:0] r_data
);
// signal declaration
reg[B-1:0] array_reg [2**W-1:0]; // register array
reg[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 operation
always@(posedgeclk)
if(wr_en)
array_reg[w_ptr_reg] <= w_data;
// register file read operation
assignr_data = array_reg[r_ptr_reg];
// write enabled only when FIFO is not full
assignwr_en = wr & ~full_reg;
// fifo control logic
// register for read and write pointers
always@(posedgeclk, negedgerst_n)
if(!rst_n)
begin
w_ptr_reg <= 0;
r_ptr_reg <= 0;
full_reg <= 1'b0;
empty_reg <= 1'b1;
end
else
begin
w_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 pointers
always@*
begin
// successive pointer values
w_ptr_succ = w_ptr_reg + 1;
r_ptr_succ = r_ptr_reg + 1;
// default: keep old values
w_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 op
2'b01: // read
if(~empty_reg) // not empty
begin
r_ptr_next = r_ptr_succ;
full_next = 1'b0;
if(r_ptr_succ==w_ptr_reg)
empty_next = 1'b1;
end
2'b10: // write
if(~full_reg) // not full
begin
w_ptr_next = w_ptr_succ;
empty_next = 1'b0;
if(w_ptr_succ==r_ptr_reg)
full_next = 1'b1;
end
2'b11: // write and read
begin
w_ptr_next = w_ptr_succ;
r_ptr_next = r_ptr_succ;
end
endcase
end
// output
assignfull = full_reg;
assignempty = empty_reg;
endmodule

代碼被分為寄存器文件和FIFO控制器兩部分??刂破饔蓛蓚€指針和兩個標志觸發(fā)器組成,它們的次態(tài)邏輯會檢測wr和rd信號,以采取相應的動作。舉例說,在“10”條件下,即暗示只發(fā)生寫操作。先檢查標志觸發(fā)器,以確保緩存不為滿。如果滿足條件,我們將寫指針前進一位,并清除空標志。再多存儲一個字(偏移地址為1所對應的數(shù)據(jù))可能使得FIFO緩存滿,即新的寫指針趕上了讀指針,我們使用w_ptr_succ==r_ptr_reg表達式來描述這一情況。

根據(jù)圖2,我寫了下面的testbench,其RTL仿真結(jié)果與圖2一致。

代碼 FIFO緩存的testbench

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
`timescale1ns/1ns
modulefifo_tb;
localparam T=20; // clock period
// global clock and asyn reset
regclk, rst_n;
// fifo interface
regrd, wr;
wireempty, full;
reg[7:0] w_data;
wire[7:0] r_data;
// fifo instantiation
fifo #(.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)
);
// clcok
always
begin
clk = 1'b0;
#(T/2);
clk = 1'b1;
#(T/2);
end
// reset
initial
begin
rst_n = 1'b0;
#(T/2)
rst_n = 1'b1;
end
// stimulus body
initial
begin
// initial input; empty
rd=0; wr=0; w_data=8'h00;
@(posedgerst_n); // wait to deassert rst_n
@(negedgeclk); // wait for a clock
// 1 write
wr=1; w_data=8'h11;
@(negedgeclk); // wait to assert wr
wr=0;
@(negedgeclk); // wait to deassert wr
// 3 writes
wr=1;
repeat(3)
begin
w_data=w_data+8'h11;
@(negedgeclk);
end
wr=0;
@(negedgeclk);
// 1 read
rd=1;
@(negedgeclk); // wait to assert rd
rd=0;
@(negedgeclk) // wait to deassert rd
// 4 writes
wr=1;
repeat(4)
begin
w_data=w_data+8'h11;
@(negedgeclk);
end
wr=0;
@(negedgeclk);
// 1 write; full
wr=1; w_data=8'hAA;
@(negedgeclk);
wr=0;
@(negedgeclk);
// 2 reads
rd=1;
repeat(2) @(negedgeclk);
rd=0;
@(negedgeclk);
// 5 reads
rd=1;
repeat(5) @(negedgeclk);
rd=0;
@(negedgeclk);
// 1 read; empty
rd=1;
@(negedgeclk);
rd=0;
@(negedgeclk);
$stop;
end
endmodule

d6272ca8-5047-11ee-a25d-92fbcf53809c.png

圖3 RTL級仿真波形

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120230
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    387

    瀏覽量

    43647
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110074
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    239

    瀏覽量

    26669
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    385

    瀏覽量

    59759

原文標題:Verilog設計FIFO

文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FIFO隊列原理簡述

    FIFO隊列機制中最簡單的,每個接口上只有一個FIFO隊列,表面上看FIFO隊列并沒有提供什么
    發(fā)表于 07-10 09:22 ?1656次閱讀

    一種簡單的、真實的基于循環(huán)序列的FIFO緩存設計

    FIFO緩存是介于兩個子系統(tǒng)之間的彈性存儲器,其概念圖如圖1所示。它有兩個控制信號,wr和rd,用于讀操作和寫操作
    發(fā)表于 09-11 09:12 ?567次閱讀
    一種簡單的、真實的基于<b class='flag-5'>循環(huán)</b>序列的<b class='flag-5'>FIFO</b><b class='flag-5'>緩存</b>設計

    labview能實現(xiàn)循環(huán)隊列嗎?

    救助:請問高手:labview能實現(xiàn)循環(huán)隊列嗎?
    發(fā)表于 08-13 15:02

    基于隊列函數(shù)實現(xiàn)并行循環(huán)間傳輸數(shù)據(jù)

    數(shù)據(jù)經(jīng)過入隊列和出隊列兩個函數(shù)過程得到傳遞,本程序使用隊列函數(shù),實現(xiàn)兩個并行循環(huán)間的數(shù)據(jù)傳遞。循環(huán)
    發(fā)表于 04-23 09:40

    隊列FIFO——支持網(wǎng)絡QoS的重要芯片

    摘要:在IP網(wǎng)絡中支持QoS是近年來研究的熱點,而IDT公司推出的新型存儲器件——多隊列FIFO能夠支持QoS的應用。因其具有單器件下支持可配置的多個隊列,并具有可
    發(fā)表于 03-11 13:22 ?1159次閱讀
    多<b class='flag-5'>隊列</b><b class='flag-5'>FIFO</b>——支持網(wǎng)絡QoS的重要芯片

    FIFO隊列原理簡述 擁塞避免原理

    擁塞管理是指網(wǎng)絡在發(fā)生擁塞時,如何進行管理和控制。FIFO隊列不對報文進行分類,按報文到達接口的先后順序讓報文進入隊列,采用盡力而為的轉(zhuǎn)發(fā)模式,PQ隊列是針對關(guān)鍵業(yè)務應用設計的。
    發(fā)表于 02-23 08:35 ?1w次閱讀
    <b class='flag-5'>FIFO</b><b class='flag-5'>隊列</b>原理簡述 擁塞避免原理

    數(shù)據(jù)處理時為什么要從DMA緩存空間中獲取?

    1、初始化時開啟串口的空閑中斷,并且初始化為循環(huán)DMA。2、觸發(fā)空閑中斷時,更新索引,這個索引表示當前寫入索引值,用于上層判斷緩存空間已寫入的數(shù)據(jù)(魚鷹前面寫了關(guān)于循環(huán)FIFO的筆記,
    的頭像 發(fā)表于 06-24 11:28 ?3890次閱讀

    基于多級隊列的云服務并發(fā)量分級緩存機制

    基于多級隊列的云服務并發(fā)量分級緩存機制
    發(fā)表于 06-24 11:35 ?15次下載

    隊列實現(xiàn)數(shù)據(jù)循環(huán)外顯示源碼下載

    隊列實現(xiàn)數(shù)據(jù)循環(huán)外顯示源碼下載
    發(fā)表于 11-26 09:21 ?4次下載

    FPGA學習-基于FIFO的行緩存結(jié)構(gòu)

    在FPGA中對圖像的一行數(shù)據(jù)進行緩存時,可以采用FIFO這一結(jié)構(gòu),如上圖所示,新一行圖像數(shù)據(jù)流入到FIFO1中,FIFO1中會對圖像數(shù)據(jù)進行緩存
    的頭像 發(fā)表于 05-10 09:59 ?3843次閱讀

    Gowin先進先出隊列(FIFO)用戶指南

    電子發(fā)燒友網(wǎng)站提供《Gowin先進先出隊列(FIFO)用戶指南.pdf》資料免費下載
    發(fā)表于 09-15 09:57 ?0次下載
    Gowin先進先出<b class='flag-5'>隊列</b>(<b class='flag-5'>FIFO</b>)用戶指南

    Gowin先進先出隊列(FIFO HS)用戶指南

    電子發(fā)燒友網(wǎng)站提供《Gowin先進先出隊列(FIFO HS)用戶指南 .pdf》資料免費下載
    發(fā)表于 09-15 09:55 ?1次下載
    Gowin先進先出<b class='flag-5'>隊列</b>(<b class='flag-5'>FIFO</b> HS)用戶指南

    嵌入式環(huán)形隊列和消息隊列實現(xiàn)

    嵌入式環(huán)形隊列和消息隊列實現(xiàn)數(shù)據(jù)緩存和通信的常見數(shù)據(jù)結(jié)構(gòu),廣泛應用于嵌入式系統(tǒng)中的通信協(xié)議和領域。
    的頭像 發(fā)表于 04-14 11:52 ?1553次閱讀

    嵌入式環(huán)形隊列和消息隊列是如何去實現(xiàn)的?

    嵌入式環(huán)形隊列和消息隊列實現(xiàn)數(shù)據(jù)緩存和通信的常見數(shù)據(jù)結(jié)構(gòu),廣泛應用于嵌入式系統(tǒng)中的通信協(xié)議和領域。
    發(fā)表于 05-20 14:55 ?1129次閱讀

    嵌入式環(huán)形隊列與消息隊列實現(xiàn)原理

    嵌入式環(huán)形隊列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊列,是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲區(qū)域中高效地存儲和訪問數(shù)據(jù)。其主要特點包括固定大小的數(shù)組和兩個指針(頭指針和尾指針
    的頭像 發(fā)表于 09-02 15:29 ?476次閱讀
    RM新时代网站-首页