用移位寄存器实现同步FIFO,带空满判断

这篇具有很好参考价值的文章主要介绍了用移位寄存器实现同步FIFO,带空满判断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用移位寄存器实现同步FIFO

同步移位寄存器,数字IC手撕代码,fpga开发,数字IC,手撕代码

        如图所示,同步FIFO带有push信号和pop信号,push代表往队列里面压入一个数据,pop代表往队列外面排出一个数据。


 解题思路

        同步FIFO的空满判断用一个计数器来判断,收到push信号计数器加1,收到pop信号时计数器减1,考虑同时push和pop的情况计数器不变,当计数器为0时,输出空,当计数器为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);

         数据的写入和读出,push数据就直接在移位寄存器的一端,用拼接符号把数据拼接在一起。pop数据输出DEPTH-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

代码

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个数据到写满,读出8个数据直到读空,接着连续写读3次,然后写入1个数据(保证下一步同时读写时,FIFO不为空,能读出数据)。再同时读写4次。


波形图

同步移位寄存器,数字IC手撕代码,fpga开发,数字IC,手撕代码

 文章来源地址https://www.toymoban.com/news/detail-630049.html

到了这里,关于用移位寄存器实现同步FIFO,带空满判断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用FPGA实现桶形移位寄存器

    我给大家介绍的是逻辑/算术左移移位寄存器。实现的功能是根据输入信号shift将输入信号进行移位,高位移除,低位补0。我建立的工程是由3个独立的桶形移位寄存器组成的。 library ieee; use ieee.std_logic_1164.all; entity barrel is      port( inp : in std_logic_vector(7 downto 0);          

    2024年04月29日
    浏览(50)
  • 实验四 用集成移位寄存器实现序列检测器

    一、实验要求 用移位寄存器和与非门设计一个 1101 序列检测器。电路连续不停地工作,对 串行输入的序列进行检测,当连续检测 4 个码元符合检测码 1101 时,检测器输出 为 1 ,指示灯亮,其他情况下输出为 0 ,指示灯灭。 二、实验设备 1 . Mini-FPGA 开发板( Cyclone IV 系列

    2024年02月03日
    浏览(45)
  • Verilog 实现伪随机数生成器(线性反馈移位寄存器)

    参考文献1 不简单的进行移位,而是在移位的基础上加上异或门,如题目所示,这就相当于每进行一次移位,寄存器中的值会发生改变,一直移动,一直改变,就形成了伪随机数。

    2024年02月09日
    浏览(59)
  • 【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现

    移位寄存器 :指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟周期向左或向右移动一个bit。下图所示为一个向右移动的移位寄存器。 反馈移位寄存器(Feedback Shift Register,FSR) :每个时钟脉冲,移位寄存器向右移动一位,则移位寄存器的左左侧就

    2024年02月15日
    浏览(55)
  • m基于FPGA的桶形移位寄存器verilog实现,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1、桶形移位寄存器的基本原理 2.2、桶形移位寄存器的数学模型 2.3、桶形移位寄存器的实现步骤 3.Verilog核心程序 4.完整算法代码文件 本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition 其

    2024年02月04日
    浏览(55)
  • verilog——移位寄存器

    在Verilog中,你可以使用移位寄存器来实现数据的移位操作。移位寄存器是一种常用的数字电路,用于将数据向左或向右移动一个或多个位置。这在数字信号处理、通信系统和其他应用中非常有用。以下是一个使用Verilog实现的简单移位寄存器的示例: module ShiftRegister (   inpu

    2024年02月05日
    浏览(46)
  • FPGA之移位寄存器

            SLICEM中的LUT可以配置为32位移位寄存器,而无需使用slice中可用的触发器。以这种方式使用,每个LUT 可以将串 行数据延迟 1 到 32 个时钟周期。移入D (DI1 LUT 引脚)和移出 Q31(MC31 LUT 引脚)线路将LUT级联,以形成更大的移位寄存器。因此,SLICEM 中的四个 LUT 被级联以

    2024年02月19日
    浏览(51)
  • LABVIEW的移位寄存器

    移位寄存器是数据的容器,可以包含任何数据类型。 添加移位寄存器后,在循环结构左右两侧的平行位置将各增加一个包含三角形的方框。左侧的方框代表上一次循环的运行结果,而右侧的代表本次循环要输入的结果。  最终得到5次循环后的结果。 接下来我们做一个通过移

    2024年02月11日
    浏览(49)
  • 线性反馈移位寄存器(LSFR)

    流密码的流密钥产生器可以通过线性驱动和非线性组合两部分来实现。而线性驱动部分可以由线性反馈移位寄存器(LFSR)来实现。 线性反馈移位寄存器(LFSR):通常由移位寄存器和异或门逻辑组成。其主要应用在:伪随机数,伪噪声序列,计数器,BIST,数据的加密和CRC校验等

    2024年02月17日
    浏览(48)
  • HDLBits学习笔记——移位寄存器

    为了方便做笔记,从移位寄存器(Shift Registers)这章开始按章节做记录。 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日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包