@@ -45,6 +45,7 @@ module delay #( parameter
45
45
LENGTH = 2 , // delay/synchronizer chain length
46
46
WIDTH = 1 , // signal width
47
47
TYPE = " CELLS" , // "ALTERA_BLOCK_RAM" infers block ram fifo
48
+ // "ALTERA_TAPS" infers altshift_taps
48
49
// all other values infer registers
49
50
50
51
CNTR_W = $clog2(LENGTH )
@@ -77,56 +78,92 @@ generate
77
78
78
79
end else begin
79
80
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
-
96
81
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
+
97
86
scfifo # (
98
87
.LPM_WIDTH ( WIDTH ),
99
88
.LPM_NUMWORDS ( LENGTH ), // must be at least 4
100
89
.LPM_WIDTHU ( CNTR_W ),
101
90
.LPM_SHOWAHEAD ( " ON" ),
102
91
.UNDERFLOW_CHECKING ( " ON" ),
103
92
.OVERFLOW_CHECKING ( " ON" ),
104
- .ALMOST_FULL_VALUE ( 0 ),
105
- .ALMOST_EMPTY_VALUE ( 0 ),
106
93
.ENABLE_ECC ( " FALSE" ),
107
94
.ALLOW_RWCYCLE_WHEN_FULL ( " ON" ),
108
- .USE_EAB ( " ON" ),
109
- .MAXIMIZE_SPEED ( 5 ),
110
- .DEVICE_FAMILY ( " Cyclone V" )
95
+ .USE_EAB ( " ON" )
111
96
) internal_fifo (
112
97
.clock ( clk ),
113
98
.aclr ( 1'b0 ),
114
99
.sclr ( ~ nrst ),
115
100
116
101
.data ( in[WIDTH - 1 : 0 ] ),
117
102
.wrreq ( ena ),
118
- .rdreq ( ena && fifo_output_ena ),
103
+ .rdreq ( ena && fifo_out_ena ),
119
104
120
105
.q ( fifo_out[WIDTH - 1 : 0 ] ),
121
106
.empty ( ),
122
107
.full ( ),
123
108
.almost_full ( ),
124
109
.almost_empty ( ),
125
- .usedw ( ),
110
+ .usedw ( usedw[ CNTR_W - 1 : 0 ] ),
126
111
.eccstatus ( )
127
112
);
128
113
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 ];
130
167
131
168
end else begin
132
169
0 commit comments