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

АЦП-реализация на ПЛИС

И ещё вопрос. Нельзя ли обойтись без написания мастера SPI?

В данном случае мастером будет приёмник данных, который и будет формировать всю времянку для АЦП, и без него никак!

 

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


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

:)

 

Вы пишите модуль который что-то делает с железом вокруг.

Дальше хотите на симуляторе проверить как он работает.

Внимание вопрос, откуда симулятор знает состав вашего железа, как оно работает, что должно выдавать и так далее?

 

Естественно окружение вашего модуля тоже необходимо написать вам. Если ваш модуль как 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

 

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


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

На просторах интернета наткнулся на код написанный на VHDL.
Это не VHDL, это Verilog-AMS

 

Он заточен для конкретного случая и АЦП?
Это вообще модель "сферического АЦП в ваккуме"

 

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


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

Можно ли отцифровать данное входное напряжения без связи с FPGA?

Похоже имеется какое-то фундаментальное непонимание происходящего...

 

АЦП - это микросхема, которая в ходе своей работы превращает входное напряжение в код. Для того чтобы это произошло (при этом правильно) на подавляющее большинство АЦП надо подать специальные сигналы. У разных АЦП - разные, определяется разработчиком АЦП, стандарта нет. Код который получило АЦП оно хранит его внутри себя, и чтобы его забрать опять же надо подать серию сигналов, опять же определенного вида для разных АЦП разное.

 

Для формирования этих последовательностей у вас есть ПЛИС, а кто-то использует процессоры, кто-то делает свои микросхемы. Суть в том что последовательность сигналов надо сформировать, и она не общая для АЦП, она у каждой ацепешки своя.

 

Поэтому вы сначала пишете модуль (программу, описание, и т.п.) который формирует эти последовательности сигналов. Дальше можете пробовать запустить и как-то пытаться понять все получилось или нет, можно тыкать осциллографом, можно лог анализатором, можно привлечь экстрасенсов и жетаги. В случае ПЛИС обычно до проверки в железе пишут еще один тестовый модуль, который имитирует работу АЦП (что конкретная ацп отвечает на эти сигналы) и соединив с вашим первым модулем запускают в симуляторе, и там у вас все сигналы имеются в доступе и вы можете проверять как все работает.

 

 

Для популярных АЦП вы, возможно, найдете готовый модуль сбора данных и может повезет и он будет с тестовым окружением. Но дальше то вам надо будет воткнуть его в свой проект, как-то использовать. А поскольку это опять же зависит от того что вы хотите, не думаю что чужой модуль будет делать все как вам надо. Искать надо под конкретную модель АЦП, а лучше начать уже самому писать что надо.

 

 

 

 

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


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

Похоже имеется какое-то фундаментальное непонимание происходящего...

 

АЦП - это микросхема, которая в ходе своей работы превращает входное напряжение в код. Для того чтобы это произошло (при этом правильно) на подавляющее большинство АЦП надо подать специальные сигналы. У разных АЦП - разные, определяется разработчиком АЦП, стандарта нет. Код который получило АЦП оно хранит его внутри себя, и чтобы его забрать опять же надо подать серию сигналов, опять же определенного вида для разных АЦП разное.

 

Для формирования этих последовательностей у вас есть ПЛИС, а кто-то использует процессоры, кто-то делает свои микросхемы. Суть в том что последовательность сигналов надо сформировать, и она не общая для АЦП, она у каждой ацепешки своя.

 

Поэтому вы сначала пишете модуль (программу, описание, и т.п.) который формирует эти последовательности сигналов. Дальше можете пробовать запустить и как-то пытаться понять все получилось или нет, можно тыкать осциллографом, можно лог анализатором, можно привлечь экстрасенсов и жетаги. В случае ПЛИС обычно до проверки в железе пишут еще один тестовый модуль, который имитирует работу АЦП (что конкретная ацп отвечает на эти сигналы) и соединив с вашим первым модулем запускают в симуляторе, и там у вас все сигналы имеются в доступе и вы можете проверять как все работает.

 

 

Для популярных АЦП вы, возможно, найдете готовый модуль сбора данных и может повезет и он будет с тестовым окружением. Но дальше то вам надо будет воткнуть его в свой проект, как-то использовать. А поскольку это опять же зависит от того что вы хотите, не думаю что чужой модуль будет делать все как вам надо. Искать надо под конкретную модель АЦП, а лучше начать уже самому писать что надо.

 

Благодарю , за то ,что растолковали мне все по данной проблеме. Просто сидел и не понимал с одной стороны , а с другой вроде понятно было.

 

Чтобы самому написать мне кажется нужно обладать опытом работы.Буду надеяться , что моя ацепешка не такая древняя.

 

Нашел файл с расширением ibs , только вот не могу открыть ничем.Пишут , что расширение это вообще ошибочно.

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

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


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

Нашел файл с расширением ibs , только вот не могу открыть ничем.Пишут , что расширение это вообще ошибочно.

*.ibs это IBIS-модель микросхемы, для "моделирования прохождения сигналов по плате", оно Вам не надо. Всё что Вам нужно сделать - сформировать сигналы CNV, SCLK, принять данные с линии SDO (см. рисунки в доке на АЦП). Всё это будет делать Ваш SPI-мастер, на выходе блока шина 16-бит и сигнал VALID, по которому данные пакуете в буфер. Есть возможность вытащить выходную шину модуля в SignalTap и подружить его с Matlab, сможете сразу видеть сигнал с АЦП.

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


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

*.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 АЦП поэтому такой объем вышел.

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


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

Если АЦП работают параллельно, то писать результат надо в такое же количество сдвиговых регистров, как и АЦП.

Ваша реализация (не могу понять как 97 нацело относится к 6) возможна при каскадном соединении АЦП - когда данные из первого (дальнего от плис) АЦП проходят через все последующие.

Как у Вас на плате - я не знаю.

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


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

Если АЦП работают параллельно, то писать результат надо в такое же количество сдвиговых регистров, как и АЦП.

Ваша реализация (не могу понять как 97 нацело относится к 6) возможна при каскадном соединении АЦП - когда данные из первого (дальнего от плис) АЦП проходят через все последующие.

Как у Вас на плате - я не знаю.

 

У меня АЦП цепляет каждую последующую.Соответственно 16*6+1 = 97. Мне бы разобраться , каким образом можно все это добро принять при помощи sdo.А конкретно , упаковать в регистр.Вот в этом разобраться.Так как я написал нижнюю часть , не совсем корректно работает почему-то.

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


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

У меня АЦП цепляет каждую последующую.Соответственно 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

 

Говорится о совокупности.

 

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


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

Что я неправильно делаю?

Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов?

PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими.

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


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

Что тут вообще происходит? :biggrin:

 

Здесь же все есть, включая готовые дрова для работы с микрухой

 

http://www.analog.com/en/products/analog-t...roduct-overview

https://wiki.analog.com/resources/fpga/xili...terposer/ad7687 (Reference Design Files)

 

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


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

Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов?

PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими.

 

Я исправил позже.Просто, на момент написания не заметил, ибо дальше писать начал.

 

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


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

Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов?

PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими.

Добавлю...

Я бы тоже научился работать сначала с одним АЦП.

Потом сделал бы память на 16 бит и в темпе приема записывал бы в эту память. Принял 16 бит и в память. и проинкрементировал указатель адреса. Потом следующие 16 бит - и снова в память... У Ксайлинкса есть такая память 16х1, которую удобно собирать в блоки и есть SRL, которые можно использовать нак сдвиговый регистр на 16 бит... Без всяких 97 битных паровозов.

А потом сделал бы обработку на одном автомате, который перебирал бы 6 слов последовательно...

См. раздел "многопоточность" в "Кратком Курсе"...

Удачи!

 

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...