Skip to content

Commit cfd86f8

Browse files
committed
library:axi_ad7616: Updates for a functional testbench
Signed-off-by: Pop Ioan Daniel <pop.ioan-daniel@analog.com>
1 parent 0b52caa commit cfd86f8

File tree

2 files changed

+50
-29
lines changed

2 files changed

+50
-29
lines changed

library/axi_ad7616/axi_ad7616.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ module axi_ad7616 #(
169169
wire up_wreq_s;
170170
wire [13:0] up_waddr_s;
171171
wire [31:0] up_wdata_s;
172-
wire [31:0] up_rdata_s[0:16]; // 8 || 16 ?????
172+
wire [31:0] up_rdata_s[0:16];
173173
wire [16:0] up_rack_s;
174174
wire [16:0] up_wack_s;
175175

@@ -226,7 +226,7 @@ module axi_ad7616 #(
226226
up_rdata_r = 'h00;
227227
up_rack_r = 'h00;
228228
up_wack_r = 'h00;
229-
for (j = 0; j <= 16; j=j+1) begin // ??? <= 16 ?????
229+
for (j = 0; j <= 16; j=j+1) begin
230230
up_rack_r = up_rack_r | up_rack_s[j];
231231
up_wack_r = up_wack_r | up_wack_s[j];
232232
up_rdata_r = up_rdata_r | up_rdata_s[j];

library/axi_ad7616/axi_ad7616_pif.v

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,22 @@ module axi_ad7616_pif #(
5151

5252
// FIFO interface
5353

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,
7070

7171
output adc_valid,
7272

@@ -82,7 +82,7 @@ module axi_ad7616_pif #(
8282
input rd_req,
8383
input wr_req,
8484
input [15:0] wr_data,
85-
output reg [15:0] rd_data = 'hf,
85+
output reg [15:0] rd_data = 'ha1b2,
8686
output reg rd_valid
8787
);
8888

@@ -113,12 +113,18 @@ module axi_ad7616_pif #(
113113

114114
reg [ 4:0] channel_counter = 5'h0;
115115
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;
116120

117121
// internal wires
118122

119123
wire rd_new_data_s;
120124
wire start_transfer_s;
121125
wire rd_valid_s;
126+
wire adc_valid_d;
127+
reg adc_valid_s = 1'h0;
122128

123129
// FSM state register
124130

@@ -157,14 +163,23 @@ module axi_ad7616_pif #(
157163
end
158164
end
159165

160-
always @(negedge clk) begin
161-
if (transfer_state == IDLE) begin
166+
always @(posedge clk) begin
162167
wr_req_d <= wr_req;
168+
wr_req_edge <= (wr_req && !wr_req_d);
163169
rd_req_d <= rd_req;
170+
rd_req_edge <= (rd_req && !rd_req_d);
171+
if (transfer_state == IDLE) begin
164172
rd_conv_d <= end_of_conv;
165173
end
166174
end
167175

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+
168183
//channel_counter
169184

170185
always @(posedge clk) begin
@@ -249,7 +264,7 @@ module axi_ad7616_pif #(
249264
end
250265
CNTRL0_HIGH : begin
251266
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;
253268
end
254269
CNTRL1_LOW : begin
255270
transfer_state_next <= (width_counter != 2'b11) ? CNTRL1_LOW : CNTRL1_HIGH;
@@ -269,7 +284,7 @@ module axi_ad7616_pif #(
269284
// data valid for the register access and m_axis interface
270285

271286
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;
273288

274289
// FSM output logic
275290

@@ -283,13 +298,19 @@ module axi_ad7616_pif #(
283298
rd_valid <= rd_valid_s & ~rd_valid_d;
284299
end
285300

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
288308

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)) ||
292313
(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;
294315

295316
endmodule

0 commit comments

Comments
 (0)