应为左侧对象的verilog代码中的错误分配一个变量
我一直试图在verilog中创建一个异步fifo,但我面临一个问题:赋值左侧的对象“空”和“满”应该具有变量数据类型 顶部模块:应为左侧对象的verilog代码中的错误分配一个变量,verilog,intel-fpga,Verilog,Intel Fpga,我一直试图在verilog中创建一个异步fifo,但我面临一个问题:赋值左侧的对象“空”和“满”应该具有变量数据类型 顶部模块: module async_fifo (reset, wclock, rclock, datain, dataout, e, f); input [15:0] datain; output reg [15:0] dataout; //reg [15:0] mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8; reg [15:0]
module async_fifo (reset, wclock, rclock, datain, dataout, e, f);
input [15:0] datain;
output reg [15:0] dataout;
//reg [15:0] mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8;
reg [15:0] mem [7:0];
input reset, rclock, wclock;
/*reg [0:2] wptr, rptr;
initial wptr = 3'b000;
initial rptr = 3'b000;*/
integer wflag = 0, rflag = 0;
wire empty , full;
input e,f;
reg [0:2] wptr = 3'b000, rptr = 3'b000;
counter c(wclock, rclock, empty, full);
e = empty;
f = full;
always@(posedge wclock)
begin
if(f == 1'b0)
begin
e = 1'b0;
if (wptr < 3'b111)
begin
mem[wptr] = datain;
wptr = wptr + 3'b001;
end
else if(wptr == 3'b111 && wflag == 0)
wflag = 1;
else if (wflag == 1)
begin
wptr = 3'b000;
wflag = 0;
end
end
end
always@(posedge rclock)
begin
if(e == 1'b0)
begin
f = 1'b0;
if (rptr < 3'b111)
begin
dataout = mem[rptr];
rptr = rptr + 3'b001;
end
else if(rptr == 3'b111 && rflag == 0)
rflag = 1;
else if (rflag == 1)
begin
rptr = 3'b000;
rflag = 0;
end
end
end
endmodule
您正在行为块的左侧使用full和empty(始终)。所以它们必须是寄存器。 但同时它们是计数器的输出,必须是导线。 您不能以这种方式使用变量。它们可以是一个瞬间的输出,只用于代码其他部分的右侧,也可以是行为块左侧的regsietr,也可以是另一个瞬间的输入。 你最好改变你的编码风格 以下是异步FIFO的示例: 你还需要研究阻塞和非阻塞分配以及竞赛条件。看看这个:
作为verilog的新手,我无法找到新的编码方式来解决这个问题。你能帮我解决这个问题吗?我已经编辑了代码,知道我收到一个错误,说aync_fifo代码中的语句“e=empty;”应该是“.”或“(”。错误是:“error(10170):Verilog HDL语法错误,在async_fifo.v(16)附近,文本“=”应该“,”或“(”可能的重复
module counter(w_clock, r_clock, empty, full);
input w_clock, r_clock;
output reg empty = 0, full = 0;
integer rear = 0, front = 0;
always @ (posedge w_clock)
begin
if ((front == 1 && rear == 8) || front == rear + 1)
full = 1;
else if(rear == 8)
begin
rear = 1;
empty = 0;
end
else
begin
rear = rear+1;
empty = 0;
end
end
always @ (posedge r_clock)
begin
if (front == 0 && rear == 0)
empty = 1;
else if(front == 8)
begin
front = 1;
full = 0;
end
else
begin
front = front+1;
full = 0;
end
end
endmodule