⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wptr_full.v

📁 多时钟域下同步逻辑的RTL代码(包括数据同步器和控制信号万能同步器)
💻 V
字号:
/*************************************************
 *		模块名:wptr_full
 *		时  间:2007-05-14
 *    设计者:张波涛
 *    说  明:FIFO的判满逻辑
 *************************************************/
 
//`include "timescale.v"

module wptr_full(
	wfull,		//FIFO的满信号                   
	waddr,      //满地址, (n-1)位Gray码          
	wptr,       //满指针, n位Gray码, 送往写时钟域
	wrptr2,     //同步读指针,从读时钟域来        
	winc,       //写请求信号                     
	wclk,       //写时钟                         
	wrst_n      //写时钟域复位信号               
	);
	
  parameter ADDRSIZE = 4;
  
  output  wfull;
  output  [ADDRSIZE-1:0] waddr;
  output  [ADDRSIZE:0] wptr;
  
  input   [ADDRSIZE:0] wrptr2;
  input	 winc,wclk,wrst_n;
  reg 	 [ADDRSIZE:0] wptr,wbin,wgnext,wbnext;		//当前写指针(Gray), 写地址(二进制), 下一拍写指针(Gray), 写地址(二进制)
  reg 	 wfull,waddrmsb;
  
  //产生Gray码
  always @ (posedge wclk or negedge wrst_n)
  begin
     if(!wrst_n)
       begin
        wptr <= 0;
        waddrmsb <= 0;
       end
     else begin
       wptr <= wgnext;
       waddrmsb <= wgnext[ADDRSIZE]^wgnext[ADDRSIZE-1];
      end
  end
  
  //产生下一拍的地址和指针    
  always @(wptr or winc)
  begin:Gray_inc
  
    integer i;
    
    for (i=0;i<=ADDRSIZE;i=i+1)
       wbin[i] = ^(wptr >> i);
       
    if(!wfull)
       wbnext = wbin + winc;
    else
       wbnext = wbin;
       
    wgnext = (wbnext >> 1)^wbnext;
  end
    
   //写地址
   assign waddr = {waddrmsb,wptr[ADDRSIZE-2:0]};
   
   //判满逻辑
   wire w_2ndmsb = wgnext[ADDRSIZE]^wgnext[ADDRSIZE-1];
   wire wr_2ndmsb = wrptr2[ADDRSIZE]^wrptr2[ADDRSIZE-1];
   
   always @(posedge wclk or negedge wrst_n)
      if(!wrst_n)
         wfull <= 0;
      else 
         wfull <= ((wgnext[ADDRSIZE] != wrptr2[ADDRSIZE])&&
                  (w_2ndmsb == wr_2ndmsb)&&
                  (wgnext[ADDRSIZE -2:0] == wrptr2[ADDRSIZE-2:0]));
                  
 endmodule
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -