Skip to content

Commit 002db31

Browse files
committed
Added dalayed_event module
1 parent 3ddb800 commit 002db31

File tree

2 files changed

+122
-14
lines changed

2 files changed

+122
-14
lines changed

delay.sv

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
delay #(
2929
.LENGTH( 2 ),
3030
.WIDTH( 1 ),
31-
.TYPE( "CELLS" )
31+
.TYPE( "CELLS" ),
32+
.REGISTER_OUTPUTS( "FALSE" )
3233
) S1 (
3334
.clk( clk ),
3435
.nrst( 1'b1 ),
@@ -42,11 +43,17 @@ delay #(
4243

4344

4445
module delay #( parameter
45-
LENGTH = 2, // delay/synchronizer chain length
46-
WIDTH = 1, // signal width
47-
TYPE = "CELLS", // "ALTERA_BLOCK_RAM" infers block ram fifo
48-
// "ALTERA_TAPS" infers altshift_taps
49-
// all other values infer registers
46+
LENGTH = 2, // delay/synchronizer chain length
47+
WIDTH = 1, // signal width
48+
49+
TYPE = "CELLS", // "ALTERA_BLOCK_RAM" infers block ram fifo
50+
// "ALTERA_TAPS" infers altshift_taps
51+
// all other values infer registers
52+
53+
REGISTER_OUTPUTS = "FALSE", // for block RAM implementations: "TRUE" means that
54+
// last delay stage will be implemented
55+
// by means of cell registers to improve timing
56+
// all other values infer block RAMs only
5057

5158
CNTR_W = $clog2(LENGTH)
5259
)(
@@ -77,11 +84,18 @@ generate
7784
assign out[WIDTH-1:0] = data[WIDTH-1:0];
7885

7986
end else begin
80-
if( TYPE=="ALTERA_BLOCK_RAM" && LENGTH>=4 ) begin
87+
if( TYPE=="ALTERA_BLOCK_RAM" && LENGTH>=3 ) begin
88+
8189
logic [WIDTH-1:0] fifo_out;
90+
logic full;
8291
logic [CNTR_W-1:0] usedw;
92+
8393
logic fifo_out_ena;
84-
assign fifo_out_ena = (usedw[CNTR_W-1:0] == LENGTH-1);
94+
if( REGISTER_OUTPUTS=="TRUE" ) begin
95+
assign fifo_out_ena = (usedw[CNTR_W-1:0] == LENGTH-1);
96+
end else begin
97+
assign fifo_out_ena = full;
98+
end
8599

86100
scfifo #(
87101
.LPM_WIDTH( WIDTH ),
@@ -104,7 +118,7 @@ generate
104118

105119
.q( fifo_out[WIDTH-1:0] ),
106120
.empty( ),
107-
.full( ),
121+
.full( full ),
108122
.almost_full( ),
109123
.almost_empty( ),
110124
.usedw( usedw[CNTR_W-1:0] ),
@@ -120,9 +134,14 @@ generate
120134
end
121135
end
122136

123-
assign out[WIDTH-1:0] = reg_out[WIDTH-1:0];
137+
if( REGISTER_OUTPUTS=="TRUE" ) begin
138+
assign out[WIDTH-1:0] = reg_out[WIDTH-1:0];
139+
end else begin
140+
// avoiding first word fall-through
141+
assign out[WIDTH-1:0] = (fifo_out_ena)?(fifo_out[WIDTH-1:0]):('0);
142+
end
124143

125-
end else if( TYPE=="ALTERA_TAPS" && LENGTH>=4 ) begin
144+
end else if( TYPE=="ALTERA_TAPS" && LENGTH>=2 ) begin
126145

127146
logic [WIDTH-1:0] fifo_out;
128147
logic [CNTR_W-1:0] delay_cntr = CNTR_W'(LENGTH-1);
@@ -143,7 +162,7 @@ generate
143162
.lpm_hint( "RAM_BLOCK_TYPE=AUTO" ),
144163
.lpm_type( "altshift_taps" ),
145164
.number_of_taps( 1 ),
146-
.tap_distance( LENGTH-1 ), // min. of 3
165+
.tap_distance( (REGISTER_OUTPUTS=="TRUE")?(LENGTH-1):(LENGTH) ), // min. of 3
147166
.width( WIDTH )
148167
) internal_taps (
149168
//.aclr( 1'b0 ),
@@ -154,6 +173,7 @@ generate
154173
.shiftout( fifo_out[WIDTH-1:0] )
155174
);
156175

176+
if( REGISTER_OUTPUTS=="TRUE" ) begin
157177
logic [WIDTH-1:0] reg_out = '0;
158178
always_ff @(posedge clk) begin
159179
if( ~nrst ) begin
@@ -162,8 +182,10 @@ generate
162182
reg_out[WIDTH-1:0] <= fifo_out[WIDTH-1:0];
163183
end
164184
end
165-
166-
assign out[WIDTH-1:0] = reg_out[WIDTH-1:0];
185+
assign out[WIDTH-1:0] = reg_out[WIDTH-1:0];
186+
end else begin
187+
assign out[WIDTH-1:0] = fifo_out[WIDTH-1:0];
188+
end
167189

168190
end else begin
169191

delayed_event.sv

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
//------------------------------------------------------------------------------
2+
// delayed_event.sv
3+
// Konstantin Pavlov, [email protected]
4+
//------------------------------------------------------------------------------
5+
6+
// INFO ------------------------------------------------------------------------
7+
// Module generates delayed pulse one clock width
8+
// Could be useful for initialization or sequencing some tasks
9+
// Could be easily daisy-chained by connecting "after_event" outputs
10+
// to the subsequent "ena" inputs
11+
//
12+
// |
13+
// |___,___, ,___,___,___,___,___,___,___,___,___,___,___,
14+
// | , |___| , , , , , , , , , , , nrst
15+
// |
16+
// | <---------- DELAY -------->
17+
// | ___
18+
// |___,___,___,___,___,___,___,___,___,___| |___,___,___, on
19+
// |
20+
// |___,___,___,___,___,___,___,___,___,___,
21+
// | , , , , , , , , , |___,___,___,___, before_event
22+
// |
23+
// |___,___, ___,___,___,___,
24+
// | , |___,___,___,___,___,___,___,___| , , , , after_event
25+
// |
26+
//
27+
28+
29+
/* --- INSTANTIATION TEMPLATE BEGIN ---
30+
31+
delayed_event #(
32+
.DELAY( 8 )
33+
) de1 (
34+
.clk( clk ),
35+
.nrst( nrst ),
36+
.ena( ),
37+
38+
.on_event( ), // one clock cycle
39+
.before_event( ),
40+
.after_event( )
41+
);
42+
43+
--- INSTANTIATION TEMPLATE END ---*/
44+
45+
module pulse_gen #( parameter
46+
DELAY = 32,
47+
CNTR_WIDTH = $clog(DELAY)
48+
)(
49+
input clk, // system clock
50+
input nrst, // negative reset
51+
input ena, // enable
52+
53+
output on_event, // one clock cycle
54+
output before_event, // event outputs
55+
output after_event // event outputs
56+
);
57+
58+
59+
logic [CNTR_WIDTH-1:0] seq_cntr = DELAY;
60+
61+
logic seq_cntr_is_0;
62+
assign seq_cntr_is_0 = (seq_cntr[CNTR_WIDTH-1:0]=='0);
63+
64+
always_ff @(posedge clk) begin
65+
if( ~nrst) begin
66+
seq_cntr[CNTR_WIDTH-1:0] <= DELAY;
67+
end else begin
68+
if( ena && ~seq_cntr_is_0 ) begin
69+
seq_cntr[CNTR_WIDTH-1:0] <= seq_cntr[CNTR_WIDTH-1:0] - 1'b1;
70+
end
71+
end // nrst
72+
end
73+
74+
edge_detect cntr_edge (
75+
.clk( clk ),
76+
.nrst( 1'b1 ),
77+
.in( seq_cntr_is_0 ),
78+
.rising( on_event )
79+
);
80+
81+
assign before_event = ~seq_cntr_is_0;
82+
assign after_event = seq_cntr_is_0;
83+
84+
85+
endmodule
86+

0 commit comments

Comments
 (0)