Line 36... |
Line 36... |
//// ////
|
//// ////
|
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
|
|
// CVS Log
|
// CVS Log
|
//
|
//
|
// $Id: ac97_out_fifo.v,v 1.2 2002-03-05 04:44:05 rudi Exp $
|
// $Id: ac97_out_fifo.v,v 1.3 2002-03-11 03:21:22 rudi Exp $
|
//
|
//
|
// $Date: 2002-03-05 04:44:05 $
|
// $Date: 2002-03-11 03:21:22 $
|
// $Revision: 1.2 $
|
// $Revision: 1.3 $
|
// $Author: rudi $
|
// $Author: rudi $
|
// $Locker: $
|
// $Locker: $
|
// $State: Exp $
|
// $State: Exp $
|
//
|
//
|
// Change History:
|
// Change History:
|
Line 60... |
Line 60... |
//
|
//
|
//
|
//
|
|
|
`include "ac97_defines.v"
|
`include "ac97_defines.v"
|
|
|
|
`ifdef AC97_OUT_FIFO_DEPTH_4
|
|
|
|
// 4 Entry Deep version of the Output FIFO
|
|
|
module ac97_out_fifo(clk, rst, en, mode, din, we, dout, re, status, full, empty);
|
module ac97_out_fifo(clk, rst, en, mode, din, we, dout, re, status, full, empty);
|
|
|
input clk, rst;
|
input clk, rst;
|
input en;
|
input en;
|
input [1:0] mode;
|
input [1:0] mode;
|
Line 135... |
Line 139... |
always @(posedge clk)
|
always @(posedge clk)
|
if(!en) dout <= #1 20'h0;
|
if(!en) dout <= #1 20'h0;
|
else
|
else
|
if(re)
|
if(re)
|
case(mode) // synopsys parallel_case full_case
|
case(mode) // synopsys parallel_case full_case
|
0: dout <= #1 {dout_tmp1, 4'h0}; // 16 Bit Output
|
2'h0: dout <= #1 {dout_tmp1, 4'h0}; // 16 Bit Output
|
1: dout <= #1 {dout_tmp[17:0], 2'h0}; // 18 bit Output
|
2'h1: dout <= #1 {dout_tmp[17:0], 2'h0}; // 18 bit Output
|
2: dout <= #1 dout_tmp[19:0]; // 20 Bit Output
|
2'h2: dout <= #1 dout_tmp[19:0]; // 20 Bit Output
|
endcase
|
endcase
|
|
|
always @(posedge clk)
|
always @(posedge clk)
|
if(we) mem[wp[1:0]] <= #1 din;
|
if(we) mem[wp[1:0]] <= #1 din;
|
|
|
endmodule
|
endmodule
|
|
|
|
`endif
|
|
|
|
`ifdef AC97_OUT_FIFO_DEPTH_8
|
|
|
|
// 8 Entry Deep version of the Output FIFO
|
|
|
|
module ac97_out_fifo(clk, rst, en, mode, din, we, dout, re, status, full, empty);
|
|
|
|
input clk, rst;
|
|
input en;
|
|
input [1:0] mode;
|
|
input [31:0] din;
|
|
input we;
|
|
output [19:0] dout;
|
|
input re;
|
|
output [1:0] status;
|
|
output full;
|
|
output empty;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Local Wires
|
|
//
|
|
|
|
reg [31:0] mem[0:7];
|
|
|
|
reg [3:0] wp;
|
|
reg [4:0] rp;
|
|
|
|
wire [3:0] wp_p1;
|
|
|
|
reg [1:0] status;
|
|
reg [19:0] dout;
|
|
wire [31:0] dout_tmp;
|
|
wire [15:0] dout_tmp1;
|
|
wire m16b;
|
|
reg empty;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Misc Logic
|
|
//
|
|
|
|
assign m16b = (mode == 2'h0); // 16 Bit Mode
|
|
|
|
always @(posedge clk)
|
|
if(!en) wp <= #1 4'h0;
|
|
else
|
|
if(we) wp <= #1 wp_p1;
|
|
|
|
assign wp_p1 = wp + 4'h1;
|
|
|
|
always @(posedge clk)
|
|
if(!en) rp <= #1 5'h0;
|
|
else
|
|
if(re & m16b) rp <= #1 rp + 5'h1;
|
|
else
|
|
if(re & !m16b) rp <= #1 rp + 5'h2;
|
|
|
|
always @(posedge clk)
|
|
status <= #1 (wp[2:1] - rp[3:2]) - 2'h1;
|
|
|
|
wire [4:0] rp_p1 = rp[4:0] + 5'h1;
|
|
|
|
always @(posedge clk)
|
|
empty <= #1 (rp_p1[4:1] == wp[3:0]) & (m16b ? rp_p1[0] : 1'b1);
|
|
|
|
assign full = (wp[2:0] == rp[3:1]) & (wp[3] != rp[4]);
|
|
|
|
// Fifo Output
|
|
assign dout_tmp = mem[ rp[3:1] ];
|
|
|
|
// Fifo Output Half Word Select
|
|
assign dout_tmp1 = rp[0] ? dout_tmp[31:16] : dout_tmp[15:0];
|
|
|
|
always @(posedge clk)
|
|
if(!en) dout <= #1 20'h0;
|
|
else
|
|
if(re)
|
|
case(mode) // synopsys parallel_case full_case
|
|
2'h0: dout <= #1 {dout_tmp1, 4'h0}; // 16 Bit Output
|
|
2'h1: dout <= #1 {dout_tmp[17:0], 2'h0}; // 18 bit Output
|
|
2'h2: dout <= #1 dout_tmp[19:0]; // 20 Bit Output
|
|
endcase
|
|
|
|
|
|
always @(posedge clk)
|
|
if(we) mem[wp[2:0]] <= #1 din;
|
|
|
|
endmodule
|
|
|
|
`endif
|
|
|
|
|
|
`ifdef AC97_OUT_FIFO_DEPTH_16
|
|
|
|
// 16 Entry Deep version of the Output FIFO
|
|
|
|
module ac97_out_fifo(clk, rst, en, mode, din, we, dout, re, status, full, empty);
|
|
|
|
input clk, rst;
|
|
input en;
|
|
input [1:0] mode;
|
|
input [31:0] din;
|
|
input we;
|
|
output [19:0] dout;
|
|
input re;
|
|
output [1:0] status;
|
|
output full;
|
|
output empty;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Local Wires
|
|
//
|
|
|
|
reg [31:0] mem[0:15];
|
|
|
|
reg [4:0] wp;
|
|
reg [5:0] rp;
|
|
|
|
wire [4:0] wp_p1;
|
|
|
|
reg [1:0] status;
|
|
reg [19:0] dout;
|
|
wire [31:0] dout_tmp;
|
|
wire [15:0] dout_tmp1;
|
|
wire m16b;
|
|
reg empty;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Misc Logic
|
|
//
|
|
|
|
assign m16b = (mode == 2'h0); // 16 Bit Mode
|
|
|
|
always @(posedge clk)
|
|
if(!en) wp <= #1 5'h0;
|
|
else
|
|
if(we) wp <= #1 wp_p1;
|
|
|
|
assign wp_p1 = wp + 4'h1;
|
|
|
|
always @(posedge clk)
|
|
if(!en) rp <= #1 6'h0;
|
|
else
|
|
if(re & m16b) rp <= #1 rp + 6'h1;
|
|
else
|
|
if(re & !m16b) rp <= #1 rp + 6'h2;
|
|
|
|
always @(posedge clk)
|
|
status <= #1 (wp[3:2] - rp[4:3]) - 2'h1;
|
|
|
|
wire [5:0] rp_p1 = rp[5:0] + 6'h1;
|
|
|
|
always @(posedge clk)
|
|
empty <= #1 (rp_p1[5:1] == wp[4:0]) & (m16b ? rp_p1[0] : 1'b1);
|
|
|
|
assign full = (wp[3:0] == rp[4:1]) & (wp[4] != rp[5]);
|
|
|
|
// Fifo Output
|
|
assign dout_tmp = mem[ rp[4:1] ];
|
|
|
|
// Fifo Output Half Word Select
|
|
assign dout_tmp1 = rp[0] ? dout_tmp[31:16] : dout_tmp[15:0];
|
|
|
|
always @(posedge clk)
|
|
if(!en) dout <= #1 20'h0;
|
|
else
|
|
if(re)
|
|
case(mode) // synopsys parallel_case full_case
|
|
2'h0: dout <= #1 {dout_tmp1, 4'h0}; // 16 Bit Output
|
|
2'h1: dout <= #1 {dout_tmp[17:0], 2'h0}; // 18 bit Output
|
|
2'h2: dout <= #1 dout_tmp[19:0]; // 20 Bit Output
|
|
endcase
|
|
|
|
|
|
always @(posedge clk)
|
|
if(we) mem[wp[3:0]] <= #1 din;
|
|
|
|
endmodule
|
|
|
|
`endif
|
|
|
No newline at end of file
|
No newline at end of file
|