📄 ufiforx.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 + -