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

    

Vehfl

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный
  1. Цитата(Golikov A. @ Jul 11 2014, 21:19) Код0:        begin                   mode <= 1;                 shiftreg[0:14] <= {In, {272{1'b0}}};             end может так? Правда тут надо понять в какой момент появляются данные на входе, если только ко 2 такту, то надо увеличить на 1 счетчик второй фазы. Если они есть в первую фазу, то так как выше Не понял этот кусок кода. Мне для работы алгоритма надо ставить в нуль первые пятнадцать разрядов регистра. Пришедшие данные на диаграмме в переменой In. Самый первый бит пришедших данных не входит в регистр, начинает входить со второго.
  2. Пишу описание декодера, работающего в нескольких режимах: 0 - начальная установка, 1 - запись в регистр, 2 - считывание. Режим записи длится ровно столько тактов сколько бит должно войти в регистр. В режиме записи в сдвиговый регистр не берется первый пришедший бит, все что идет дальше заходит в регистр. Есть ли способ это исправить или можно только внести дополнительную задержку чтобы первый бит приходил во второй такт режима считывания? Ниже код и временная диаграмма. Кодalways @(posedge clk) begin if (reset)     begin         mode <= 0;         cnt <= 0;         shiftreg <= 0;     end else     case (mode)     0:        begin                   mode <= 1;                 shiftreg[0:14] <= 0;             end     1:     begin                     cnt <= cnt + 1;                 shiftreg <= {In, shiftreg[0:271]};             if (cnt==257) begin                 mode <= 2;                 cnt <= 0; end             else                 mode <= 1;             end
  3. Цитата(doublekey @ Dec 27 2012, 19:18) Кодmodule top (   input clk,    // 50 MHz clock input.   input rst,   output reg imp // Signal pulse.   );      parameter SYS_CLK_MHZ     = 50;  // System clock frequency, MHz.   parameter PULSE_WIDTH_NS  = 200; // Pulse width, ns.   parameter PULSE_PERIOD_US = 100; // Pulse period, us.      localparam PULSE_WIDTH = (SYS_CLK_MHZ * PULSE_WIDTH_NS) / 1000; // Pulse width, clock cycles.   localparam PULSE_PERIOD = (SYS_CLK_MHZ * PULSE_PERIOD_US); // Pulse period, clock cycles.      localparam PULSE_PERIOD_W = $clog2(PULSE_PERIOD); // Pulse period counter width.      reg [PULSE_PERIOD_W - 1 :0] period_cntr; // Pulse period counter.      always_ff @(posedge clk, posedge rst)   if (rst)     begin       period_cntr <= '0;       imp <= '1;     end   else     begin       period_cntr <= period_cntr + 1;       if (PULSE_PERIOD == period_cntr) period_cntr <= '0;       if (PULSE_WIDTH == period_cntr)  imp <= '0;       if (PULSE_PERIOD == period_cntr) imp <= '1;     end endmodule Я так понимаю, это программа является решением моим. А могли бы Вы объяснить зачем в строке, описывающей PULSE_WIDTH надо делить на 1000. И еще, я читал $clog2 берет логарифм по основанию е. Я так понимаю, в моем же случае нужен логарифм по основанию 2?
  4. Не опытен в разработки на ПЛИС и поэтому прошу совета. Мне нужно разработать источник импульсов такого вида: Прямоугольный импульс длится время t, следующий такой импульс появляется через 19*t. t=6 нс. Пытался сделать такой генератор с помощью блоков System Generator в Simulink. Блок counter считывает содержимое памяти (вектор 100000000000000000000) с заданной частотой. Импульсы выводил на пин. После загрузки получившейся прошивки на плату измерительный прибор показывает не то что надо. Возможно я не правильно реализую то, что мне нужно? Или может выводить на пин не целесообразно? Как лучше сделать такой генератор?
  5. Цитата(slash_spb @ Nov 30 2012, 10:42) Думаю в matlab'е с кодированием все правильно, такую бы ошибку быстро нашли бы. Но можно проверить. А по поводу ваших скоростей, кодирование не работает на скоростях где число проверочных бит больше чем число данных. Наверное да, кодер. Хотя алгоритм кодирования в dvb-s2 относительно просто. Тогда был бы признателен если вы как-нибудь передали мне блоки закодированные, например на почту. Вы могли бы послать мне их?
  6. Цитата(slash_spb @ Nov 29 2012, 17:47) Не совсем понял) Вы вроде приводили скрипт в котором можете с легкостью с генерировать нужные кодовые блоки. Спасибо Думал что может в кодере из matlab тоже ошибка. У вас нету сведений о его правильности?
  7. Цитата(slash_spb @ Nov 22 2012, 18:31) Алгоритм декодирования MIN-SUM, такой же как в DVB-S2, только нет коррекции. Ну еще он с одним проходом по строкам кодовой матрице. У меня он есть на матлабе, на си нет. Вам исходник нужен, я правильно понял? Был бы признателен если бы вы предоставили закодированные блоки с исходными сообщениями для нескольких скоростей скажем для 1/2,2/5 и 1/3. У нас есть подозрения на неправильную работу кодера.
  8. Цитата(slash_spb @ Nov 22 2012, 18:31) Вам исходник нужен, я правильно понял? Да, это было бы прекрасно иметь наглядный алгоритм декодирования.
  9. Не могли бы поделиться алгоритмом декодирования который использовали. Спасибо.
  10. Цитата(slash_spb @ Nov 15 2012, 18:49) У вас реализация с плавающей точкой? В реализациях с фиксированной точкой декодер начинает сам вносить ошибки при больших снрах когда нет проверки на четность(наличию ошибок в блоке) после каждой итерации, либо что-то с нормировкой мягких решений на входе декодера. Ну это так, вдруг поможет. Хотя наверное ошибка в модели. Пожалуйста можете поподробней и что вы имеете ввиду под реализацией с фиксированной точкой?
  11. Цитата(Serg76 @ Nov 13 2012, 17:59) Промоделировал своими средствами для QPSK 1/4 при разных С/Ш - все работает, ошибки исправляются. Ищите ошибки в модели. Товарищи, которые делали по стандарту, говорят, что в матрицах опечаток нет. Случайно не в матлабе моделировали? У меня в матлабе при отношении С/Ш=0, BER=0. Ведь физически такого не может быть? Код программы в матлабе: CODEformat long clear all; r=2/3 H = dvbs2ldpc®; %e=0 % spy(H); % Visualize the location of nonzero elements in H. % Construct a default LDPC encoder object henc = fec.ldpcenc(H); for SNRdB = 0 for n=1:100; % Generate a random binary message msg = randint(1,henc.NumInfoBits,2); % Encode the message codeword = encode(henc, msg); % Verify the parity checks (which should be a zero vector) paritychecks = mod(henc.ParityCheckMatrix * codeword', 2); hdec = fec.ldpcdec(H); % Construct a BPSK modulator object modObj = modem.pskmod('M',2,'InputType','Bit'); % Modulate the signal (map bit 0 to 1 + 0i, bit 1 to -1 + 0i) modulatedsig = modulate(modObj, codeword); % Noise parameters sigma = sqrt(10^(-SNRdB/10)); % Transmit signal through AWGN channel receivedsig = awgn(modulatedsig, SNRdB, 0); % Signal power = 0 dBW % % Visualize received signal % scatterplot(receivedsig) % Construct a BPSK demodulator object to compute % log-likelihood ratios demodObj = modem.pskdemod(modObj,'DecisionType','LLR', ... 'NoiseVariance',sigma^2); % Compute log-likelihood ratios (AWGN channel) llr = demodulate(demodObj, receivedsig); % Decode received signal decodedmsg = decode(hdec, llr); N_err=nnz(decodedmsg-msg); % % Actual number of iterations executed % disp(['Number of iterations executed = ' ... % num2str(hdec.ActualNumIterations)]); % % Number of parity-checks violated % disp(['Number of parity-checks violated = ' ... % num2str(sum(hdec.FinalParityChecks))]); % % Compare with original message % disp(['Number of bits incorrectly decoded = ' ... % num2str(N_err)]) a(n)=N_err; % Общее количество ошибок end BER=sum(a)/(n*henc.NumInfoBits) end BER FER=(nnz(a))/n
  12. Есть программа на C++ для моделирования кодов LDPC для стандарта DVB-S2, в программе есть матрицы из стандарта, задающие коды, есть модем и канал связи с возможностью установки отношения Eb/No. Для всех кодов кроме скоростей 2/5, 1/3, 1/4 получились приемлимые графики зависимости BER (Bit Error Rate) от Eb/No, сходящиеся с теоретическими из статей. Для скоростей 1/4, 1/3, 2/5 декодер не работает, сам добавляет ошибки даже, если в канале ошибок не было. Может это опечатка в матрицах, взятых из стандарта. Ниже приведен стандарт. Не знаете с чем может быть связано, что не работают три скорости?
  13. Цитата(Serg76 @ Nov 12 2012, 14:23) Еще такой момент, с этими кодовыми скоростями используется ассиметричная 8PSK для обратной совместимости со старым стандартом DVB-S. подробности надо в стандарте читать Про какие именно скорости идет речь? Про те, которые не работают у меня в C++ программе (1/4, 1/3, 2/5)?
  14. Мне нужно получить графики зависимости BER (Bit Error Rate) от Eb/N0 , для этого я воспользовался программой, написанной в MATLAB, мною были получены графики для кодов с нормальной длиной кадра со скоростями 9/10, 8/9, 5/6, 4/5, 3/4, для остальных скоростей при отношении Eb/N0=0 BER=0. Параллельно проводил моделирование в программе, написанной на C++. На первый взгляд, в С++ программе все тоже самое что и в MATLAB: канал, модем, матрицы, задающие код. Но в программе, написанной на C++ не работают скорости 1/4, 1/3, 2/5, при выборе этих скоростей даже если не задавать ошибки каналом связи, после декодирования будут появляться ошибки. Буду признателен если поможете, может кто-нибудь получал такие графики.