реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> АЦП-реализация на ПЛИС, Связь с АЦП [AD7687]
doom13
сообщение Jun 2 2017, 11:46
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 325
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Ensider @ Jun 2 2017, 10:25) *
И ещё вопрос. Нельзя ли обойтись без написания мастера SPI?

В данном случае мастером будет приёмник данных, который и будет формировать всю времянку для АЦП, и без него никак!
Go to the top of the page
 
+Quote Post
Ensider
сообщение Jun 6 2017, 08:58
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(Golikov A. @ Jun 2 2017, 10:14) *
sm.gif

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

Естественно окружение вашего модуля тоже необходимо написать вам. Если ваш модуль как SPI slave принимает данные, то как вы без SPI мастера ему их в симуляции подадите? В приборе это будет делать чужая микросхема с которой вы и собираетесь работать, а симуляция то как узнает что вы делает?

Так что мастера можно не писать только в случае если вы найдете чужой написанный. Другое дело что для симуляции можно использовать не синтезируемую часть подмножества языка, и поэтому модели для симуляции пишутся гораздо проще и быстрее. А кроме модели вам надо еще написать тестовый сценарий, это то что ваша модель делает по времени, это тоже пишут на языке, на той же не синтезируемой части.


Я так понимаю , что чужой написанный мне найти не получится и его писать обязательно. Только одного не пойму на АЦП , которые встроены в мою плату идет напряжение с трансформаторов. Вопрос в том: "Можно ли отцифровать данное входное напряжения без связи с FPGA?". Просто не совсем представляю эту связь. Документацию прочел ознакомился да и схемы посмотрел , но все равно не понимаю, как это все осуществляется. Вопрос глупый , но из-за него у меня дело встало.

Цитата(doom13 @ Jun 2 2017, 11:46) *
В данном случае мастером будет приёмник данных, который и будет формировать всю времянку для АЦП, и без него никак!


А мастер он уникален для каждой платы? На просторах интернета наткнулся на код написанный на 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

Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 6 2017, 09:55
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 035
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Цитата
Он заточен для конкретного случая и АЦП?
Это вообще модель "сферического АЦП в ваккуме"
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 6 2017, 11:54
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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

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

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


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



Go to the top of the page
 
+Quote Post
Ensider
сообщение Jun 7 2017, 09:37
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(Golikov A. @ Jun 6 2017, 11:54) *
Похоже имеется какое-то фундаментальное непонимание происходящего...

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

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

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


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


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

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

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

Сообщение отредактировал Ensider - Jun 7 2017, 10:05
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 7 2017, 10:38
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 325
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Ensider @ Jun 7 2017, 12:37) *
Нашел файл с расширением ibs , только вот не могу открыть ничем.Пишут , что расширение это вообще ошибочно.

*.ibs это IBIS-модель микросхемы, для "моделирования прохождения сигналов по плате", оно Вам не надо. Всё что Вам нужно сделать - сформировать сигналы CNV, SCLK, принять данные с линии SDO (см. рисунки в доке на АЦП). Всё это будет делать Ваш SPI-мастер, на выходе блока шина 16-бит и сигнал VALID, по которому данные пакуете в буфер. Есть возможность вытащить выходную шину модуля в SignalTap и подружить его с Matlab, сможете сразу видеть сигнал с АЦП.
Go to the top of the page
 
+Quote Post
Ensider
сообщение Jun 10 2017, 14:58
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



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


Прописал клоки и сигнал CNV сформировал. Проблема у меня с сохранением в регистры. Сомневаюсь на счет последней части моего проекта.
Код
[/code]


[code]                 //Проект АЦП связь с 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 АЦП поэтому такой объем вышел.
Go to the top of the page
 
+Quote Post
Александр77
сообщение Jun 10 2017, 18:38
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 564
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Если АЦП работают параллельно, то писать результат надо в такое же количество сдвиговых регистров, как и АЦП.
Ваша реализация (не могу понять как 97 нацело относится к 6) возможна при каскадном соединении АЦП - когда данные из первого (дальнего от плис) АЦП проходят через все последующие.
Как у Вас на плате - я не знаю.
Go to the top of the page
 
+Quote Post
Ensider
сообщение Jun 10 2017, 22:22
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(Александр77 @ Jun 10 2017, 19:38) *
Если АЦП работают параллельно, то писать результат надо в такое же количество сдвиговых регистров, как и АЦП.
Ваша реализация (не могу понять как 97 нацело относится к 6) возможна при каскадном соединении АЦП - когда данные из первого (дальнего от плис) АЦП проходят через все последующие.
Как у Вас на плате - я не знаю.


У меня АЦП цепляет каждую последующую.Соответственно 16*6+1 = 97. Мне бы разобраться , каким образом можно все это добро принять при помощи sdo.А конкретно , упаковать в регистр.Вот в этом разобраться.Так как я написал нижнюю часть , не совсем корректно работает почему-то.
Go to the top of the page
 
+Quote Post
Ensider
сообщение Jun 11 2017, 14:47
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(Ensider @ Jun 10 2017, 22:22) *
У меня АЦП цепляет каждую последующую.Соответственно 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

Говорится о совокупности.
Go to the top of the page
 
+Quote Post
Александр77
сообщение Jun 11 2017, 16:21
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 564
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Цитата(Ensider @ Jun 11 2017, 17:47) *
Что я неправильно делаю?

Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов?
PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими.
Go to the top of the page
 
+Quote Post
quato_a
сообщение Jun 11 2017, 19:37
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 27-07-11
Из: Зеленоград
Пользователь №: 66 439



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

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

http://www.analog.com/en/products/analog-t...roduct-overview
https://wiki.analog.com/resources/fpga/xili...terposer/ad7687 (Reference Design Files)


--------------------
Суббота начинается в понедельник
Go to the top of the page
 
+Quote Post
Ensider
сообщение Jun 12 2017, 05:52
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 8-03-17
Из: Россия,Москва
Пользователь №: 95 746



Цитата(Александр77 @ Jun 11 2017, 17:21) *
Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов?
PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими.


Я исправил позже.Просто, на момент написания не заметил, ибо дальше писать начал.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jun 12 2017, 09:20
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 3 680
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Александр77 @ Jun 11 2017, 19:21) *
Я правильно понимаю, вначале Вы пишете что DATA_TEMP состоит из 16 разрядов, а затем им присваиваете значение из 97 разрядов?
PS На Вашем месте, я бы попробовал получить данные хоть с одного "несчастного" АЦП, а уже после этого переходил к работе с несколькими.

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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd November 2017 - 02:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01662 секунд с 7
ELECTRONIX ©2004-2016