Jump to content

    

mishutinaalex

Участник
  • Content Count

    10
  • Joined

  • Last visited

Community Reputation

0 Обычный

About mishutinaalex

  • Birthday 05/04/1989

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Здравствуйте! Делаю КИХ-фильтр в Quartus II с помощью FIR Compiler. (Пишу диплом :) ) Коэффициенты есть, теперь нужно выбрать структуру фильтра: fully parallel, fully serial, multibit serial, multicycle. Если с fully parallel и fully serial все более-менее понятно и картинки есть в User Guide, то про multicycle написано, что ресурс, который потребует фильтр, зависит от того, сколько я выберу тактов для вычисления каждого выходного отсчета. И чем больше тактов на один выходной отсчет - тем меньше ресурс. А картинки - как выглядит эта структура фильтра - нету. вопрос: помогите, плиз, найти картинку или более подробное описание фильтров со структурой multicycle=) И еще: как правильно переводить на русский термины multicycle variable и multibit serial FIR filter?
  2. des00, расчет в матлабе на фиксед пойнт делается так? Hoodwin, но если при сдвиге на 16 отсчетов откидываются младшие биты, то выходной отсчет y(n)=0.6*x(n)+0.6*x(n-1)-0.2*y(n-1) будет вычислен с некоторой ошибкой, которая сохранится при вычислении следующего отсчета y(n+1), который тоже будет вычислен с ошибкой. Не получится ли так, что AЧХ недопустимо исказится из-за грубого округления? Какие проблемы есть при переходе к вычислению с большей разрядностью? Быстродействие? Частота дискретизации фильтра 32 Гц, с той же частотой поступают входные отсчеты. Hoodwin, что значит делать аппаратный умножитель? При записи умножения со * и при сложных коэффициентах квартус сам сделает умножение на аппаратных умножителях, а мне остается только улучшить быстродействие? записать коэффициенты b0, b1, a1 в регистры таким образом годится? reg [15:0] a1=13107 ? Насколько я понимаю, data_out и sample_out - оба регистры, и мне казалось, что безразлично, какой из них подавать на выход. почему если sample_out, а не data_out будет на выходе быстродействие будет выше?
  3. Hoodwin, а те 16 отсчетов, на которые мы сдвинули результат при делении на 2^16, мы используем при вычислении следующих отсчетов фильтра как дробную часть? То есть, получаются дополнительные 16 отсчетов для дробной части и, например, 16 для целой? И точность расчета выходного сигнала повышается в зависимости от количества битов дробной части?
  4. ViKo, ALTFP_ - это мегафункции для работы с плавающей точкой, но если у меня входные отсчеты фильтра с фиксированной точкой? То есть, нужно перевести число из формата с фиксированной точкой в формат с плавающей точкой? Чиповод, спасибо за ссылку, полученный код в квартусе действительно компилируется! Но не работает в ModelSim. Почти все сигналы - хххххх. На выходе также хххххх. И в силу сложности кода пока не разберусь, что нужно исправить. Найден компромисс: из коэффициентов, полученных в Matlab, по образцу из учебника написан БИХ-фильтр: module filter (data_in, data_out, clock, reset); output reg [15:0] data_out=16'b0; input [15:0] data_in; input clock, reset; reg [15:0] sample_in=16'b0; reg [15:0] sample_out=16'b0; always@(posedge clock) begin if(reset==1'b1) data_out<=16'b0; else data_out<=((data_in+sample_in)*3-sample_out)/5; //i.e. y = 0.6*x(n) + 0.6*x(n-1) - 0.2*y(n-1) always@(posedge clock) begin if(reset==1'b1) begin sample_in<=0; sample_out<=0; end else begin sample_in<=data_in; sample_out<=data_out; end end endmodule Все прекрасно работает в Квартусе и ModelSim'е, но моему руководителю дико не нравится деление на 5: ((data_in+sample_in)*3-sample_out)/5. требует переделать в целочисленную арифметику, или найти другой способ. Вопрос: как следует осуществлять "деление" в таких случаях? Или: как в этом случае воспользоваться мегафункциями ALTFP_??
  5. С помощью Matlab сделала БИХ-фильтр нижних частот (фильтр Баттерворта). Matlab сгенерировал Verilog HDL, который прекрасно компилируется и работает в ModelSim. Но verilog-код не компилируется в quartusII: "real variable data type are not suppotred", также не поддерживаются директивы $bitstoreal и $realtobits. Правильно я понимаю, что такой код в реальном устройстве работать не будет и следует написать другой код? Где найти примеры (книги, коды) IIR фильтров, которые скомпилируются в квартусе и смогут работать в реальном устройстве?
  6. Timmy, то есть если фазового сдвига нет, что phase_shift всегда равен 0, а если есть, то есть counter досчитает с -99 до 2, например, то phase_shift будет равен 2. То есть фактически мы измеряем изменение периода clk_2. А если это изменение =1 ns? и phase_shift его не зафиксирует, т.к. период clk_200 равен 5 ns? тогда если каждый период clk_2 будет больше на 1 ns, то за 0.1 мс фронт clk_2 сместится относительно идеального состояния на 200 ns, при том, что период clk_2 равен 500 ns. То есть фронт клока сдвинется на полпериода, а мы ничего не зафиксируем. Вот в чем вопрос)
  7. В стандарте ITU-T O.172 дано описание такого фильтра: Дрейф фазы должен быть измерен с помощью ФНЧ 1 порядка с частотой среза 10 Гц со следующими характеристиками: а) ФНЧ 1 порядка со спадом рабочей характеристики -20дБ/декаду. Точка -3 дБ должна находиться на частоте 10Гц+/-10%. б) Амплитуда неравномерности в полосе пропускания в пределах от 1 до 10 Гц должна быть меньше 0.2 дБ (по отношению к усилению на частоте 0.1 Гц) и максимальное затухание фильтра должно быть, минимум, 30 дБ. Вот оригинал: Wander shall be measured through an equivalent 10 Hz, first-order, low-pass measurement filter with the following characteristics: а) The low-pass measurement filter has a single-order characteristic and a roll-off of -20dB/decade. The -3 dB point of the measurement filter shall be at a frequency 10 Hz+/-10%. б) The amplitude of pass-band ripple in the range 1 to 10 Hz shall be less than +/-0.2 dB(relative to the gain at 0.1 Hz) and the maximum attenuation of the measurement filter shall be at least 30 dB. Вопрос: 1.если на частоте 10 Гц на рабочей характеристике должно быть -3 дБ, то как обеспечить неравномерность 0.2 дБ в пределах от 1 до 10 Гц? Ведь фильтр 1 порядка? 2.Максимальное затухание должно быть минимум 30 дБ но на каких частотах затухание должно быть максимальным? 3.Может быть, я не правильно перевожу описание фильтра?
  8. Добрый день. Задача: сделать цифровой фазовый детектор для измерения дрейфа фазы(вандера). Частота сигнала с вандером: Clock=2 МГц. Также есть стабильный опорный генератор clk=200 MГц. Вот схема фазового детектора, которую я попыталась описать на Verilog: А вот диаграмма работы. Суть в том, что по положительному фронту clock'а (который с вандером) считывается значение счетчика, и если оно остается одним и тем же, то фронт clock'а не сместился, а если изменяется, то фронт "ушел". На выходе X схемы выдается значение, на сколько периодов опорного генератора сместился фронт. Вот моё описание на Verilog: module dpd31 ( input wire clk, reset, //опорный clk=200MHz, сброс input wire clockW, //clock с вандером ~2 MHz output reg done_tick, output wire edg, //edg=1 при положительном фронте clockW output wire [21:0] x, output reg [21:0] counter ); localparam [2:0] zero0 =3'b000, // count0 =3'b001, // done0 =3'b010, // zero =3'b011, //состояние zero: обнуляется счетчик фронтов egdecounter count =3'b100, //считает количество edg до N done =3'b101; //при edgecounter=N записывает значение counter'a в регистр x_reg localparam N=5; //схема для исключения метастабильности: wire sync_clock; reg sync_ff1, sync_ff2; always@(posedge clk) sync_ff1<=clockW; always@(posedge clk) sync_ff2<=sync_ff1; assign sync_clock=sync_ff2; reg [2:0] state_reg, state_next; reg [15:0] edgecounter_reg, edgecounter_next; reg [21:0] x0_reg, x0_next, x_reg, x_next; reg delay_reg; always @(posedge clk, posedge reset) if(reset) begin state_reg<=zero0; edgecounter_reg<=0; delay_reg<=0; x_reg<=0; x0_reg<=0; end else begin state_reg<=state_next; edgecounter_reg<=edgecounter_next; delay_reg<=sync_clock; x_reg<=x_next; x0_reg<=x0_next; end //rising-edge tick assign edg=~delay_reg&sync_clock; // always @(posedge clk) if(counter==(100*N)-1) counter<=16'b0; else counter<=counter+16'b00000001; //********************************************** //конечный автомат: always @* begin state_next=state_reg; done_tick=1'b0; edgecounter_next=edgecounter_reg; x_next=x_reg; x0_next=x0_reg; case (state_reg) zero0: begin edgecounter_next=0; state_next=count0; end count0: begin if(edg) if(edgecounter_reg==N-1) state_next=done0; else edgecounter_next=edgecounter_reg+1; end done0: begin done_tick=1'b1; state_next=zero; x0_next=counter; end zero: begin edgecounter_next=0; state_next=count; end count: begin if(edg) if(edgecounter_reg==N-1) state_next=done; else edgecounter_next=edgecounter_reg+1; end done: begin done_tick=1'b1; state_next=zero; x_next=counter-x0_reg; end default: state_next=zero; endcase end assign x=x_reg; endmodule вопросы: Нет ли в Verilog-описании грубых ошибок?? Есть ли недостатки в этой схеме? Может ли подобная схема работать в реальном приборе для измерения дрейфа фазы?