隊列及其實現(xiàn)

隊列

隊列即FIFO衫樊,一言以蔽之就是先進先出咬扇。比如入隊列的順序是1,2,3,4喉童,那么出隊列的順序也是1,2,3,4

隊列的實現(xiàn)

軟件——GO語言實現(xiàn)

除了使用鏈表和數(shù)組實現(xiàn)鏈表以外甜刻,GO語言內(nèi)置一種新的數(shù)據(jù)結(jié)構(gòu)叫切片,可以實現(xiàn)類似于動態(tài)語言中的list的一些功能(切片和append)礁芦,用這個數(shù)據(jù)結(jié)構(gòu)實現(xiàn)隊列非常容易

結(jié)構(gòu)體

type fifo struct {
    data   []int
    length int
}

出隊列方法

f.data[1:]就是類似于python中的切片操作厅缺,表示切掉第一個值,剩下的保留

func (f *fifo) Pop() (int, error) {
    if len(f.data) == 0 {
        return 0, errors.New("empty fifo")
    } else {
        temp := f.data[0]
        f.data = f.data[1:]
        f.length--
        return temp, nil
    }
}

入隊列方法

append方法是go語言自帶的切片處理方法宴偿,第一個參數(shù)是要操作的切片湘捎,隨后的參數(shù)都是要插入到切片之后的變量,返回值是完成插入后新的切片

func (f *fifo) Push(din int) {
    f.data = append(f.data, din)
    f.length++
}

構(gòu)造函數(shù)

func New_fifo() *fifo {
    return &fifo{[]int{}, 0}
}

硬件——Verilog實現(xiàn)

fifo由于其不改變數(shù)據(jù)順序常用于實現(xiàn)buffer窄刘,常用雙口ram+控制邏輯的方法實現(xiàn)fifo

端口定義

module fifo_control #(
    parameter WIDTH = 8,
    parameter DEPTH_LOG = 8
)(
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    input fifo_write_req,
    input [WIDTH - 1:0]fifo_write_data,
    output reg fifo_full,

    input fifo_read_req,
    output reg fifo_empty,

    output reg ram_write_req,
    output reg [DEPTH_LOG - 1:0]ram_write_addr,
    output reg [WIDTH - 1:0]ram_write_data,

    output reg [DEPTH_LOG - 1:0]ram_read_addr
);

線網(wǎng)定義

reg [DEPTH_LOG - 1:0]write_point,read_point;
wire almost_full = (write_point == read_point - 1'b1)?1'b1:1'b0;
wire almost_empty = (write_point == read_point + 1'b1)?1'b1:1'b0;

寫指針控制

always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        write_point <= 'b0;
        ram_write_req <= 'b0;
    end else if((!fifo_full || fifo_read_req) && fifo_write_req) begin
        write_point <= write_point + 1'b1;
        ram_write_req <= 1'b1;
    end else begin
        ram_write_req <= 'b0;
    end
end

(!fifo_full || fifo_read_req) && fifo_write_req為寫執(zhí)行條件:

  • fifo不滿且寫請求
  • 讀寫同時又請求(不可能溢出)

fifo滿信號生成

always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        fifo_full <= 'b0;
    end else if(fifo_read_req && fifo_write_req) begin
        fifo_full <= fifo_full;
    end else if(fifo_read_req) begin
        fifo_full <= 'b0;
    end else if(almost_full && fifo_write_req) begin
        fifo_full <= 'b1;
    end
end
  • fifo_read_req && fifo_write_req當讀寫同時進行時窥妇,滿信號狀態(tài)不會改變
  • almost_full && fifo_write_req當寫請求有效且只剩一個空位時,滿信號置位
  • fifo_read_req只要讀過一次娩践,不可能滿

寫地址與數(shù)據(jù)生成

always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        ram_write_data <= 'b0;
        ram_write_addr <= 'b0;
    end else begin
        ram_write_data <= fifo_write_data;
        ram_write_addr <= write_point;
    end
end

讀指針/地址控制

always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        read_point <= 'b0;
        ram_read_addr <= 'b0;
    end else if(!fifo_empty && fifo_read_req) begin
        read_point <= read_point + 1'b1;
        ram_read_addr <= read_point;
    end
end
  • !fifo_empty && fifo_read_req當fifo非空時活翩,讀fifo

fifo空信號生成

always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        fifo_empty <= 1'b1;
    end else if(fifo_read_req && fifo_write_req) begin
        fifo_empty <= fifo_empty;
    end else if(fifo_write_req) begin
        fifo_empty <= 1'b0;
    end else if(almost_empty && fifo_read_req) begin
        fifo_empty <= 1'b1;
    end
end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翻伺,隨后出現(xiàn)的幾起案子材泄,更是在濱河造成了極大的恐慌,老刑警劉巖吨岭,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉宗,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機旦事,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門魁巩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姐浮,你說我怎么就攤上這事谷遂。” “怎么了卖鲤?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵肾扰,是天一觀的道長。 經(jīng)常有香客問我蛋逾,道長集晚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任换怖,我火速辦了婚禮,結(jié)果婚禮上蟀瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好辰斋,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布退子。 她就那樣靜靜地躺著,像睡著了一般切端。 火紅的嫁衣襯著肌膚如雪彻坛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天踏枣,我揣著相機與錄音昌屉,去河邊找鬼。 笑死茵瀑,一個胖子當著我的面吹牛间驮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播马昨,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼竞帽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸿捧?” 一聲冷哼從身側(cè)響起屹篓,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匙奴,沒想到半個月后堆巧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年恳邀,在試婚紗的時候發(fā)現(xiàn)自己被綠了懦冰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谣沸,死狀恐怖刷钢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乳附,我是刑警寧澤内地,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站赋除,受9級特大地震影響阱缓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜举农,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一荆针、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颁糟,春花似錦航背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婚脱,卻和暖如春今魔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背障贸。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工错森, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篮洁。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓问词,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘀粱。 傳聞我的和親對象是個殘疾皇子激挪,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android跨進程通信IPC整體內(nèi)容如下 1、Android跨進程通信IPC之1——Linux基礎2锋叨、Andro...
    隔壁老李頭閱讀 15,516評論 19 113
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理垄分,服務發(fā)現(xiàn),斷路器娃磺,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 進程間通信 進程間通信即IPC(InerProcess Communication)Unix ipc 已經(jīng)是而且繼...
    千里山南閱讀 457評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • 最近項目需要我們的App需要集成微信支付薄湿,所以在這里寫一篇文章來解析一下微信支付中的一些坑。 Android支付 ...
    JellyCai閱讀 2,638評論 5 39