doom13 0 2 июня, 2017 Опубликовано 2 июня, 2017 · Жалоба И ещё вопрос. Нельзя ли обойтись без написания мастера SPI? В данном случае мастером будет приёмник данных, который и будет формировать всю времянку для АЦП, и без него никак! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ensider 0 6 июня, 2017 Опубликовано 6 июня, 2017 · Жалоба :) Вы пишите модуль который что-то делает с железом вокруг. Дальше хотите на симуляторе проверить как он работает. Внимание вопрос, откуда симулятор знает состав вашего железа, как оно работает, что должно выдавать и так далее? Естественно окружение вашего модуля тоже необходимо написать вам. Если ваш модуль как SPI slave принимает данные, то как вы без SPI мастера ему их в симуляции подадите? В приборе это будет делать чужая микросхема с которой вы и собираетесь работать, а симуляция то как узнает что вы делает? Так что мастера можно не писать только в случае если вы найдете чужой написанный. Другое дело что для симуляции можно использовать не синтезируемую часть подмножества языка, и поэтому модели для симуляции пишутся гораздо проще и быстрее. А кроме модели вам надо еще написать тестовый сценарий, это то что ваша модель делает по времени, это тоже пишут на языке, на той же не синтезируемой части. Я так понимаю , что чужой написанный мне найти не получится и его писать обязательно. Только одного не пойму на АЦП , которые встроены в мою плату идет напряжение с трансформаторов. Вопрос в том: "Можно ли отцифровать данное входное напряжения без связи с FPGA?". Просто не совсем представляю эту связь. Документацию прочел ознакомился да и схемы посмотрел , но все равно не понимаю, как это все осуществляется. Вопрос глупый , но из-за него у меня дело встало. В данном случае мастером будет приёмник данных, который и будет формировать всю времянку для АЦП, и без него никак! А мастер он уникален для каждой платы? На просторах интернета наткнулся на код написанный на VHDL. Он заточен для конкретного случая и АЦП? // N-bit Analog to Digital Converter `include "disciplines.vams" module adc (out, in, clk); parameter integer bits = 8 from [1:24];// resolution (bits) parameter real fullscale = 1.0; // input range is from 0 to fullscale (V) parameter real td = 0; // delay from clock edge to output (s) parameter real tt = 0; // transition time of output (s) parameter real vdd = 5.0; // voltage level of logic 1 (V) parameter real thresh = vdd/2; // logic threshold level (V) parameter integer dir = 1 from [-1:1] exclude 0; // 1 for rising edges, -1 for falling input in, clk; output [0:bits-1] out; voltage in, clk; voltage [0:bits-1] out; real sample, midpoint; integer result[0:bits-1]; genvar i; analog begin @(cross(V(clk)-thresh, +1) or initial_step) begin sample = V(in); midpoint = fullscale/2.0; for (i = bits - 1; i >= 0; i = i - 1 ) begin if (sample > midpoint) begin result[i] = vdd; sample = sample - midpoint; end else begin result[i] = 0.0; end sample = 2.0*sample; end end for (i = 0; i < bits; i = i + 1) begin V(out[i]) <+ transition(result[i], td, tt); end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 6 июня, 2017 Опубликовано 6 июня, 2017 · Жалоба На просторах интернета наткнулся на код написанный на VHDL.Это не VHDL, это Verilog-AMS Он заточен для конкретного случая и АЦП?Это вообще модель "сферического АЦП в ваккуме" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 6 июня, 2017 Опубликовано 6 июня, 2017 · Жалоба Можно ли отцифровать данное входное напряжения без связи с FPGA? Похоже имеется какое-то фундаментальное непонимание происходящего... АЦП - это микросхема, которая в ходе своей работы превращает входное напряжение в код. Для того чтобы это произошло (при этом правильно) на подавляющее большинство АЦП надо подать специальные сигналы. У разных АЦП - разные, определяется разработчиком АЦП, стандарта нет. Код который получило АЦП оно хранит его внутри себя, и чтобы его забрать опять же надо подать серию сигналов, опять же определенного вида для разных АЦП разное. Для формирования этих последовательностей у вас есть ПЛИС, а кто-то использует процессоры, кто-то делает свои микросхемы. Суть в том что последовательность сигналов надо сформировать, и она не общая для АЦП, она у каждой ацепешки своя. Поэтому вы сначала пишете модуль (программу, описание, и т.п.) который формирует эти последовательности сигналов. Дальше можете пробовать запустить и как-то пытаться понять все получилось или нет, можно тыкать осциллографом, можно лог анализатором, можно привлечь экстрасенсов и жетаги. В случае ПЛИС обычно до проверки в железе пишут еще один тестовый модуль, который имитирует работу АЦП (что конкретная ацп отвечает на эти сигналы) и соединив с вашим первым модулем запускают в симуляторе, и там у вас все сигналы имеются в доступе и вы можете проверять как все работает. Для популярных АЦП вы, возможно, найдете готовый модуль сбора данных и может повезет и он будет с тестовым окружением. Но дальше то вам надо будет воткнуть его в свой проект, как-то использовать. А поскольку это опять же зависит от того что вы хотите, не думаю что чужой модуль будет делать все как вам надо. Искать надо под конкретную модель АЦП, а лучше начать уже самому писать что надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ensider 0 7 июня, 2017 Опубликовано 7 июня, 2017 (изменено) · Жалоба Похоже имеется какое-то фундаментальное непонимание происходящего... АЦП - это микросхема, которая в ходе своей работы превращает входное напряжение в код. Для того чтобы это произошло (при этом правильно) на подавляющее большинство АЦП надо подать специальные сигналы. У разных АЦП - разные, определяется разработчиком АЦП, стандарта нет. Код который получило АЦП оно хранит его внутри себя, и чтобы его забрать опять же надо подать серию сигналов, опять же определенного вида для разных АЦП разное. Для формирования этих последовательностей у вас есть ПЛИС, а кто-то использует процессоры, кто-то делает свои микросхемы. Суть в том что последовательность сигналов надо сформировать, и она не общая для АЦП, она у каждой ацепешки своя. Поэтому вы сначала пишете модуль (программу, описание, и т.п.) который формирует эти последовательности сигналов. Дальше можете пробовать запустить и как-то пытаться понять все получилось или нет, можно тыкать осциллографом, можно лог анализатором, можно привлечь экстрасенсов и жетаги. В случае ПЛИС обычно до проверки в железе пишут еще один тестовый модуль, который имитирует работу АЦП (что конкретная ацп отвечает на эти сигналы) и соединив с вашим первым модулем запускают в симуляторе, и там у вас все сигналы имеются в доступе и вы можете проверять как все работает. Для популярных АЦП вы, возможно, найдете готовый модуль сбора данных и может повезет и он будет с тестовым окружением. Но дальше то вам надо будет воткнуть его в свой проект, как-то использовать. А поскольку это опять же зависит от того что вы хотите, не думаю что чужой модуль будет делать все как вам надо. Искать надо под конкретную модель АЦП, а лучше начать уже самому писать что надо. Благодарю , за то ,что растолковали мне все по данной проблеме. Просто сидел и не понимал с одной стороны , а с другой вроде понятно было. Чтобы самому написать мне кажется нужно обладать опытом работы.Буду надеяться , что моя ацепешка не такая древняя. Нашел файл с расширением ibs , только вот не могу открыть ничем.Пишут , что расширение это вообще ошибочно. Изменено 7 июня, 2017 пользователем Ensider Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 7 июня, 2017 Опубликовано 7 июня, 2017 · Жалоба Нашел файл с расширением ibs , только вот не могу открыть ничем.Пишут , что расширение это вообще ошибочно. *.ibs это IBIS-модель микросхемы, для "моделирования прохождения сигналов по плате", оно Вам не надо. Всё что Вам нужно сделать - сформировать сигналы CNV, SCLK, принять данные с линии SDO (см. рисунки в доке на АЦП). Всё это будет делать Ваш SPI-мастер, на выходе блока шина 16-бит и сигнал VALID, по которому данные пакуете в буфер. Есть возможность вытащить выходную шину модуля в SignalTap и подружить его с Matlab, сможете сразу видеть сигнал с АЦП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ensider 0 10 июня, 2017 Опубликовано 10 июня, 2017 · Жалоба *.ibs это IBIS-модель микросхемы, для "моделирования прохождения сигналов по плате", оно Вам не надо. Всё что Вам нужно сделать - сформировать сигналы CNV, SCLK, принять данные с линии SDO (см. рисунки в доке на АЦП). Всё это будет делать Ваш SPI-мастер, на выходе блока шина 16-бит и сигнал VALID, по которому данные пакуете в буфер. Есть возможность вытащить выходную шину модуля в SignalTap и подружить его с Matlab, сможете сразу видеть сигнал с АЦП. Прописал клоки и сигнал CNV сформировал. Проблема у меня с сохранением в регистры. Сомневаюсь на счет последней части моего проекта. //Проект АЦП связь с FPGA localparam int unsigned DATA_TEMP = 16; //Разрядность АЦП localparam int unsigned SYS_CLOCK_FREQ = 10000000; // Частота ADC_CLK в герцах. module NOKIA (input serial_data , SPICMOSI , SPICCLK , SPICFLG, output ADC_CNV , ADC_CLK , SPICMISO); logic timer_2Hz; logic timer_1Hz; reg [DATA_TEMP-1 :16] COUNT; // Разрядность даннных АЦП parameter VDD = 5; //напряжение логики parameter TDSDS = 5; //время задержки от фронта тактовой частоты parameter real ACQT = 1.8; //время получения данных parameter real CVDD = 2.5; //уровень логического порога parameter ENT = 14; //Задержка от фронта тактовой частоты до выхода parameter SSDR = 15; //Для нарастающего фронта parameter SSDF = 3; //Для спадающего фронта parameter real FSS = 1.8; // Диапозон ввода от нуля до натуральной величины reg RDY; reg CNV; reg serial_data [15:0]; reg COUNT [6:0]; reg SERIAL_BIT; always @(posedge ADC_CLK) begin if (COUNT == (SYS_CLOCK_FREQ/2 - 1)) begin timer_2Hz <= 1'b1; // Этот сигнал будет выставляться в лог.1 на 1 такт с периодом 1/(SYS_CLOCK_FREQ/2), т.е., COUNT <= '0; // с частотой 2 Гц. Счетчик cnt при этом сбрасывается. end else begin COUNT <= COUNT+1; // В иных случаях счет разрешен, timer_2Hz <= 1'b0; // а сигнал таймера д.б. занулен. end end // Утверждают сигнал CNV always @ (negedge ADC_CLK) begin if ((COUNT == 7'd97) || (COUNT == 7'd98)) CNV = 1'b0; else CNV = 1'b1; end // Чтение последовательных данных в 97-битовый регистр. После этого преобразовать его в параллельный, если счетчик равен 97 (конец потока данных) always @ (negedge ADC_CLK) begin DATA_TEMP[CNV] = serial_data; if (COUNT == 7'd97) serial_data <= SERIAL_BIT; end endmodule Верно ли я присвоение прописал?У меня на плате просто 6 АЦП поэтому такой объем вышел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 10 июня, 2017 Опубликовано 10 июня, 2017 · Жалоба Если АЦП работают параллельно, то писать результат надо в такое же количество сдвиговых регистров, как и АЦП. Ваша реализация (не могу понять как 97 нацело относится к 6) возможна при каскадном соединении АЦП - когда данные из первого (дальнего от плис) АЦП проходят через все последующие. Как у Вас на плате - я не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ensider 0 10 июня, 2017 Опубликовано 10 июня, 2017 · Жалоба Если АЦП работают параллельно, то писать результат надо в такое же количество сдвиговых регистров, как и АЦП. Ваша реализация (не могу понять как 97 нацело относится к 6) возможна при каскадном соединении АЦП - когда данные из первого (дальнего от плис) АЦП проходят через все последующие. Как у Вас на плате - я не знаю. У меня АЦП цепляет каждую последующую.Соответственно 16*6+1 = 97. Мне бы разобраться , каким образом можно все это добро принять при помощи sdo.А конкретно , упаковать в регистр.Вот в этом разобраться.Так как я написал нижнюю часть , не совсем корректно работает почему-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ensider 0 11 июня, 2017 Опубликовано 11 июня, 2017 · Жалоба У меня АЦП цепляет каждую последующую.Соответственно 16*6+1 = 97. Мне бы разобраться , каким образом можно все это добро принять при помощи sdo.А конкретно , упаковать в регистр.Вот в этом разобраться.Так как я написал нижнюю часть , не совсем корректно работает почему-то. Что я неправильно делаю?Выдает ошибку после записи части приема сигнала. always @ (negedge ADC_CLK) begin DATA_TEMP <= {DATA_TEMP[95:0],serial_data}; if (COUNT == 97) TEMP <= DATA_TEMP; end Ошибка: Error (10687): SystemVerilog error at NOKIA.sv(59): indexing CNV returns an aggregate value Говорится о совокупности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 11 июня, 2017 Опубликовано 11 июня, 2017 · Жалоба Что я неправильно делаю? Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов? PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 11 июня, 2017 Опубликовано 11 июня, 2017 · Жалоба Что тут вообще происходит? Здесь же все есть, включая готовые дрова для работы с микрухой http://www.analog.com/en/products/analog-t...roduct-overview https://wiki.analog.com/resources/fpga/xili...terposer/ad7687 (Reference Design Files) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ensider 0 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов? PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими. Я исправил позже.Просто, на момент написания не заметил, ибо дальше писать начал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов? PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими. Добавлю... Я бы тоже научился работать сначала с одним АЦП. Потом сделал бы память на 16 бит и в темпе приема записывал бы в эту память. Принял 16 бит и в память. и проинкрементировал указатель адреса. Потом следующие 16 бит - и снова в память... У Ксайлинкса есть такая память 16х1, которую удобно собирать в блоки и есть SRL, которые можно использовать нак сдвиговый регистр на 16 бит... Без всяких 97 битных паровозов. А потом сделал бы обработку на одном автомате, который перебирал бы 6 слов последовательно... См. раздел "многопоточность" в "Кратком Курсе"... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться