Skip to content

Commit aa1ac56

Browse files
committed
Added ALTERA_TAPS delay type
1 parent b57c3a9 commit aa1ac56

File tree

1 file changed

+61
-24
lines changed

1 file changed

+61
-24
lines changed

delay.sv

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ module delay #( parameter
4545
LENGTH = 2, // delay/synchronizer chain length
4646
WIDTH = 1, // signal width
4747
TYPE = "CELLS", // "ALTERA_BLOCK_RAM" infers block ram fifo
48+
// "ALTERA_TAPS" infers altshift_taps
4849
// all other values infer registers
4950

5051
CNTR_W = $clog2(LENGTH)
@@ -77,56 +78,92 @@ generate
7778

7879
end else begin
7980
if( TYPE=="ALTERA_BLOCK_RAM" && LENGTH>=4 ) begin
80-
81-
logic [CNTR_W-1:0] delay_cntr = '0;
82-
83-
logic fifo_output_ena;
84-
assign fifo_output_ena = (delay_cntr[CNTR_W-1:0] == LENGTH);
85-
86-
always_ff @(posedge clk) begin
87-
if( ~nrst ) begin
88-
delay_cntr[CNTR_W-1:0] <= '0;
89-
end else begin
90-
if( ena && ~fifo_output_ena) begin
91-
delay_cntr[CNTR_W-1:0] <= delay_cntr[CNTR_W-1:0] + 1'b1;
92-
end
93-
end
94-
end
95-
9681
logic [WIDTH-1:0] fifo_out;
82+
logic [CNTR_W-1:0] usedw;
83+
logic fifo_out_ena;
84+
assign fifo_out_ena = (usedw[CNTR_W-1:0] == LENGTH-1);
85+
9786
scfifo #(
9887
.LPM_WIDTH( WIDTH ),
9988
.LPM_NUMWORDS( LENGTH ), // must be at least 4
10089
.LPM_WIDTHU( CNTR_W ),
10190
.LPM_SHOWAHEAD( "ON" ),
10291
.UNDERFLOW_CHECKING( "ON" ),
10392
.OVERFLOW_CHECKING( "ON" ),
104-
.ALMOST_FULL_VALUE( 0 ),
105-
.ALMOST_EMPTY_VALUE( 0 ),
10693
.ENABLE_ECC( "FALSE" ),
10794
.ALLOW_RWCYCLE_WHEN_FULL( "ON" ),
108-
.USE_EAB( "ON" ),
109-
.MAXIMIZE_SPEED( 5 ),
110-
.DEVICE_FAMILY( "Cyclone V" )
95+
.USE_EAB( "ON" )
11196
) internal_fifo (
11297
.clock( clk ),
11398
.aclr( 1'b0 ),
11499
.sclr( ~nrst ),
115100

116101
.data( in[WIDTH-1:0] ),
117102
.wrreq( ena ),
118-
.rdreq( ena && fifo_output_ena ),
103+
.rdreq( ena && fifo_out_ena ),
119104

120105
.q( fifo_out[WIDTH-1:0] ),
121106
.empty( ),
122107
.full( ),
123108
.almost_full( ),
124109
.almost_empty( ),
125-
.usedw( ),
110+
.usedw( usedw[CNTR_W-1:0] ),
126111
.eccstatus( )
127112
);
128113

129-
assign out[WIDTH-1:0] = (fifo_output_ena)?(fifo_out[WIDTH-1:0]):('0);
114+
logic [WIDTH-1:0] reg_out = '0;
115+
always_ff @(posedge clk) begin
116+
if( ~nrst ) begin
117+
reg_out[WIDTH-1:0] <= '0;
118+
end else if( ena && fifo_out_ena ) begin
119+
reg_out[WIDTH-1:0] <= fifo_out[WIDTH-1:0];
120+
end
121+
end
122+
123+
assign out[WIDTH-1:0] = reg_out[WIDTH-1:0];
124+
125+
end else if( TYPE=="ALTERA_TAPS" && LENGTH>=4 ) begin
126+
127+
logic [WIDTH-1:0] fifo_out;
128+
logic [CNTR_W-1:0] delay_cntr = CNTR_W'(LENGTH-1);
129+
130+
logic fifo_out_ena;
131+
assign fifo_out_ena = (delay_cntr[CNTR_W-1:0] == '0);
132+
133+
always_ff @(posedge clk) begin
134+
if( ~nrst ) begin
135+
delay_cntr[CNTR_W-1:0] <= CNTR_W'(LENGTH-1);
136+
end else if( ena && ~fifo_out_ena ) begin
137+
delay_cntr[CNTR_W-1:0] <= delay_cntr[CNTR_W-1:0] - 1'b1;
138+
end
139+
end
140+
141+
altshift_taps #(
142+
.intended_device_family( "Cyclone V" ),
143+
.lpm_hint( "RAM_BLOCK_TYPE=AUTO" ),
144+
.lpm_type( "altshift_taps" ),
145+
.number_of_taps( 1 ),
146+
.tap_distance( LENGTH-1 ), // min. of 3
147+
.width( WIDTH )
148+
) internal_taps (
149+
//.aclr( 1'b0 ),
150+
//.sclr( ~nrst ),
151+
.clock( clk ),
152+
.clken( ena ),
153+
.shiftin( in[WIDTH-1:0] ),
154+
.shiftout( fifo_out[WIDTH-1:0] )
155+
);
156+
157+
logic [WIDTH-1:0] reg_out = '0;
158+
always_ff @(posedge clk) begin
159+
if( ~nrst ) begin
160+
reg_out[WIDTH-1:0] <= '0;
161+
end else if( ena && fifo_out_ena ) begin
162+
reg_out[WIDTH-1:0] <= fifo_out[WIDTH-1:0];
163+
end
164+
end
165+
166+
assign out[WIDTH-1:0] = reg_out[WIDTH-1:0];
130167

131168
end else begin
132169

0 commit comments

Comments
 (0)