Ich versuche, Eingangsdaten, die von der ADC-Komponente in DDR kommen, zu meinem FPGA zu verzögern und sie anschließend in der steigenden Taktflanke auszugeben. Der ADC, den ich verwende: ADS5463:
Ich verwende Lattice ECP3 FPGA, basierend auf dem FPGA-Datenblatt hat dieses FPGA ein eingebautes Verzögerungsmodul namens DELAYB:
Der Grund, warum ich versuche, die Eingänge zu verzögern, besteht darin, die Setup-Zeit und die Haltezeit zu maximieren, wie es der ADS5463 empfiehlt.
Mein Code für den Versuch, dieses Verzögerungsmodul zu verwenden und die verzögerten Daten im steigenden Flankentakt auszugeben:
module top(
input rstn,
input dry, //DRY=fs/2 -> fs=300Mhz -> DRY=150MHz
input [11:0] data_input,
output clk2,
output [11:0] data_output
);
wire clk2;
wire rst;
wire [11:0] data_input_delay;
reg [11:0] posedge_data;
reg [11:0] negedge_data;
reg [23:0] data_output;
assign rst = ~rstn;
//divide clk. clk2=dry_i/2=75MHz.
CLKDIVB div2 (
.CLKI (dry),
.RST (rst),
.RELEASE(1'b1),
.CDIV1 (),
.CDIV2 (clk2),
.CDIV4 (),
.CDIV8 ()
);
//delay data => 35ps steps.
genvar i;
generate
for (i = 0; i < 12; i = i + 1) begin
DELAYB delay (
.A(data_input[i]),
.DEL0(1'b1),
.DEL1(1'b1),
.DEL2(1'b0),
.DEL3(1'b0),
.Z(data_input_delay[i])
);
end
endgenerate
always @(posedge dry, posedge rst)
begin
if (rst) begin
posedge_data <= 12'b100000000000;
end else begin
posedge_data <= data_input_delay;
end
end
always @(negedge dry, posedge rst)
begin
if (rst) begin
negedge_data <= 12'b100000000000;
end else begin
negedge_data <= data_input_delay;
end
end
always @(posedge clk2, posedge rst)
begin
if (rst) begin
data_output <= 24'b100000000000100000000000;
end else begin
data_output <= {posedge_data, negedge_data};
end
end
endmodule
Wenn ich versuche, diesen Code zu synthetisieren, erhalte ich diese Fehlermeldung von Diamond Lattice:
FEHLER – Die dynamische Verzögerungszelle „genblk1[0].delay“ kann die Komponente „negedge_data[0]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[11].delay“ kann die Komponente „negedge_data[11]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[10].delay“ kann die Komponente „negedge_data[10]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[9].delay“ kann die Komponente „negedge_data[9]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[8].delay“ kann die Komponente „negedge_data[8]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[7].delay“ kann die Komponente „negedge_data[7]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[6].delay“ kann die Komponente „negedge_data[6]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[5].delay“ kann die Komponente „negedge_data[5]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[4].delay“ kann die Komponente „negedge_data[4]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1[3].delay“ kann die Komponente „negedge_data[3]“ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1 2 .delay“ kann die Komponente „negedge_data 2 “ nicht ansteuern.
FEHLER – Die dynamische Verzögerungszelle „genblk1 1 .delay“ kann die Komponente „negedge_data 1 “ nicht ansteuern.
INFO - Fehler im Design des Benutzers gefunden. Ausgabedateien nicht geschrieben. Überprüfen Sie den Kartenbericht für weitere Details.
Kann mir bitte jemand helfen, zu sehen, was passiert? Ich habe Ref-Design, das diese Komponenten verwendet und dort funktioniert es gut, was ist falsch?
Nach dem Rakend-Kommentar bearbeiten:
OK, nachdem IFS1P3IX-Instanzen zu den Ausgangsregistern des DELAYB-Moduls hinzugefügt wurden, wie in der Referenz empfohlen. Es hat die oben genannten Fehler behoben, aber jetzt ist mein Design, das die data_inputs in den High-Z-Modus versetzt, es funktioniert immer noch nicht, das Design besteht die Synthesen, gibt mir aber diese Warnung, wodurch das Design jetzt funktioniert.
der neue Code:
module top (rstn,dry,data_input,clk2,led_clk,led_rst,data_output);
input rstn;
input dry; //DRY=fs/2 -> fs=300Mhz -> DRY=150MHz
input [11:0] data_input;
output wire clk2;
output led_clk;
output reg led_rst;
output reg [23:0] data_output;
wire rst;
wire [11:0] data_input_temp;
wire [11:0] data_input_delay;
reg [25:0] adc_clk_count = 26'b0;
assign rst = ~rstn;
//divide clk. clk2=dry_i/2=75MHz.
CLKDIVB div2 (
.CLKI (dry),
.RST (rst),
.RELEASE(1'b1),
.CDIV1 (),
.CDIV2 (clk2),
.CDIV4 (),
.CDIV8 ()
);
genvar i;
generate
for (i = 0; i < 12; i = i + 1) begin
DELAYB delay (
.A(data_input[i]),
.DEL0(1'b1),
.DEL1(1'b1),
.DEL2(1'b0),
.DEL3(1'b0),
.Z(data_input_temp[i])
);
end
endgenerate
genvar j;
generate
for (j = 0; j < 12; j = j + 1) begin
IFS1P3IX data_reg (
.Q(data_input_delay[j]),
.SP(1'b1),
.CD(rst),
.SCLK(dry),
.D(data_input_temp[j])
);
end
endgenerate
endmodule
die kritische Warnung Diamond Drop auf mich:
2019991 WARNING - CL168 :"C:\----\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[11].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[10].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[9].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\----------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[8].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[7].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[6].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[5].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[4].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[3].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[2].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\---------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[1].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\---------\ADC_Interface\src\top.v":51:12:51:19|Removing instance genblk2[0].data_reg because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\-------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[11].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[10].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\----------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[9].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[8].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\---------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[7].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[6].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\---------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[5].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\---------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[4].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\----------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[3].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\--------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[2].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\----------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[1].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019991 WARNING - CL168 :"C:\-----------\ADC_Interface\src\top.v":37:10:37:14|Removing instance genblk1[0].delay because it does not drive other instances. To preserve this instance, use the syn_noprune synthesis directive.
2019993 WARNING - MT420 |Found inferred clock top|dry with period 5.00ns. Please declare a user-defined clock on port dry.
1166052 WARNING - logical net 'CDIV1' has no load.
1166052 WARNING - logical net 'CDIV4' has no load.
1166052 WARNING - logical net 'CDIV8' has no load.
1166052 WARNING - logical net 'data_input_c[0]' has no load.
1166052 WARNING - logical net 'data_input_c[1]' has no load.
1166052 WARNING - logical net 'data_input_c[2]' has no load.
1166052 WARNING - logical net 'data_input_c[3]' has no load.
1166052 WARNING - logical net 'data_input_c[4]' has no load.
1166052 WARNING - logical net 'data_input_c[5]' has no load.
1166052 WARNING - logical net 'data_input_c[6]' has no load.
1166052 WARNING - logical net 'data_input_c[7]' has no load.
1166052 WARNING - logical net 'data_input_c[8]' has no load.
1166052 WARNING - logical net 'data_input_c[9]' has no load.
1166052 WARNING - logical net 'data_input_c[10]' has no load.
1166052 WARNING - logical net 'data_input_c[11]' has no load.
1163101 WARNING - DRC complete with 15 warnings.
1100523 WARNING - C:/--------/ADC_Interface
51001030 WARNING - Using local reset signal 'rstn_c' to infer global GSR net.
Irgendeine Idee, warum es passiert?
Aufgrund des Fehlers und der Beschreibung „Data goes to DDR registers“ können die DELAYB-Module nur vor dem PIO-Register verwendet werden. Dies ist möglicherweise nicht in der Lage, die anderen Register anzusteuern.
Dieses Beispiel zeigt auch, dass das DELAYB-Treiber-IO-Register.
Bearbeitet:
Eine weitere Überprüfung im FPGA-Referenzleitfaden zeigt:
Der DELAYB-Block kann auch verwendet werden, um Nicht-DDR-Eingänge zu verzögern, die das Eingangs-PIO-Register verwenden.
Dies bedeutet, dass der DELAYB-Block für DDR- (wahrscheinlich die IDDR- und ODDR-Komponenten) und PIO-Register verwendet werden kann.
Jeder PIO enthält einen SysIO-Puffer und E/A-Logik (IOLOGIC). Die E/A-Logik umfasst Eingangs-, Ausgangs- und Tri-State-Register, die sowohl Anwendungen mit einfacher Datenrate (SDR) als auch Anwendungen mit doppelter Datenrate (DDR) zusammen mit der erforderlichen Takt- und Datenauswahllogik implementieren.
Siehe http://www.latticesemi.com/en/Support/AnswerDatabase/1/9/4/1946
Christian B.
Michael Astahov
Christian B.
Michael Astahov
Michael Astahov
Christian B.
Michael Astahov