Попробуйте самостоятельно сделать на сдвиговом регистре. Может удастся обойти проблему...
Сам делал так:
CODE
module ADCDeser(ADCBitClk,
FR,
SerData, DeSerData, DeSerDataA);
input ADCBitClk;
input FR;
input SerData;
output [15:0] DeSerData;
output DeSerDataA;
//Т.к. данные от АЦП идут последовательно и по двум фронтам, разделяем данные по фронту и по спаду
wire SerDataP;
wire SerDataN;
//Защелкивание разделенных данных в регистры
reg SerDataPReg;
reg SerDataNReg;
//Сдвиговый регистр данных
reg [15:0] DeSerDataShReg;
//Формирование строба записи десериализованных данных в выходной регистр
reg FRReg;
reg DataADly;
reg DataA;
//Выходные десереализованные данные
reg [15:0] DeSerData;
reg DeSerDataA;
initial
begin
SerDataPReg <= 0;
SerDataNReg <= 0;
DeSerDataShReg <= 0;
FRReg <= 0;
DataADly <= 0;
DataA <= 0;
DeSerData <= 0;
DeSerDataA <= 0;
end
IDDR2 #(
.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
.INIT_Q0(1'b0), // Sets initial state of the Q0 output to 1'b0 or 1'b1
.INIT_Q1(1'b0), // Sets initial state of the Q1 output to 1'b0 or 1'b1
.SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset
) IDDR2_inst (
.Q0(SerDataP), // 1-bit output captured with C0 clock
.Q1(SerDataN), // 1-bit output captured with C1 clock
.C0(ADCBitClk), // 1-bit clock input
.C1(~ADCBitClk), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D(SerData), // 1-bit DDR data input
.R(1'b0), // 1-bit reset input
.S(1'b0) // 1-bit set input
);
always @(posedge ADCBitClk) SerDataPReg <= SerDataP;
always @(negedge ADCBitClk) SerDataNReg <= SerDataN;
always @(posedge ADCBitClk)
begin
FRReg <= FR;
DataA <= (FRReg ^ FR) && (FR);
DataADly <= DataA;
end
always @(posedge ADCBitClk)
begin
DeSerDataShReg <= (DataADly) ? {14'h0000, SerDataPReg, SerDataNReg} : {DeSerDataShReg[13:0], SerDataPReg, SerDataNReg};
end
always @(posedge ADCBitClk)
begin
DeSerData <= (DataADly) ? DeSerDataShReg : DeSerData;
DeSerDataA <= DataADly;
end
endmodule