微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FIFO 的小小疑问 求各位大侠指教

FIFO 的小小疑问 求各位大侠指教

时间:10-02 整理:3721RD 点击:
FIFO 的小小疑问 求各位大侠指教
///////////////////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,大家有没有资料,给小弟看看,谢谢!

你这看问题角度不对...
你要从wrt_ptr和rd_ptr的角度去理解。
按你说的,现在wrt_ptr=3,rd_ptr=0,如果同时来读写信号。
根据逻辑,wrt_ptr+1.rd_ptr+1,也就是说,你写入的地址是4,读出的地址就是1...这个已经很“自然的”体现了这个操作....
切记这是两个分开的指针,各自维护各自的逻辑...
你把他们混一起了..


if((!rd_strobe_n)&&(empty_n)&&(wrt_strobe_n))   从这程序看
给读信号(!rd_strobe_n)的时候 还要同时 不写信号(wrt_strobe_n)

你给的这段代码是不完全的...只是一种情况,而且这种情况其实是不需要用这个条件做逻辑判断...读写两套地址,各自独立维护...不用考虑同时有效的交集...

verilog真是越学越难

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top