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

srf55

Участник
  • Постов

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

  • Посещение

Репутация

2 Обычный

Информация о srf55

  • Звание
    Участник
    Участник

Посетители профиля

614 просмотра профиля
  1. Извините, за мою безграмотность ( Здесь имелась ввиду не амплитуда, а достоверные мгновенные значения напряжений.
  2. Не понял эту фразу. Вы говорите, что тип сигнала влияет на точность измерения амплитуды в отдельных отсчетах?
  3. Спасибо) Получается, что максимально 62.5 kSPS на один канал. Из этого следует, что рабочая полоса может быть только 0..32,25 МГц (половина частоты дискретизации). Такая полоса тоже устроит. Смысл всей моей затеи - сделать входной фильтр для AD7682, использовать максимально доступный диапазон рабочей частоты, получив при этом минимальную неоднородность АЧХ в этом диапазоне рабочей частоты. Остановлюсь пока на AD7682, т.к он у меня есть. Хочу разобраться вообще в подходах к разработке аналоговых фильтров в, рассчитать в Filter Solutions, промоделировать в LTSpice (Transient, AC Analysis, Noise) и проверить в железе. Хочу получать значения амплитуды, без дофильтровываний в цифре. Зона Найквиста одна. При этом получить фильтр с минимальной неоднородностью АЧХ в рабочей полосе (для точности изменений)
  4. По тексту не нашел конкретных указаний на это и начал считать от обратного: 50 МГц(частота SCK) / 4 канала / 16 бит (т.к SAR) = 781,250 kSpS . Понятное дело, что между сэмплами какая-то пауза должна быть. И поэтому решил, что 250kSpS на каждый канал вполне реально
  5. Спасибо! Но разве активные фильтры не более устойчивы к изменениям R нагрузки и C нагрузки? По тексту из даташита на AD7682: Rin около 2.2кОм, Сin около 27pF А чем его тогда заменить, если фильтра Чебышева и Бесселя имеют более неоднородную АЧХ в рабочей полосе?
  6. Спасибо за ориентировочные паразитные параметры. Пока что их буду использовать Спасибо! Изменил параметры Pass Band = 105 кГц, Stop Band Frequency = 150 кГц. 40 дБ подавления пока оставил. Но уже становится понятно, что с такими параметрами вменяемого порядка фильтра не получается. В моей задаче измерять фазу не требуется. У меня все четыре канала используются. В первом посте мне надо было написать, что речь идет в т.ч про килосэмплы. Полистал даташит на АЦП. Не нашел где сказано, что 250ксэмплов это не на каждый канал из четырех.
  7. Здравствуйте! Появилась задача сделать антиалайзинговый фильтр (ФНЧ). Этот ФНЧ будет стоять перед входом в SAR АЦП (частота дискретизации 250 кГц) AD7682. Рабочая полоса входного сигнала: 0..100 кГц. Амплитуда входного сигнала: ±1 В (размах 2 В) Сам фильтр решил делать с такими параметрами (Поправьте, пожалуйста, если не прав. Возможно вообще можно сделать всё проще или сложнее 🙂 ) Активный фильтр Баттерворта. Предполагаю, что так можно будет достичь минимальной неоднородности АЧХ (около 0 dB) в области рабочей полосы). Все активные элементы: ОУ AD8655 Топология фильтра: GIC Biquad (интересно, как это по-русски называется). Если правильно прочитал, то фильтр с такой топологией будет наиболее устойчивым к изменениям номиналов резисторов/конденсаторов. Pass Band Frequency (частота полосы пропускания) = 125 кГц (взял такую, чтобы неоднородность АЧХ в рабочей полосе была минимальной, отодвинул частоту среза от рабочей полосы) Stop Band Frequency (частота полосы заграждения) = 250 кГц Stop Band Attenuation (ослабление в полосе заграждения) = 40 dB Усиление фильтра 1.5 раза. Выходной сигнал по амплитуде 0..3В Для расчета необходимо указать паразитные параметры (Parasitics): ОУ, конденсаторов, резисторов. Но где взять некоторые из параметров(как рассчитать), в даташитах они не приведены? 1) R Out (ОУ) 2) R In (ОУ) 3) C In (ОУ) 4) Default Resistor Shunt Capitance (резистор) 5) Def Cap Q (конденсатор) 6) Def Cap Rs (конденсатор) 7) Def Cap Rp (конденсатор) Конденсаторы и резисторы - Murata и Yageo Скорее всего еще ручная пайка будет вносить дополнительную паразитную емкость, как и ее учесть? Скриншот Nuhertz FilterSolution: P.S: Планирую еще потом проверить рассчитанный фильтр в LTSpice
  8. Здравствуйте! Подскажите, пожалуйста, какие-нибудь аналоги трансформатора ZMPT101B, желательно в еще более миниатюрном корпусе (по высоте)
  9. Спасибо всем за помощь! Вот что получилось: ring_buffer.v ring_buffer_pipe.v ring_buffer_tb.sv Исправил ошибку, last выставлялся несвоевременно, на такт раньше, чем нужно. Через строковый параметр Добавил возможность выбирать тип используемой памяти (параметр USE_BLOCK_RAM). Исправил, теперь в этом месте происходит сравнение с константой 😀 Разве? Где сигнал ready? А вот когда он появится, тогда Смотрел стандарт AMBA AXI-Stream и не нашел, что ready (TREADY) - это обязательный сигнал (но мог упустить, и где-то об этом говорится). В этом конкретном случае, на мой взгляд, сигнал TREADY не нужен.
  10. Спасибо! Основываясь на мысли Arlleex сделал ring.v (прекратил запрещать запись во время выдачи данных) Добавил дополнительные регистры (ring_pipe.v). Но счетчики, на более мелкие (как посоветовал Maverick_) пока что дробить не стал. Т.к Fmax возрос до 370 МГц и этого хватает. Потом ради интереса может займусь. сделал ring_tb.sv - для проверки того, что модули работают идентично
  11. Сейчас подумал, что можно обеспечить, чтобы адрес write_ptr был на 1 больше, чем адрес read_ptr. Тогда никаких коллизий не будет происходить. Спасибо! Только тогда придется сделать еще один счетчик(считать до значения глубины FIFO), т.к не получится останавливать выдачу данных на условии: (read_ptr == write_ptr - 1)
  12. Добрый день! Написал модуль кольцевого буфера, планирую использовать для временного хранения отсчетов, захваченных с АЦП. Модуль служит для того, чтобы сохранять предыдущие N-отсчетов с АЦП. Суть работы модуля такая: 1) Данные пишутся в буфер непрерывно, по кругу 2) при возникновении разового импульса на входе catch все данные выдаются на выход (интерфейс AXI-Stream) 3) В момент выдачи данных, запрещается запись в буфер Вроде хорошо работает на частотах до 250 МГц (Virtex-6). Но хотелось бы оптимизировать его, чтобы он работать на чуть большей частоте (300МГц). Может кто-нибудь подскажет, как. Еще хотелось бы сделать модуль более параметризируемым. Чтобы можно было выбирать тип используемой памяти (блочная или распределенная) Код модуля: `timescale 1ns/1ps module ring_buffer #( parameter DATA_WIDTH = 8, parameter BUFFER_DEPTH = 32768, parameter USE_BLOCK_RAM = 1 ) ( input wire clk, // Тактовый сигнал input wire reset, // Сигнал сброса input wire [DATA_WIDTH-1:0] data_in, // Входные данные Native интерфейса input wire catch, // Флаг начала выдачи данных output wire [DATA_WIDTH-1:0] data_out, // Выходные данные output wire valid_out, // Сигнал валидности выходных данных output wire last_out // Сигнал последнего отсчета выходных данных ); reg [DATA_WIDTH-1:0] buffer [0:BUFFER_DEPTH-1]; // Кольцевой буфер предыдущих отсчетов reg [$clog2(BUFFER_DEPTH)-1:0] read_ptr = 0; // Указатель на чтение reg [$clog2(BUFFER_DEPTH)-1:0] write_ptr = 0; // Указатель на запись reg transfer_active = 1'b0; // Флаг активной передачи данных always @(posedge clk or posedge reset) begin if (reset) begin // Сброс в начальное состояние при срабатывании сигнала сброса //buffer <= 0; read_ptr <= 0; write_ptr <= 0; transfer_active <= 0; end else begin // Запись в буфер независимо от флага if (!transfer_active) buffer[write_ptr] <= data_in; if (!transfer_active) write_ptr <= write_ptr + 1; // Установка флага активной передачи данных if (catch) begin transfer_active <= 1; end else if (last_out) begin transfer_active <= 0; end if (transfer_active) begin read_ptr <= read_ptr + 1; end else begin if (catch) read_ptr <= write_ptr + 1; end end end // Выходные данные assign data_out = buffer[read_ptr]; assign valid_out = transfer_active; assign last_out = (read_ptr == write_ptr - 1) ? 1'b1 : 1'b0; // Сигнал последнего отсчета при чтении последнего отсчета из буфера endmodule Тестбенч: `timescale 1ns/1ps module ring_tb (); logic clk = '0; // Тактовый сигнал logic reset = '0; // Сигнал сброса logic [7:0] data_in = '0; // Входные данные Native интерфейса logic catch = '0; // Флаг начала выдачи данных logic [7:0] data_out; // Выходные данные logic valid_out; // Сигнал валидности выходных данных logic last_out; // Сигнал последнего отсчета выходных данных ring #( .DATA_WIDTH (8), .BUFFER_DEPTH (32768), .USE_BLOCK_RAM (1) ) dut ( .clk (clk), // Тактовый сигнал .reset (reset), // Сигнал сброса .data_in (data_in), // Входные данные Native интерфейса .catch (catch), // Флаг начала выдачи данных .data_out (data_out), // Выходные данные .valid_out (valid_out), // Сигнал валидности выходных данных .last_out (last_out) // Сигнал последнего отсчета выходных данных ); initial begin clk = 0; forever clk = #5 ~clk; end initial begin reset = 1; #100; reset = 0; #100; end always_ff @(posedge clk) begin : proc_data_in data_in <= data_in + 1'b1; end initial begin catch = '0; #500000; catch = '1; #10; catch = '0; #500000; catch = '1; #10; catch = '0; end endmodule
  13. Нашел для монтирования архивов более удобный инструмент: ratarmount Поддерживает многопоточность, работает быстрее
  14. Ага, так я себе это и представлял 🙂 Только не умею ни bat, ни sh. 😁 Поэтому надеюсь, что кто-нибудь подобное уже реализовал. Думаю, что это много бы кому пригодилось
×
×
  • Создать...