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)
部分使用非阻塞分配。
我正在尝试使用 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)
部分使用非阻塞分配。