Перейти к содержанию

Как правильно записать констрейны интерфейса АЦП с ПЛИС

Здравствуйте.

Делаю проект чтения данных с АЦП ADS9110 плиской MAX10.

Входные сигналы АЦП: CNVST, CS, SCLK, SDO и SDI.

Один модуль сначала конфигурирует АЦП, формируя сигналы CS, SCLK и SDI (выходной сигнал для ПЛИС), после этого начинает работать постоянно модуль чтения данных, формируя CNVST (2МГц), CS (2Мгц), SCLK (50МГц) и считывая данные по линиям SDO. Сигналы CS и SCLK объединяются по И и выдаются на пин mosi_ADS9110.

Как теперь это всё хозяйство описать констрейнами?

Т.к. сигнал SCLK формируется из основного клока ПЛИС, то его описание не вызывает вопросов. Так же нет вопросов при описании выходного сигнала SDI для АЦП (mosi_ADS9110), задержки указаны в datasheet.

tsu_CKDI - Setup time: SDI data valid to the SCLK capture edge - 1.2ns

tht_CKDI - Hold time: SCLK capture edge to (previous) data valid on SDI - 0.65ns

 

create_clock -period 20.000 -name {clk_50MHz_in} [get_ports {clk_50MHz_in}]

create_generated_clock -source {generator|altpll_component|auto_generated|pll1|inclk[0]} -multiply_by 2 -duty_cycle 50.00 -name CLK_100MHz {generator|altpll_component|auto_generated|pll1|clk[0]}

derive_clock_uncertainty

create_generated_clock -source {generator|altpll_component|auto_generated|pll1|clk[0]} -divide_by 2 -name ADC_CONF_CLK {adc_config:adc_conf|sck} #клок модуля конфигурирования

create_generated_clock -source {generator|altpll_component|auto_generated|pll1|clk[0]} -divide_by 2 -name ADC_MEAS_CLK {adc_read_quadSPI:adc_meas|sck} #клок модуля чтения

set_output_delay -clock [get_clocks {adc_config:adc_conf|sck}] -max 1.2 [get_ports {mosi_ADS9110}]

set_output_delay -clock [get_clocks {adc_config:adc_conf|sck}] -min -0.65 [get_ports {mosi_ADS9110}]

 

Теперь нужно как то описать минимальные задержки от спада CS до первого фронта SCLK и данных, и так же для фронта CS.

Т.е. в этом случае, в моем понимании, CS является клоком для сигнала SCLK и данных. Вот тут я не понимаю правильно ли я думаю. Если правильно, то создать виртуальный клок и описать задержки.

Изменено пользователем limbast

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно. Но то ли АЦП не такие, то ли в поиске я полный профан

Реализация интерфейса у меня не вызывает вопросов, вызывает вопросы описание констрейнов этого интерфейса. TimeQuest сигнализирует о unconstrained входах, выходах и путях:

Illegal Clocks - 0

Unconstrained Clocks - 0

Unconstrained Input Ports - 1

Unconstrained Input Port Paths - 1

Unconstrained Output Ports - 7

Unconstrained Output Port Paths - 17

 

Хотелось бы все сделать по уму.

Изменено пользователем limbast

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Хотелось бы все сделать по уму.
Жедание разделить конфигурацию и чтение данных понятно, но оно выливается в мультиплексирование сигналов и пляску с констейнами.

Если всё делается на одном клоке, то проблема непонятна. Сделайте так, чтобы были задействованы триггеры в IOB для всех выходных сигналов. Тогда их констрейнить не придётся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Желание разделить конфигурацию и чтение данных понятно, но оно выливается в мультиплексирование сигналов и пляску с констрейнами.

Все делается в одном клоке 100МГц.

module adc_read_quadSPI(clk,start,rstb,done,sck,din,cs,dout);

input          clk;    //входные тактовые импульсы
input          start; //запуск передачи
input          rstb;  //отмена передачи
output        done;//флаг завершения приема
output        sck;  //выходные тактовые импульсы,0-исхдное состояние,переход 0->1 запись данных в АЦП
input[3:0]   din;  //входные данные
output        cs;   //1-исходное состояние,0-активный уровень
output[17:0] dout; //выходные данные

reg[19:0]  rreg;     //20 битный регистр данных
reg[2:0]    cur,nxt; //регистры состояний
reg[2:0]    nbit;
reg           clr,shift;
reg    cs,done,sck;
wire[3:0]  din;

wire signed[17:0]  dout;

assign dout[17:0]=$signed(rreg[19:2]);

parameter	idle=3'b000,send=3'b001,finish=3'b010,done_state=3'b011,cs_set=3'b100;

//STATE MACHINE:
//state transistion
always@(negedge clk or posedge rstb)
begin
 if(rstb==1'b1)
   cur=finish;
 else
   cur=nxt;
end

//FSM I/O
//always @(start or cur or nbit)
always @(*)
begin
 nxt=cur;
 clr=0; 
 shift=0;
 done=0;
 cs=1;
 case(cur)
 idle:
 begin
   if(start==1'b1)
   begin
     cs=0;
     shift=1;
     nxt=send;
   end
 end //idle
 send:
 begin
   cs=0;
   if(nbit!=3'd5)
     shift=1; 
   else
     nxt=done_state;
   end//send
 done_state:
 begin
   clr=1;
   cs=0;
   nxt=cs_set;
 end
 cs_set:
 begin
   nxt=finish;
   done=1;
   clr=1;
 end
 finish:
 begin
   clr=1;
   nxt=idle;
 end//finish
 default
   nxt=finish;
 endcase
end//always

//CLOCK GENERATOR BLOCK:
always@(negedge clk or posedge clr)
begin
 if(clr==1'b1)
   sck=0;
 else
 begin
   if(shift==1'b1)
     sck=~sck;
 end //rst
end

always@(posedge sck or posedge clr)
begin
 if(clr==1'b1) 
   nbit<=0;
 else
 begin
   nbit<=nbit+1'd1;
   rreg<={rreg[15:0],din[3],din[2],din[1],din[0]};
 end
end
endmodule

Даже если я оставляю один любой блок, убрав мультиплексирование, TimeQuest ругается на те же самые неконстрейненные выводы. Дело не в мультиплексировании, нужно описать констрейны выводов.

Как описать задержки от спада CS до первого фронта SCLK и MOSI, и так же от спада последнего импульса SCLK и удержание данный MOSI до фронта CS.

Сделайте так, чтобы были задействованы триггеры в IOB для всех выходных сигналов. Тогда их констрейнить не придётся.

А вот про это поподробней можно? Где это делается? В Assignment Editor только вижу Fast Output (Enable) Register. Его включение вопрос не решило.

Изменено пользователем limbast

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Все делается в одном клоке 100МГц.
Вы экономите на пробелах? Это читать больно. К тому же кщё и Верилог (но это личное).

А вот про это поподробней можно? Где это делается? В Assignment Editor только вижу Fast Output (Enable) Register.
Да, это оно.

Его включение вопрос не решило.
Смотря какой вопрос. Чтобы этот триггер был задействован, надо выполнить определённые условия. У Альтеры были рекомендации, как писать код для этого.

Если вы этот триггер таки задействовали, то там в принципе нечего констрейнить. Вам мозолят глаза варниги? Забейте. Триггер вы всё равно никуда не сдвинете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вы экономите на пробелах? Это читать больно.

Поправил немного.

 

Если вы этот триггер таки задействовали, то там в принципе нечего констрейнить. Вам мозолят глаза варниги? Забейте. Триггер вы всё равно никуда не сдвинете.

После добавления этих строк с Fast Output Register unconstrained в TimeQuest количество output не изменилось. Значит этого мало.

На варнинги я бы может и забил, но проект работает на тактовой частоте 50МГц, а вот на частоте 100МГц АЦП уже чушь меряет. Частота SPI при этом 50МГц, хотя АЦП до 75МГц работает, и хотя осциллограф 160МГц, все равно на таких частотах уже наносекунды не выловить. Поэтому рассчитываю, что описав констрейны я увижу где косяк.

Изменено пользователем limbast

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация