Verilog-移位寄存器

Verilog-移位寄存器,verilog,Verilog,我正在尝试使用verilog编写一个依赖于参数的FIFO 具体来说,它取决于字宽M和队列长度N。 我已经开始实现1位宽的fifo 我在调试它时遇到了问题(这就是它有点混乱的原因,抱歉!),当处理寄存器位列表时出现了主要问题 在实现该寄存器时,我希望将其移位,以弹出位_列表[N-1]中的值,同时将寄存器的其余1位移向N-1 不幸的是,我的实现不起作用,结果出现错误: “内存或数组引用需要索引[3.8][4.2.2(IEEE)]”,以及 “你的做法很不正统 制作FIFO最常见、最简单的方法是使用内存

我正在尝试使用verilog编写一个依赖于参数的FIFO

具体来说,它取决于字宽M和队列长度N。 我已经开始实现1位宽的fifo

我在调试它时遇到了问题(这就是它有点混乱的原因,抱歉!),当处理寄存器位列表时出现了主要问题

在实现该寄存器时,我希望将其移位,以弹出位_列表[N-1]中的值,同时将寄存器的其余1位移向N-1

不幸的是,我的实现不起作用,结果出现错误: “内存或数组引用需要索引[3.8][4.2.2(IEEE)]”,以及
“你的做法很不正统

制作FIFO最常见、最简单的方法是使用内存、读写指针

最明显的缺陷是:

  • 在代码中,您开始查看“推送”,但同时忽略可能出现的“弹出”
  • 在“pop”中,您将列表移动一个位置,但需要N个周期才能使其下降到谷底
  • 您可能需要一些“数据有效”标志来标记每个FIFO条目
  • 您有一个“满”状态,但没有“空”状态。接收器不知道何时可以开始读取
  • 我认为没有保护措施可以防止写入完整的FIFO或读取空的FIFO

  • bit_list=bit_list如果您将您的bit_列表声明为以下
    reg[N-1:0],则会消除错误bit_list;
    但是,您还有其他问题,例如错误地使用阻塞分配。我按照指示的方式设计了此fifo,无论如何,Serge回答了我的问题,但我将使用您的其余评论来改进我的代码。谢谢!
    bit_list=bit_list<<1;
    
    module single_fifo(clk,reset,in_bit,push,pop,out_bit,full);
       parameter N=4; // determines the maximum number of words in queue.
       input clk, reset, push, pop;
       input in_bit;
       output out_bit;
    
       reg bit_list [N-1:0];
       reg [N-1:0] n; 
       reg out_bit;
       output full;
       reg full;
    
       always @(posedge clk) 
       begin
        if (reset==1) begin
            n=0;
            bit_list=0;
    
        end
        else begin //reset==0
            if (n==0) begin             //n=0
                if (push==1) begin
                    bit_list[N-1-n]=in_bit;
                    n=n+1;
                end
                //else //push==0
                //  bit_list=bit_list;
            end else if ((n>0) && (n<N)) begin  //0<n<N
                if (pop==1) begin
                    bit_list=bit_list<<1; //SHIFT DIREDCTION MIGHT BE FLIPPED
                    n=n-1;
                end
                //else //pop==0
                //  bit_list=bit_list;
    
                if (push==1) begin
                    bit_list[N-1-n]=in_bit;
                    n=n+1;
                end
                //else //push==0
                //  bit_list=bit_list;
            end else begin              //n==N
                if (pop==1) begin
                    bit_list=bit_list<<1; //SHIFT DIREDCTION MIGHT BE FLIPPED
                    n=n-1;
                    if (push==1) begin
                        bit_list[N-1-n]=in_bit;
                        n=n+1;
                    end
                //  else //push==0
                //      bit_list=bit_list;
                end
                //else //pop==0
                //  bit_list=bit_list;
            end     
        end //reset==0
    
        if (n==N)
            full=1;
        else //n<N
            full=0;
        out_bit=bit_list[N-1];
    
    
        end
    endmodule