Jump to content

    
Sign in to follow this  
zvs

ADC DDR и TimeQuest

Recommended Posts

1. Модуль align_pll в нормальном режиме без всяких сдвигов?

Да, проект с одним каналом и pll приаттачил.

2. Фронт входных частоты и первой посылки данных совпадает или изначально смещен и если смещен, то почему это не отображается в ограничениях и нет на временной диаграмме?

 

Изначально смещён. Я дубина, выложил не тот sdc... Поправил в том посте. Теперь понятно?

3. -clock_fall -это что за ограничение, забыл? :wacko:

Это говорит TQ, что input_delay применяется к заднему фронту клока.

deserializer_ddio_pll.zip

Share this post


Link to post
Share on other sites

Между прочим, пробовали собрать проект без привязки сигналов к пинам? Вдруг там какой-нибудь сигнал попадает на неподходящий пин.

Share this post


Link to post
Share on other sites
Между прочим, пробовали собрать проект без привязки сигналов к пинам?

Мы её (или она нас???) испробовали уже во всех позициях, поверьте...

 

Резюмирую: проект мы таки завели на 65 МГц, но не на ddio, из чего сделали вывод что благословенные ddio в Arria II GX не работают на частоте 65*12/2 =390МГц.

Аналогичная ситуация со стратиксами 3-4 и даже Arria II GZ на частоте 80*12/2 =480МГц DDR, согласно сведениям TQ.

А теперь для истории, и вообще, может кому-то окажется полезно, расскажу как завели.

Код для десериализатора переписали вот так:

module adc_deserializer(s_adc_clk, s_adc_frame, s_adc_data, adc_data, en_adc_data);

parameter    WIDTH_ADC_DATA = 12;//ширина шины данных АЦП

input    s_adc_clk;
input    s_adc_frame;
input    s_adc_data;
output    [WIDTH_ADC_DATA-1:0]adc_data;
output    en_adc_data;

reg n_in_rx, in_rx_p, in_rx_n;
reg [WIDTH_ADC_DATA/2-1:0]pos_shift_reg, odd_data;
reg [WIDTH_ADC_DATA/2-1:0]neg_shift_reg, evn_data;
reg en_adc_frame, en_odd_data, en_evn_data;

wire s_adc_clk;
reg en_adc_data;
wire [WIDTH_ADC_DATA-1:0]adc_data;

genvar i;
generate for(i=0; i<WIDTH_ADC_DATA/2; i=i+1) begin: assign_adc_data
        assign adc_data[2*i+1:2*i] = {odd_data[i], evn_data[i]};
    end
endgenerate

always @(posedge s_adc_clk) begin
    pos_shift_reg <= {pos_shift_reg, in_rx_p};
    neg_shift_reg <= {neg_shift_reg, in_rx_n};
    en_adc_frame <= s_adc_frame;
    en_odd_data <= en_adc_frame;
    en_evn_data <= en_odd_data;
        en_adc_data <= !en_odd_data;
    if(en_adc_frame && !en_odd_data)
        odd_data <= pos_shift_reg;
    if(en_odd_data && !en_evn_data)
        evn_data <= neg_shift_reg;
end//always

always @(posedge s_adc_clk) begin
    in_rx_p <= s_adc_data;
    in_rx_n <= n_in_rx;
end//always

always @(negedge s_adc_clk) begin
    n_in_rx <= s_adc_data;
end
//always
endmodule

 

То бишь сделали двухфронтовый защёлкиватель, но без ddio c реализацией на логике.

 

Кажный канальчик объединили в общий 8-канальный десериализатор:

module adc_deserializers(s_adc_clk, s_adc_frame, s_adc_data, adc_data, en_adc_data);

parameter NUM_CHANNEL = 8;//Количество каналов
parameter WIDTH_ADC_DATA = 12;//Ширина шины данных АЦП

input    s_adc_clk;
input    s_adc_frame;
input    [NUM_CHANNEL-1:0]s_adc_data;
output    [WIDTH_ADC_DATA*NUM_CHANNEL-1:0]adc_data;
output    [NUM_CHANNEL-1:0]en_adc_data;



adc_deserializer #(
        .WIDTH_ADC_DATA(WIDTH_ADC_DATA))
    adc_deserializer[NUM_CHANNEL-1:0](
        .s_adc_clk(s_adc_clk),
        .s_adc_frame(s_adc_frame),
        .s_adc_data(s_adc_data),
        .adc_data(adc_data),
        .en_adc_data(en_adc_data));

endmodule

 

TQ сказал

+------------------------------------+
; Fast 900mV 0C Model Setup Summary;
+------------+-------+---------------+
; Clock; Slack; End Point TNS;
+------------+-------+---------------+
; clk_480MHz; 0.125; 0.000;
+------------+-------+---------------+


+------------------------------------+
; Fast 900mV 0C Model Hold Summary;
+------------+-------+---------------+
; Clock; Slack; End Point TNS;
+------------+-------+---------------+
; clk_480MHz; 0.135; 0.000;
+------------+-------+---------------+

Далее воткнули этот кусочек десериалайзера в общий проект - полезли отрицательные слаки.

Из положения вышли, создав для десериалайзера каждого канала Design Partition, и воткнув их Post-fit в основной проект.

Запас по слакам стал меньше, но жить тем не менее можно.

 

Спасибо всем, кто пытался помочь!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this