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

📄 ufiforx.v

📁 实现USB接口功能的VHDL和verilog完整源代码
💻 V
字号:
module Ufiforx (
		 setcmdwr,
		 getdata,
		 mcclock,
		 usbclock,
		 mmcreset,
		 syncreset,
		 fifowr,
		 fiford,
		 fifowrdata,
		 fiforddata,
		 fifordready,
		 fifowrready,
		 datapacketok,
		 datapacketnotok
		 );
input   setcmdwr;
input   getdata;
  input          mmcreset;
  input          mcclock;
  input			 usbclock;
  input			 syncreset; 
  input			 fifowr;
  input			 fiford;
  
  parameter		 DFFDEPTH = 32,
    			 DFFWIDTH = 8,
	    		 FULL = 8,
	    		 DFFADDRWIDTH = 5;	// 2^6 is 64
  
  input [DFFWIDTH-1:0]	 fifowrdata;
  output [DFFWIDTH-1:0]  fiforddata;
 
  output		 fifordready;
  output		 fifowrready;
  input			 datapacketok;
  input			 datapacketnotok;
  reg   		 fifordready;


  reg [DFFWIDTH-1:0]	 ffdata [DFFDEPTH-1:0];
  reg [DFFADDRWIDTH:0] wraddr,rdaddr,oldrdaddr;
  wire			 full,empty;
  

  always @(posedge usbclock)
    begin
      if (syncreset || (!getdata && !setcmdwr) )
	begin
	  rdaddr <= 'h0;
	  oldrdaddr <= 'h0;
	end // if (syncreset)
      else
	begin
	  rdaddr <= (fiford) ? rdaddr + 1'b1 : (datapacketnotok) ?
	             oldrdaddr : rdaddr;
	  oldrdaddr <= (datapacketok) ? rdaddr : oldrdaddr;
	end // else: !if(syncreset)
    end // always @ (posedge usbclock)
  
  wire [DFFWIDTH-1:0] fiforddata = ffdata[rdaddr[DFFADDRWIDTH-1:0]];

 always@(posedge mcclock)
   begin
	  if(mmcreset || (!getdata && !setcmdwr) )
	    wraddr <= 'h0;
      else
		begin
		   wraddr <= (fifowr) ? wraddr + 1'b1 : wraddr;
           ffdata[wraddr[DFFADDRWIDTH-1:0]] <= (fifowr) ? fifowrdata :
				   ffdata[wraddr[DFFADDRWIDTH-1:0]];
        end
   end
  
  assign empty = oldrdaddr[DFFADDRWIDTH:0] == wraddr[DFFADDRWIDTH:0];
  assign full = (rdaddr[DFFADDRWIDTH-1:0] == wraddr[DFFADDRWIDTH-1:0]) &&
                (wraddr[DFFADDRWIDTH] != rdaddr[DFFADDRWIDTH]);
  
  //wire fifordready =  full;
  //wire fifowrready = ~full;

 always @(posedge usbclock ) begin
    fifordready =  full ? 1: (empty ? 0: fifordready) ;
  end 
  reg  fifowrready;

always @(posedge mcclock)
	fifowrready = full ? 0: (empty ? 1 : fifowrready);


  // synopsys translate_off
  always @(posedge usbclock)
    begin
      if (full && fifowr && !fiford)
	$write ("Error :****** %m fifo overrun at time %t\n",$time);
      if (empty && ~fifowr && fiford)
	$write ("Error :****** %m fifo underrun at time %t\n",$time);
    end // always @ (posedge usbclock)

  wire [DFFWIDTH-1:0] debugdata0 = ffdata[0];
  wire [DFFWIDTH-1:0] debugdata1 = ffdata[1];
  wire [DFFWIDTH-1:0] debugdata2 = ffdata[2];
  wire [DFFWIDTH-1:0] debugdata3 = ffdata[3];
  
  wire [DFFWIDTH-1:0] debugdata4 = ffdata[4];
  wire [DFFWIDTH-1:0] debugdata5 = ffdata[5];
  wire [DFFWIDTH-1:0] debugdata6 = ffdata[6];
  wire [DFFWIDTH-1:0] debugdata7 = ffdata[7];
  // synopsys translate_on

endmodule // devfifo

⌨️ 快捷键说明

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