limbast 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Здравствуйте. Делаю проект чтения данных с АЦП 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 и данных. Вот тут я не понимаю правильно ли я думаю. Если правильно, то создать виртуальный клок и описать задержки. Изменено 6 июля, 2018 пользователем limbast Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба deleted Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
limbast 0 6 июля, 2018 Опубликовано 6 июля, 2018 (изменено) · Жалоба Конечно. Но то ли АЦП не такие, то ли в поиске я полный профан Реализация интерфейса у меня не вызывает вопросов, вызывает вопросы описание констрейнов этого интерфейса. 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 Хотелось бы все сделать по уму. Изменено 6 июля, 2018 пользователем limbast Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Хотелось бы все сделать по уму.Жедание разделить конфигурацию и чтение данных понятно, но оно выливается в мультиплексирование сигналов и пляску с констейнами. Если всё делается на одном клоке, то проблема непонятна. Сделайте так, чтобы были задействованы триггеры в IOB для всех выходных сигналов. Тогда их констрейнить не придётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
limbast 0 9 июля, 2018 Опубликовано 9 июля, 2018 (изменено) · Жалоба Желание разделить конфигурацию и чтение данных понятно, но оно выливается в мультиплексирование сигналов и пляску с констрейнами. Все делается в одном клоке 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. Его включение вопрос не решило. Изменено 9 июля, 2018 пользователем limbast Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Все делается в одном клоке 100МГц.Вы экономите на пробелах? Это читать больно. К тому же кщё и Верилог (но это личное). А вот про это поподробней можно? Где это делается? В Assignment Editor только вижу Fast Output (Enable) Register.Да, это оно. Его включение вопрос не решило.Смотря какой вопрос. Чтобы этот триггер был задействован, надо выполнить определённые условия. У Альтеры были рекомендации, как писать код для этого. Если вы этот триггер таки задействовали, то там в принципе нечего констрейнить. Вам мозолят глаза варниги? Забейте. Триггер вы всё равно никуда не сдвинете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
limbast 0 9 июля, 2018 Опубликовано 9 июля, 2018 (изменено) · Жалоба Вы экономите на пробелах? Это читать больно. Поправил немного. Если вы этот триггер таки задействовали, то там в принципе нечего констрейнить. Вам мозолят глаза варниги? Забейте. Триггер вы всё равно никуда не сдвинете. После добавления этих строк с Fast Output Register unconstrained в TimeQuest количество output не изменилось. Значит этого мало. На варнинги я бы может и забил, но проект работает на тактовой частоте 50МГц, а вот на частоте 100МГц АЦП уже чушь меряет. Частота SPI при этом 50МГц, хотя АЦП до 75МГц работает, и хотя осциллограф 160МГц, все равно на таких частотах уже наносекунды не выловить. Поэтому рассчитываю, что описав констрейны я увижу где косяк. Изменено 9 июля, 2018 пользователем limbast Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться