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

limbast

Участник
  • Публикаций

    13
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Поправил немного. После добавления этих строк с Fast Output Register unconstrained в TimeQuest количество output не изменилось. Значит этого мало. На варнинги я бы может и забил, но проект работает на тактовой частоте 50МГц, а вот на частоте 100МГц АЦП уже чушь меряет. Частота SPI при этом 50МГц, хотя АЦП до 75МГц работает, и хотя осциллограф 160МГц, все равно на таких частотах уже наносекунды не выловить. Поэтому рассчитываю, что описав констрейны я увижу где косяк.
  2. Все делается в одном клоке 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. А вот про это поподробней можно? Где это делается? В Assignment Editor только вижу Fast Output (Enable) Register. Его включение вопрос не решило.
  3. Конечно. Но то ли АЦП не такие, то ли в поиске я полный профан Реализация интерфейса у меня не вызывает вопросов, вызывает вопросы описание констрейнов этого интерфейса. 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 Хотелось бы все сделать по уму.
  4. Здравствуйте. Делаю проект чтения данных с АЦП 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 и данных. Вот тут я не понимаю правильно ли я думаю. Если правильно, то создать виртуальный клок и описать задержки.
  5. Всё на Qsys не получится. Он просто не успеет. Период преобразования 2МГц, частота quadspi - 75МГц. Нужно формировать сигнал преобразования, затем CS и чтение. После этого данные (64 битные) суммируем, умножаем и снова суммируем. Кроме того nios должен будет заниматься и другими делами. Переход на ПЛИС был вынужденный, потому как другие МК с этой задачей не справились. Всё было сделано на DMA. Реализация чтения АЦП на ПЛИС понятна и прозрачна, все тайминги минимальны и понятно откуда берутся, а вот в МК, включая NIOS, задержки берутся неизвестно откуда и мы с этим ничего не сможем сделать. PS Я задумывался о контроллерах Avalon-MM, но мне показалось это избыточно громоздко ради двух значений, думал может есть какой то простой и изящный способ передать данные в Qsys.
  6. Приветствую всех. Имеется АЦП, с которого ПЛИС считывает, суммирует и умножает данные. После определенного числа выборок полученные данные нужно передать NIOS для дальнейших действий. Подумалось, что можно передать просто через порт NIOS-а, но он ограничен 32 битами, а нужно передать два значения в 40 и 56 бит. В принципе можно разбить на несколько портов разной разрядности, а в NIOS склеить. Далее подумал использовать Dual Port Memory. Но придется городить модуль для запихивания данных в эту память. Может есть модуль, который сам генерирует требуемые двухпортовой памяти сигналы, а на входе нужны только данные любой длины? И наконец, а можно ли сделать чтобы регистры данных железа (40 и 56 бит) отображались в адресное пространство NIOS, чтобы NIOS фактически мог в любое время взять и прочитать этот регистр, наподобие чтения той же Dual Port Memory.
  7. Цитата(andrew_b @ Sep 29 2017, 12:43) По остальному попробуйте начать с этого: http://caxapa.ru/thumbs/442268/TimeQuest_for_dummies.pdf Естественно это я читал. Собственно благодаря статье я и написал кое какие констрейны, но вопросы остались.
  8. Приветствую всех. Начал заниматься ПЛИС. Работаю с MAX10. Сделал проектик чтения АЦП по SPI. Период чтения 2МГц, частота SPI - 50МГц. При компиляции варнинги от TimeQuest. Начал разбираться. В основном модуле вызывается модуль PLL, генерирующий из входных 50МГц выходные 100МГц. Также имеются модули конфигурирования АЦП и чтения АЦП. TimeQuest выдает следующие варнинги: Node: adc_config:adc_conf|sck was determined to be a clock but was found without an associated clock assignment. Node: adc_read_quadSPI:adc_meas|sck was determined to be a clock but was found without an associated clock assignment. Node: adc_config:adc_conf|cur.cs_set was determined to be a clock but was found without an associated clock assignment. Register cnvst_signal:cnvst_create|enable_reg is being clocked by adc_config:adc_conf|cur.cs_set Node: adc_read_quadSPI:adc_meas|cur.000 was determined to be a clock but was found without an associated clock assignment. Register counter_sum[0] is being clocked by adc_read_quadSPI:adc_meas|cur.000 Deriving Clock Uncertainty. Please refer to report_sdc in TimeQuest to see clock uncertainties. PLL cross checking found inconsistent PLL clock settings: Node: generator|altpll_component|auto_generated|pll1|clk[0] was found missing 1 generated clock that corresponds to a base clock with a period of: 20.000 1) Вообще, мне не понятно почему клоки (что генерируемые PLL, что логикой) нужно описывать, когда они все генерируются логикой ПЛИС, собственно для этого TimeQuest и создан, он сам должен их просчитывать. Ну да ладно, принимаю как должное. 2) Можно ли комментировать строки в файле SDC? Как это делается? 3) Решил начать с клока PLL. Выходным клоком PLL у меня является цепь clk_100MHz. TimeQuest же ругается на generator|altpll_component|auto_generated|pll1|clk[0], а вот самой цепи clk_100MHz в Name Finder нет. Правильно ли я понимаю, что TimeQuest не понимает цепи проекта, а только регистры, пины микросхемы и порты модулей? Для определения клока PLL 100МГц сделал так (покопавшись в интернете) derive_clock_uncertainty create_clock -period 50MHz -name {clk_50MHz_in} [get_ports {clk_50MHz_in}] derive_pll_clocks -create_base_clocks set clk_100MHz generator|altpll_component|auto_generated|pll1|clk[0] set_clock_groups -exclusive -group [list $clk_100MHz clk_50MHz_in] Причем clk_100MHz это не цепь из моего проекта, а имя, которое я могу теперь использовать в TimeQuest. И такая же ситуация с любыми имена, которые я буду создавать в TCL скрипте. Верно? Команда set_clock_groups -exclusive -group [list $clk_100MHz clk_50MHz_in] говорит, что тактовые частоты асинхронны друг другу. TimeQuest будет считать сдвиги между частотами? 4) Далее имеются клоки adc_config:adc_conf|sck и adc_read_quadSPI:adc_meas|sck, получаемые делением на 2 частоты 100МГц. Делаем для каждого create_generated_clock, set_clock_groups -exclusive и именуем клоки как хотим? Все остальное TimeQuest посчитает и покажет? 5) Остаются клоки adc_config:adc_conf|cur.cs_set и adc_read_quadSPI:adc_meas|cur.000. Начнем с того, что регистров и цепей с таким названием в проекте нет, однако, первый это похоже сигнал CS конфигурирования АЦП. Он вырабатывается лишь один раз, это не клок, однако задержки его посмотреть надо. Второй, судя по логу, тактирует регистр суммы, которая обновляется также с частотой чтения АЦП 2МГц. Название какое то странное adc_read_quadSPI:adc_meas|cur.000. Откуда TimeQuest его взял? Раз он на него ругается, то его нужно по любому описывать и опять же давать любое название? Заранее спасибо за пояснения.
  9. Даташит у меня именно полный 635 страниц. Про то что у него порты РА и РВ я тоже читал. Вы правы, одни и те же UARTы можно назначать на разные выводы! Очень гибкая система! Но возник еще вопрос: Как я писал выше у меня внешний параллельный 16битный ЦАП с 16 битной шиной. Как я писал выше скорость обновления данных ЦАП 2МГц. По идее самое быстрое можно просто записать в порт слово и дернуть сигнал запись. Но вот порт РВ имеет разрядность 12 - отпадает для быстрого варианта. Порт РА вроде 32х пиновый, однако это не так! У него нет РА0, РА1 и РА2! Т.е. для записи в порт мне нужно сдвинуть слово! Так? Т.е. никак нельзя сделать быструю 16битную шину данных, а 8битная шина (без сдвига) можно сделать только на порту РВ. Так? Это же глупо со стороны разработчиков или я чего то не допонимаю?
  10. Здравствуйте. Начинаю работать с AVR32UC3B064 и возникли глупые вопросы. Прежде всего организую параллельный интерфейс 16битным ЦАП. Естественно хотелось бы как в обычной ATmega выставить данные в порт и дернуть строб. Вроде первым делом хочется подключить 16 линий порта с PA0 по PA15 к ЦАПу и просто выставлять данные в порт. Но тогда невозможно будет использовать альтернативные функции без перестройки портов а как раз альтернативные функции (UART в частности) должен всегда слушать линию. Можно перестраивать при необходимости с альтернативной функции на простой вывод но скорость выдачи данных предполагается 2МГц и соответственно не получится (я так думаю) и слушать УАРТом и выдавать данные. Можно УАРТовский пины не трогать, а использовать другие выводы, но тогда как выставлять данные в порт? Смещать нужные биты? Но тогда теряется скорость. И вообще, в даташите написано что портов ввода вывода 43 штуки (для используемого контроллера) а регистры управления 32битные. Где остальные пины и биты? Рою литературу и интернет и как то вообще не внятно написано про использование портов ввода вывода в отличие от например ATmega. Прошу помочь и направить в нужное русло.
  11. Цитата(Skywolf @ Feb 24 2009, 17:39) я видел в www.AVC.ru Tasker серии C205 и С206 Спасибо большое! Это то что нужно!
  12. Цитата(Tanya @ Feb 6 2009, 10:28) Правильно писать - cable... Тогда и ответы будут. Или по-русски... Ну зачем же так огульно критиковать. Я написал правильно! Cable по английски а по немецки как раз Kabel. Примите это в сведению. Наименования фирм я списывал непосредственно с измерительных проводов.
  13. Привет всем! Уже не знаю куда пойти и куда податься. Ситуация такая: Для созданного калибратора-компаратора универсального (3 блока) нужны кабеля для межблочного соединения и как входные/выходные кабеля. Для опытной партии из 5штук покупали в прошлом году через каталог провода измерительные 1,5мм2 в силиконовой изоляции за 1200р 25м. Очень гибкие не такие как наш провод НВ. Такие же как на всех мультиметрах (я думал этих проводов должно быть как грязи!). Сейчас эти провода стоят уже 1500р (это ж 60р за метр! грабеж!!!) - рубль то обесценивается а каталог зарубежный. Я весь интернет облазил но не нашел ничего подобного у наших поставщиков. В чипе и дипе даже нет такого! Я уже выбился из сил и решил написать сюда. Может кто подскажет где их взять в России и как они называются? PS искал также по названиям проводов с имеющихся мультиметров. В России такие яндекс с гуглом не нашли. Искал Siliconkabel и AWM.