|
Как правильно записать констрейны интерфейса АЦП с ПЛИС |
|
|
|
Jul 6 2018, 10:56
|
Группа: Участник
Сообщений: 13
Регистрация: 28-01-05
Пользователь №: 2 252

|
Здравствуйте. Делаю проект чтения данных с АЦП 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 - Jul 6 2018, 10:57
|
|
|
|
|
 |
Ответов
|
Jul 6 2018, 11:01
|
Группа: Участник
Сообщений: 13
Регистрация: 28-01-05
Пользователь №: 2 252

|
Конечно. Но то ли АЦП не такие, то ли в поиске я полный профан Реализация интерфейса у меня не вызывает вопросов, вызывает вопросы описание констрейнов этого интерфейса. 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 - Jul 6 2018, 11:13
|
|
|
|
|
Jul 9 2018, 06:17
|
Группа: Участник
Сообщений: 13
Регистрация: 28-01-05
Пользователь №: 2 252

|
Цитата(andrew_b @ Jul 6 2018, 14:46)  Желание разделить конфигурацию и чтение данных понятно, но оно выливается в мультиплексирование сигналов и пляску с констрейнами. Все делается в одном клоке 100МГц. CODE 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. Цитата(andrew_b @ Jul 6 2018, 14:46)  Сделайте так, чтобы были задействованы триггеры в IOB для всех выходных сигналов. Тогда их констрейнить не придётся. А вот про это поподробней можно? Где это делается? В Assignment Editor только вижу Fast Output (Enable) Register. Его включение вопрос не решило.
Сообщение отредактировал limbast - Jul 9 2018, 06:54
|
|
|
|
|
Jul 9 2018, 06:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(limbast @ Jul 9 2018, 09:17)  Все делается в одном клоке 100МГц. Вы экономите на пробелах? Это читать больно. К тому же кщё и Верилог (но это личное). Цитата А вот про это поподробней можно? Где это делается? В Assignment Editor только вижу Fast Output (Enable) Register. Да, это оно. Цитата Его включение вопрос не решило. Смотря какой вопрос. Чтобы этот триггер был задействован, надо выполнить определённые условия. У Альтеры были рекомендации, как писать код для этого. Если вы этот триггер таки задействовали, то там в принципе нечего констрейнить. Вам мозолят глаза варниги? Забейте. Триггер вы всё равно никуда не сдвинете.
|
|
|
|
|
Jul 9 2018, 07:11
|
Группа: Участник
Сообщений: 13
Регистрация: 28-01-05
Пользователь №: 2 252

|
Цитата(andrew_b @ Jul 9 2018, 09:40)  Вы экономите на пробелах? Это читать больно. Поправил немного. Цитата(andrew_b @ Jul 9 2018, 09:40)  Если вы этот триггер таки задействовали, то там в принципе нечего констрейнить. Вам мозолят глаза варниги? Забейте. Триггер вы всё равно никуда не сдвинете. После добавления этих строк с Fast Output Register unconstrained в TimeQuest количество output не изменилось. Значит этого мало. На варнинги я бы может и забил, но проект работает на тактовой частоте 50МГц, а вот на частоте 100МГц АЦП уже чушь меряет. Частота SPI при этом 50МГц, хотя АЦП до 75МГц работает, и хотя осциллограф 160МГц, все равно на таких частотах уже наносекунды не выловить. Поэтому рассчитываю, что описав констрейны я увижу где косяк.
Сообщение отредактировал limbast - Jul 9 2018, 07:11
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|