///////////////////write pointer////////////////////////
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) wrt_ptr <= 3'b0;
else if(wrt_ptr == 3'b111) wrt_ptr <=0;
else if((!wrt_strobe_n)&&(full_n)&&(rd_strobe_n))
begin
wrt_ptr<=(wrt_ptr+1);
// wr_mark<=1;
end
else begin
wrt_ptr<=wrt_ptr;
//wr_mark<=0;
end
end
///////////////////read pointer/////////////////////
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) rd_ptr <= 3'b0;
else if(rd_ptr == 3'b111) rd_ptr <=0;
else if((!rd_strobe_n)&&(empty_n)&&(wrt_strobe_n))
begin
rd_ptr<= (rd_ptr+1);
//rd_mark<=1;
end
else begin
rd_ptr<=rd_ptr;
//rd_mark<=0;
end
end
//////////register counter:from 0(empty) to 8(full)////////
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) reg_count<=0;
else
casez({wrt_strobe_n,rd_strobe_n})
2'b01: reg_count <= (full_n) ? (reg_count+1) : reg_count;//write---count+1
2'b10: reg_count <= (empty_n) ? (reg_count-1) : reg_count;//read---count-1
default: reg_count <= reg_count;
endcase
end
///////////////////write pointer////////////////////////
if((!wrt_strobe_n)&&(full_n)&&(rd_strobe_n))
begin
wrt_ptr<=(wrt_ptr+1);
end
else
begin
wrt_ptr<=wrt_ptr;
end
想问一下,
给写信号,不给读信号的,非满的时候 执行 +1的操作;
else下面执行的 给读写信号,非满!执行保持!
我写一个同时读一个,这个时候写指针不+1么?
FIFO 是先进先出,我写到 1 ,2 ,3 号地址,现在 应该是先从1号地址读出吧,如果我写到了3号房间的时候,开始从1号房间开始读的话,那么我在写的话 应该是往4号房间里写啊,读也应该是从1号一次+1 的往外读啊!但是 从程序上看 并没有实现这个思路的操作。
想试图 写一个FIFO,大家有没有资料,给小弟看看,谢谢!!
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你要自己设计一个FIFO吗?
嗯 想 自己写一个
module fifo(clk,rst_n,fifo_wr,fifo_rd,empty,full);
input clk;
input rst_n;
input fifo_wr;
input fifo_rd;
output empty,full;
reg empty; //空标志
reg full; //满标志
reg [leth-1:0] fifomem [dep-1:0];
// ----empty
always @(posedge clk or posedge rst_n)
if(!rst_n)
empty<=1;
else if(fifo_wr)
empty<=0;
else if(fifo_rd&&(wr_ptr_s==rd_ptr_s+1))
empty<=1;
else empty<=empty;
//-----full
always @(posedge clk or posedge rst_n)
if(!rst_n)
full<=0;
else if(fifo_rd)
full<=0;
else if(fifo_wr&&rd_ptr_s==wr_ptr_s+1)
full<=0;
else full<=full;
reg valid_rd_s ;
reg valid_wr_s ;
always @(empty or fifo_rd)
if(!empty&&fifo_rd)
valid_rd_s<=1;
always @(full or fifo_wr)
if(!full&&fifo_wr)
valid_wr_s<=1;
reg [dep-1;0] rd;
reg [dep-1;0] wr;
endmodule
这个是我看了一片VHDL语言写的 FIFO,自己翻译成verilog代码;我总是感觉我发的帖子上的判断条件有问题,不符合逻辑。
一周热门 更多>