国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用移位寄存器實現(xiàn)同步FIFO,帶空滿判斷

這篇具有很好參考價值的文章主要介紹了用移位寄存器實現(xiàn)同步FIFO,帶空滿判斷。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

用移位寄存器實現(xiàn)同步FIFO

同步移位寄存器,數(shù)字IC手撕代碼,fpga開發(fā),數(shù)字IC,手撕代碼

????????如圖所示,同步FIFO帶有push信號和pop信號,push代表往隊列里面壓入一個數(shù)據(jù),pop代表往隊列外面排出一個數(shù)據(jù)。


?解題思路

? ? ? ? 同步FIFO的空滿判斷用一個計數(shù)器來判斷,收到push信號計數(shù)器加1,收到pop信號時計數(shù)器減1,考慮同時push和pop的情況計數(shù)器不變,當(dāng)計數(shù)器為0時,輸出空,當(dāng)計數(shù)器為DEPTH時,輸出滿。FIFO給出空滿信號,空時不能讀,滿時不能寫。具體代碼如下:

always @(posedge clk)begin
    if(!rstn)
        counter <= 'd0;
    else if(push && pop)
        counter <= counter;
    else if(push)
        counter <= counter + 1'b1;
    else if(pop)
        counter <= counter - 1'b1;
end

assign empty = (counter == 'd0);
assign full  = (counter == DEPTH);

? ? ? ? ?數(shù)據(jù)的寫入和讀出,push數(shù)據(jù)就直接在移位寄存器的一端,用拼接符號把數(shù)據(jù)拼接在一起。pop數(shù)據(jù)輸出DEPTH-counter位置的數(shù)據(jù),因為我們位拼接是從高位開始拼接的,要注意讀出的地址位置。

always @(posedge clk)begin
      if(!rstn)
        pop_data <= 'd;
      else if(push && pop)begin
        fifo_mem <= {push_data,fifo_mem[DEPTH-1:1]};
        pop_data <= fifo_mem[DEPTH-counter];
      end
      else if(push)begin
        fifo_mem <= {push_data,fifo_mem[DEPTH-1:1]};
      end
      else if(pop)begin
        pop_data <= fifo_mem[DEPTH-counter];
      end
end

代碼

module shift_reg_fifo#(
    parameter DEPTH  = 8    ,
    parameter DATA_W = 32
)(
    input                      clk          ,
    input                      rstn         ,
    output                     empty        ,
    output                     full         ,

    input                      push         ,
    input      [DATA_W-1:0]    push_data    ,
    input                      pop          ,
    output reg [DATA_W-1:0]    pop_data    
);
reg [DATA_W-1:0] fifo_mem [DEPTH-1:0];
reg [$clog2(DEPTH)+1:0] counter;

always @(posedge clk)begin
      if(!rstn)
        pop_data <= 'd;
      else if(push && pop)begin
        fifo_mem <= {push_data,fifo_mem[DEPTH-1:1]};
        pop_data <= fifo_mem[DEPTH-counter];
      end
      else if(push)begin
        fifo_mem <= {push_data,fifo_mem[DEPTH-1:1]};
      end
      else if(pop)begin
        pop_data <= fifo_mem[DEPTH-counter];
      end
end

always @(posedge clk)begin
    if(!rstn)
        counter <= 'd0;
    else if(push && pop)
        counter <= counter;
    else if(push)
        counter <= counter + 1'b1;
    else if(pop)
        counter <= counter - 1'b1;
end

assign empty = (counter == 'd0);
assign full  = (counter == DEPTH);

endmodule

testbench

`timescale 1ns/1ps
module tb#(
    parameter DEPTH  = 8    ,
    parameter DATA_W = 32   
)();
reg clk,rstn;
wire empty,full;
wire [DATA_W-1:0] pop_data;

reg push,pop;
reg [DATA_W-1:0] push_data;

initial begin
    forever #5 clk = ~clk;
end

initial begin
    clk  =  1'b0;
    rstn =  1'b0;
    pop  =  1'b0;
    push = 1'b0;
    push_data =  32'd0;
    #10
    rstn =  1'b1;
    #16
    repeat(8)begin
        #10 
        push =  1'b1;
        push_data = $random%32;
    end
    #10
    push = 1'b0;
    repeat(8)begin
        #10
        pop =  1'b1;
    end
    #10
    pop =  1'b0;
    repeat(3)begin
        #10
        pop  = 1'b0;
        push =  1'b1;
        push_data = $random() % 10'd32;
        #10
        push = 1'b0;
        pop  = 1'b1;
    end
    #10
    pop = 1'b0;
    push = 1'b1;
    push_data = $random() % 10'd32;
    repeat(4)begin
        #10
        pop  = 1'b1;
        push = 1'b1;
        push_data = $random() % 10'd32;
    end
    #10
    pop = 1'b0;
    push = 1'b0;
    #50
    $finish();
end

initial begin
    $fsdbDumpfile("shift_fifo.fsdb");
    $fsdbDumpvars(0);
end

shift_reg_fifo #(
    .DEPTH  (DEPTH  ),
    .DATA_W (DATA_W )
)u_shift_reg_fifo(
    .clk        (clk        ),
    .rstn       (rstn       ),
    .empty      (empty      ),
    .full       (full       ),

    .push       (push       ),
    .push_data  (push_data  ),
    .pop        (pop        ),
    .pop_data   (pop_data   )
);

endmodule

? ? ? ? 仿真部分,在深度為8的情況下,我們分別模擬了寫入8個數(shù)據(jù)到寫滿,讀出8個數(shù)據(jù)直到讀空,接著連續(xù)寫讀3次,然后寫入1個數(shù)據(jù)(保證下一步同時讀寫時,F(xiàn)IFO不為空,能讀出數(shù)據(jù))。再同時讀寫4次。


波形圖

同步移位寄存器,數(shù)字IC手撕代碼,fpga開發(fā),數(shù)字IC,手撕代碼

?文章來源地址http://www.zghlxwxcb.cn/news/detail-630049.html

到了這里,關(guān)于用移位寄存器實現(xiàn)同步FIFO,帶空滿判斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用FPGA實現(xiàn)桶形移位寄存器

    使用FPGA實現(xiàn)桶形移位寄存器

    我給大家介紹的是邏輯/算術(shù)左移移位寄存器。實現(xiàn)的功能是根據(jù)輸入信號shift將輸入信號進(jìn)行移位,高位移除,低位補(bǔ)0。我建立的工程是由3個獨(dú)立的桶形移位寄存器組成的。 library ieee; use ieee.std_logic_1164.all; entity barrel is? ?? ?port( inp : in std_logic_vector(7 downto 0); ?? ??? ??

    2024年04月29日
    瀏覽(33)
  • 實驗四 用集成移位寄存器實現(xiàn)序列檢測器

    實驗四 用集成移位寄存器實現(xiàn)序列檢測器

    一、實驗要求 用移位寄存器和與非門設(shè)計一個 1101 序列檢測器。電路連續(xù)不停地工作,對 串行輸入的序列進(jìn)行檢測,當(dāng)連續(xù)檢測 4 個碼元符合檢測碼 1101 時,檢測器輸出 為 1 ,指示燈亮,其他情況下輸出為 0 ,指示燈滅。 二、實驗設(shè)備 1 . Mini-FPGA 開發(fā)板( Cyclone IV 系列

    2024年02月03日
    瀏覽(20)
  • Verilog 實現(xiàn)偽隨機(jī)數(shù)生成器(線性反饋移位寄存器)

    Verilog 實現(xiàn)偽隨機(jī)數(shù)生成器(線性反饋移位寄存器)

    參考文獻(xiàn)1 不簡單的進(jìn)行移位,而是在移位的基礎(chǔ)上加上異或門,如題目所示,這就相當(dāng)于每進(jìn)行一次移位,寄存器中的值會發(fā)生改變,一直移動,一直改變,就形成了偽隨機(jī)數(shù)。

    2024年02月09日
    瀏覽(28)
  • 【Verilog編程】線性反饋移位寄存器(LFSR)原理及Verilog代碼實現(xiàn)

    【Verilog編程】線性反饋移位寄存器(LFSR)原理及Verilog代碼實現(xiàn)

    移位寄存器 :指若干個寄存器排成一列,每個寄存器中存放1bit二進(jìn)制數(shù)據(jù)(0或1),每個時鐘周期向左或向右移動一個bit。下圖所示為一個向右移動的移位寄存器。 反饋移位寄存器(Feedback Shift Register,F(xiàn)SR) :每個時鐘脈沖,移位寄存器向右移動一位,則移位寄存器的左左側(cè)就

    2024年02月15日
    瀏覽(20)
  • m基于FPGA的桶形移位寄存器verilog實現(xiàn),包含testbench

    m基于FPGA的桶形移位寄存器verilog實現(xiàn),包含testbench

    目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1、桶形移位寄存器的基本原理 2.2、桶形移位寄存器的數(shù)學(xué)模型 2.3、桶形移位寄存器的實現(xiàn)步驟 3.Verilog核心程序 4.完整算法代碼文件 本系統(tǒng)進(jìn)行了兩個平臺的開發(fā),分別是: Vivado2019.2 Quartusii18.0+ModelSim-Altera 6.6d ?Starter Edition 其

    2024年02月04日
    瀏覽(30)
  • verilog——移位寄存器

    在Verilog中,你可以使用移位寄存器來實現(xiàn)數(shù)據(jù)的移位操作。移位寄存器是一種常用的數(shù)字電路,用于將數(shù)據(jù)向左或向右移動一個或多個位置。這在數(shù)字信號處理、通信系統(tǒng)和其他應(yīng)用中非常有用。以下是一個使用Verilog實現(xiàn)的簡單移位寄存器的示例: module ShiftRegister ( ? inpu

    2024年02月05日
    瀏覽(31)
  • FPGA之移位寄存器

    FPGA之移位寄存器

    ????????SLICEM中的LUT可以配置為32位移位寄存器,而無需使用slice中可用的觸發(fā)器。以這種方式使用,每個LUT 可以將串 行數(shù)據(jù)延遲 1 到 32 個時鐘周期。移入D (DI1 LUT 引腳)和移出 Q31(MC31 LUT 引腳)線路將LUT級聯(lián),以形成更大的移位寄存器。因此,SLICEM 中的四個 LUT 被級聯(lián)以

    2024年02月19日
    瀏覽(24)
  • LABVIEW的移位寄存器

    LABVIEW的移位寄存器

    移位寄存器是數(shù)據(jù)的容器,可以包含任何數(shù)據(jù)類型。 添加移位寄存器后,在循環(huán)結(jié)構(gòu)左右兩側(cè)的平行位置將各增加一個包含三角形的方框。左側(cè)的方框代表上一次循環(huán)的運(yùn)行結(jié)果,而右側(cè)的代表本次循環(huán)要輸入的結(jié)果。 ?最終得到5次循環(huán)后的結(jié)果。 接下來我們做一個通過移

    2024年02月11日
    瀏覽(27)
  • HDLBits學(xué)習(xí)筆記——移位寄存器

    HDLBits學(xué)習(xí)筆記——移位寄存器

    為了方便做筆記,從移位寄存器(Shift Registers)這章開始按章節(jié)做記錄。 1.? ?4-bit Shift Registers 題目: Build a 4-bit shift register (right shift), with asynchronous reset, synchronous load, and enable. areset: Resets shift register to zero. load: Loads shift register with?data[3:0]?instead of shifting. ena: Shift right (q[3

    2023年04月08日
    瀏覽(28)
  • 線性反饋移位寄存器(LSFR)

    線性反饋移位寄存器(LSFR)

    流密碼的流密鑰產(chǎn)生器可以通過線性驅(qū)動和非線性組合兩部分來實現(xiàn)。而線性驅(qū)動部分可以由線性反饋移位寄存器(LFSR)來實現(xiàn)。 線性反饋移位寄存器(LFSR):通常由移位寄存器和異或門邏輯組成。其主要應(yīng)用在:偽隨機(jī)數(shù),偽噪聲序列,計數(shù)器,BIST,數(shù)據(jù)的加密和CRC校驗等

    2024年02月17日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包