@@ -51,22 +51,22 @@ module axi_ad7616_pif #(
51
51
52
52
// FIFO interface
53
53
54
- output reg [15 :0 ] adc_data_0,
55
- output reg [15 :0 ] adc_data_1,
56
- output reg [15 :0 ] adc_data_2,
57
- output reg [15 :0 ] adc_data_3,
58
- output reg [15 :0 ] adc_data_4,
59
- output reg [15 :0 ] adc_data_5,
60
- output reg [15 :0 ] adc_data_6,
61
- output reg [15 :0 ] adc_data_7,
62
- output reg [15 :0 ] adc_data_8,
63
- output reg [15 :0 ] adc_data_9,
64
- output reg [15 :0 ] adc_data_10,
65
- output reg [15 :0 ] adc_data_11,
66
- output reg [15 :0 ] adc_data_12,
67
- output reg [15 :0 ] adc_data_13,
68
- output reg [15 :0 ] adc_data_14,
69
- output reg [15 :0 ] adc_data_15,
54
+ output reg [15 :0 ] adc_data_0 = 16'b0 ,
55
+ output reg [15 :0 ] adc_data_1 = 16'b0 ,
56
+ output reg [15 :0 ] adc_data_2 = 16'b0 ,
57
+ output reg [15 :0 ] adc_data_3 = 16'b0 ,
58
+ output reg [15 :0 ] adc_data_4 = 16'b0 ,
59
+ output reg [15 :0 ] adc_data_5 = 16'b0 ,
60
+ output reg [15 :0 ] adc_data_6 = 16'b0 ,
61
+ output reg [15 :0 ] adc_data_7 = 16'b0 ,
62
+ output reg [15 :0 ] adc_data_8 = 16'b0 ,
63
+ output reg [15 :0 ] adc_data_9 = 16'b0 ,
64
+ output reg [15 :0 ] adc_data_10 = 16'b0 ,
65
+ output reg [15 :0 ] adc_data_11 = 16'b0 ,
66
+ output reg [15 :0 ] adc_data_12 = 16'b0 ,
67
+ output reg [15 :0 ] adc_data_13 = 16'b0 ,
68
+ output reg [15 :0 ] adc_data_14 = 16'b0 ,
69
+ output reg [15 :0 ] adc_data_15 = 16'b0 ,
70
70
71
71
output adc_valid,
72
72
@@ -82,7 +82,7 @@ module axi_ad7616_pif #(
82
82
input rd_req,
83
83
input wr_req,
84
84
input [15 :0 ] wr_data,
85
- output reg [15 :0 ] rd_data = 'hf ,
85
+ output reg [15 :0 ] rd_data = 'ha1b2 ,
86
86
output reg rd_valid
87
87
);
88
88
@@ -113,12 +113,18 @@ module axi_ad7616_pif #(
113
113
114
114
reg [ 4 :0 ] channel_counter = 5'h0 ;
115
115
reg [ 4 :0 ] nr_rd_burst = 5'd16 ;
116
+ reg wr_req_edge = 1'h0 ;
117
+ reg wr_req_edge_d = 1'h0 ;
118
+ reg rd_req_edge = 1'h0 ;
119
+ reg rd_req_edge_d = 1'h0 ;
116
120
117
121
// internal wires
118
122
119
123
wire rd_new_data_s;
120
124
wire start_transfer_s;
121
125
wire rd_valid_s;
126
+ wire adc_valid_d;
127
+ reg adc_valid_s = 1'h0 ;
122
128
123
129
// FSM state register
124
130
@@ -157,14 +163,23 @@ module axi_ad7616_pif #(
157
163
end
158
164
end
159
165
160
- always @(negedge clk) begin
161
- if (transfer_state == IDLE) begin
166
+ always @(posedge clk) begin
162
167
wr_req_d <= wr_req;
168
+ wr_req_edge <= (wr_req && ! wr_req_d);
163
169
rd_req_d <= rd_req;
170
+ rd_req_edge <= (rd_req && ! rd_req_d);
171
+ if (transfer_state == IDLE) begin
164
172
rd_conv_d <= end_of_conv;
165
173
end
166
174
end
167
175
176
+ // delay with 1 clk
177
+
178
+ always @(posedge clk) begin
179
+ wr_req_edge_d <= wr_req_edge;
180
+ rd_req_edge_d <= rd_req_edge;
181
+ end
182
+
168
183
// channel_counter
169
184
170
185
always @(posedge clk) begin
@@ -249,7 +264,7 @@ module axi_ad7616_pif #(
249
264
end
250
265
CNTRL0_HIGH : begin
251
266
transfer_state_next <= (width_counter != 2'b11 ) ? CNTRL0_HIGH :
252
- ((wr_req_d == 1'b1 ) || (rd_req_d == 1'b1 )) ? CS_HIGH : CNTRL1_LOW;
267
+ ((wr_req_edge_d == 1'b1 ) || (rd_req_edge_d == 1'b1 )) ? CS_HIGH : CNTRL1_LOW;
253
268
end
254
269
CNTRL1_LOW : begin
255
270
transfer_state_next <= (width_counter != 2'b11 ) ? CNTRL1_LOW : CNTRL1_HIGH;
@@ -269,7 +284,7 @@ module axi_ad7616_pif #(
269
284
// data valid for the register access and m_axis interface
270
285
271
286
assign rd_valid_s = (((transfer_state == CNTRL0_HIGH) || (transfer_state == CNTRL1_HIGH)) &&
272
- ((rd_req_d == 1'b1 ) || (rd_conv_d == 1'b1 ))) ? 1'b1 : 1'b0 ;
287
+ ((rd_req_edge_d == 1'b1 ) || (rd_conv_d == 1'b1 ))) ? 1'b1 : 1'b0 ;
273
288
274
289
// FSM output logic
275
290
@@ -283,13 +298,19 @@ module axi_ad7616_pif #(
283
298
rd_valid <= rd_valid_s & ~ rd_valid_d;
284
299
end
285
300
286
- // assign adc_valid = rd_valid;
287
- assign adc_valid = (channel_counter == 5'd16 ) ? rd_valid : 1'b0 ;
301
+ assign adc_valid_d = (channel_counter == 5'd16 ) ? rd_valid : 1'b0 ;
302
+
303
+ // delay with 1 clk
304
+
305
+ always @(posedge clk) begin
306
+ adc_valid_s <= adc_valid_d;
307
+ end
288
308
289
- assign cs_n = (transfer_state == IDLE) ? 1'b1 : 1'b0 ;
290
- assign db_t = ~ wr_req_d;
291
- assign rd_n = (((transfer_state == CNTRL0_LOW) && ((rd_conv_d == 1'b1 ) || rd_req_d == 1'b1 )) ||
309
+ assign adc_valid = adc_valid_s;
310
+ assign cs_n = (transfer_state == IDLE) || (rd_n == 1'b1 ) ? 1'b1 : 1'b0 ;
311
+ assign db_t = ~ wr_req_edge_d;
312
+ assign rd_n = (((transfer_state == CNTRL0_LOW) && ((rd_conv_d == 1'b1 ) || rd_req_edge_d == 1'b1 )) ||
292
313
(transfer_state == CNTRL1_LOW)) ? 1'b0 : 1'b1 ;
293
- assign wr_n = ((transfer_state == CNTRL0_LOW) && (wr_req_d == 1'b1 )) ? 1'b0 : 1'b1 ;
314
+ assign wr_n = ((transfer_state == CNTRL0_LOW) && (wr_req_edge_d == 1'b1 )) ? 1'b0 : 1'b1 ;
294
315
295
316
endmodule
0 commit comments