Verilog - 移位寄存器

Verilog - Shifting a register

我正在尝试使用 verilog 编写一个参数相关的 FIFO。

具体取决于字宽M和队列长度N。 我已经开始实施一个 1 位宽的 fifo。

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

在实现此寄存器时,我希望将其移位以弹出 bit_list[N-1] 中的值,同时将寄存器的其余部分向 N-1 移动 1 位。

不幸的是,我的实现不起作用,结果出现错误: "Memory or an array reference requires an index [3.8][4.2.2(IEEE)]",连同 “<<(左移)运算符左操作数类型非法” 关于行

bit_list=bit_list<<1;

(旁注:第一个错误也出现在我评论的 "else" 行 - 当然在我评论它们之前)

我的代码:

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

你可能会说我是 verilog 的新手,如果这个问题看起来很菜,我很抱歉。将不胜感激!

你的做法比较不正统。

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

最明显的缺陷:

  • 在您的代码中,您开始查看 'push' 但忽略了它,同时可能存在 'pop'.
  • 在 'pop' 上,您将列表移动一个位置,但需要 N 个周期才能使其落入低谷。
  • 你可能需要一些 'data valid' 标志,每个 FIFO 条目。
  • 您有 'full' 状态但没有 'empty' 状态。接收器不知道什么时候可以开始读取
  • 我发现没有防止写入已满 FIFO 或从空 FIFO 读取的保护措施。
  • 当您拥有更宽的数据时,此 bit_list=bit_list<<1; 将不起作用。你需要一个for循环。

这可能不是你想听到的,但我建议你放弃这种方法,看看现有的带有读写指针的 FIFO

除此之外,您还应该在 @(posedge clk) 部分使用非阻塞分配。