Verilog-移位寄存器
我正在尝试使用verilog编写一个依赖于参数的FIFO 具体来说,它取决于字宽M和队列长度N。 我已经开始实现1位宽的fifo 我在调试它时遇到了问题(这就是它有点混乱的原因,抱歉!),当处理寄存器位列表时出现了主要问题 在实现该寄存器时,我希望将其移位,以弹出位_列表[N-1]中的值,同时将寄存器的其余1位移向N-1 不幸的是,我的实现不起作用,结果出现错误: “内存或数组引用需要索引[3.8][4.2.2(IEEE)]”,以及Verilog-移位寄存器,verilog,Verilog,我正在尝试使用verilog编写一个依赖于参数的FIFO 具体来说,它取决于字宽M和队列长度N。 我已经开始实现1位宽的fifo 我在调试它时遇到了问题(这就是它有点混乱的原因,抱歉!),当处理寄存器位列表时出现了主要问题 在实现该寄存器时,我希望将其移位,以弹出位_列表[N-1]中的值,同时将寄存器的其余1位移向N-1 不幸的是,我的实现不起作用,结果出现错误: “内存或数组引用需要索引[3.8][4.2.2(IEEE)]”,以及 “你的做法很不正统 制作FIFO最常见、最简单的方法是使用内存
“你的做法很不正统 制作FIFO最常见、最简单的方法是使用内存、读写指针 最明显的缺陷是:
- 在代码中,您开始查看“推送”,但同时忽略可能出现的“弹出”
- 在“pop”中,您将列表移动一个位置,但需要N个周期才能使其下降到谷底
- 您可能需要一些“数据有效”标志来标记每个FIFO条目
- 您有一个“满”状态,但没有“空”状态。接收器不知道何时可以开始读取
- 我认为没有保护措施可以防止写入完整的FIFO或读取空的FIFO
- 此
bit_list=bit_list如果您将您的bit_列表声明为以下
但是,您还有其他问题,例如错误地使用阻塞分配。我按照指示的方式设计了此fifo,无论如何,Serge回答了我的问题,但我将使用您的其余评论来改进我的代码。谢谢!reg[N-1:0],则会消除错误bit_list;
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