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

AngelicQuasar

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

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

  • Посещение

Репутация

1 Обычный

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

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

  1. Михайлов, Мазепа "Основы теории кодирования" Но мне по кодам больше нравится Блейхут "Теория и практика кодов, контролирующих ошибки" Офигеть, помогло Спасибо
  2. Ну да, можно сделать кодер и таким образом, умножив абстрактный вектор на матрицу и посчитав соотношения координат вектора, спасибо. А мой способ реализации вообще жизнеспособен?
  3. Здравствуйте. Помогите, пожалуйста, написать код по линейной переключательной схеме на картинке. Я написал такой код, но он работает неправильно. Модуль: module hamming_coder( input wire clk, input wire enable, input wire reset, input wire in, output wire out ); reg [3:0] counter = 0; reg [3:0] state; wire feedback = state[0] ^ state[2] ^ state[3]; wire nextBit = counter < 5 ? in : feedback; always @(posedge clk) begin if (reset) begin state <= 0; counter <= 0; end else if (enable) begin state <= { nextBit, state[3:1] }; counter <= counter + 4'b0001; end end assign out = state[0]; endmodule Тестбенч: module hamming_coder_tb(); logic clk; logic [3:0] data = 4'b0001; logic reset; logic enable; logic in; logic out; assign in = data[0]; initial begin clk = 0; forever #5 clk = ~clk; end always @(posedge clk) if (!reset && enable) data <= data >> 1; hamming_coder coder( .clk(clk), .enable(enable), .reset(reset), .in(in), .out(out) ); always @(posedge clk) if (!reset && enable) $write(out); initial begin reset <= 1'b1; enable <= 1'b0; @(posedge clk); reset <= 1'b0; enable <= 1'b1; repeat (11) @(posedge clk); $finish; end endmodule Ориентиры для проверки корректности кодирования: примеры кодирования при помощи порождающей матрицы этого кода. Информационное слово (1010), код (1010001); слово (1100), код (1100101); слово (1000), код (1000110). Помогите, пожалуйста, разобраться, что-то запутанно как-то. Одна маленькая погрешность приводит к совершенно другому кодовому слову.
  4. Я изменил код: module mult_poly( input logic clk, input logic reset, input logic in, output logic out, output logic done ); logic [2:0] lfsr = '0; always @(posedge clk) if (reset) lfsr <= '0; else begin lfsr[2] <= in; lfsr[1] <= lfsr[2]; lfsr[0] <= lfsr[1]; end assign out = in ^ lfsr[2] ^ lfsr[0]; assign done = lfsr == 0; endmodule module mult_poly_tb(); logic clk = 0; logic reset = 0; logic in = 0; logic out = 0; logic done = 0; initial begin forever #10 clk = !clk; end mult_poly dut( .clk(clk), .reset(reset), .in(in), .out(out), .done(done) ); initial begin #10 reset <= 1; #10 reset <= 0; #10 in <= 1; #10 in <= 0; #10 in <= 0; #10 in <= 1; #10 in <= 1; #10 in <= 0; end always @(posedge clk) begin $display("out = %b, done = %b", out, done); end endmodule При симуляции видно, что сигнал done, показывающий, что вычисление закончено (когда регистр lfsr снова обнулился) равен 0 только три раза. Значит, умножение сработало неправильно. # run 1000ns out = 0, done = 1 out = 0, done = 1 out = 0, done = 1 out = 1, done = 1 out = 1, done = 0 out = 0, done = 0 out = 1, done = 0 out = 0, done = 1 out = 0, done = 1 out = 0, done = 1
  5. У меня в тестбенче происходит что-то странное. Не знаю, как объяснить, но с сигналами in и out и с содержимым регистра lfsr происходит какой-то хаос. Эта схема из книги "Коды и математика", там про реализацию циклического кода. М-последовательность это случайный генератор, а тут схема умножения на полином. В симуляторе в Out выводится единица, когда в регистре lfsr ничего нет. Видимо, тестбенч кривой, а не схема.
  6. Я пишу в Vivado, он умеет SystemVerilog. Пишу в файлах .sv, так что вивадо сам понимает, на чем я пишу.
  7. Я выбрал для теста другой многочлен и посчитал в Maple, чему равно произведение: \(1+x+x^2+x^6+x^7=(11100011)\) Выписываем последовательность коэффициентов от младшего к старшему. Пусть старший коэффициент будет последним, потому что он первый вдвигается в схему. А вот какой результат работы схемы. Тестбенч: module mult_poly_tb(); logic clk = 0; logic in = 0; logic out = 0; initial begin forever #5 clk = !clk; end mult_poly dut(clk, in, out); initial begin in <= 1; #10 in <= 0; #10 in <= 0; #10 in <= 1; #10 in <= 1; end always @(posedge clk) begin $write("%b", out); end endmodule В консоль выводится такое: 110000101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Отличается и от вашего результата, и от моего. Кстати, а есть книга про такие схемы? Это либо теория кодирования, либо криптография. Что почитать о том, как самостоятельно рисовать такие схемы? Есть учебник?
  8. Я новичок в ПЛИС, многого не знаю. Пришел в ПЛИС из системного программирования, а здесь по-другому все. Сложно разбираться. Я выписывал коэффициенты от старшего одночлена с младшему, как в книге написано - там сказано, что на вход схемы сначала подается коэффициент при старшей степени.
  9. Хочу написать умножение на полином, как описано схемой в этой книге. Я написал по схеме такой код: module mult_poly( input logic clk, input logic in, output logic out ); logic [2:0] lfsr = '0; always @(posedge clk) begin lfsr[2] <= in; lfsr[1] <= lfsr[2]; lfsr[0] <= lfsr[1]; end assign out = in ^ lfsr[2] ^ lfsr[0]; endmodule И тестбенч к нему: module mult_poly_tb(); logic clk; logic in; logic out; initial begin clk <= 0; forever #5 clk =!clk; end mult_poly dut(clk, in, out); initial begin in = 1; #10 in = 0; #10 in = 0; #10 in = 1; end always @(posedge clk) begin $write("%b", out); end endmodule Почему код работает неправильно? Пример правильного вычисления: \(f(x) = 1 + x^3=(1001)\) \((1+x^3)(1+x^2+x^3)=x^6+x^5+x^2 + 1=(110011)\) Многочлен f(x), представленный последовательностью коэффициентов, прогоняю через схему и получаю в результате (1100001). Это неправильно, потому что правильный результат получен выше и равен (110011). Что я сделал не так? Почему схема не работает?
  10. Должно быть syndrome[2] = codeword[2] ^ codeword[3] ^ codeword[4] ^ codeword[6]; и data[3] <= code[6]; ?
  11. Хочу сделать кодирование Хэмминга на ПЛИС. Скажите, пожалуйста, есть ли у меня ошибки в коде? При отладке (моделировании) происходит что-то странное, где-то появляются иксы, после присваивания code <= codeword слева становится 0x55, а справа 0x5C. Должно быть равенство. Вот мой код: module hamming_decoder( input logic clk, input logic [6:0] codeword, output logic [2:0] syndrome, output reg [3:0] data ); logic [6:0] code; logic [6:0] err; always @(posedge clk) begin syndrome[2] <= codeword[2] ^ codeword[3] ^ codeword[4] ^ codeword[6]; syndrome[1] <= codeword[1] ^ codeword[3] ^ codeword[4] ^ codeword[5]; syndrome[0] <= codeword[6] ^ codeword[5] ^ codeword[3] ^ codeword[0]; code <= codeword; if (syndrome != 0) begin case (syndrome) 3'b001 : err <= 7'b0000001; 3'b010 : err <= 7'b0000010; 3'b100 : err <= 7'b0000100; 3'b111 : err <= 7'b0001000; 3'b110 : err <= 7'b0010000; 3'b011 : err <= 7'b0100000; 3'b101 : err <= 7'b1000000; endcase code <= code ^ err; end end always @(code) begin data[3] = code[6]; data[2] = code[5]; data[1] = code[4]; data[0] = code[3]; end endmodule Тестбенч: module hamming_decoder_tb(); logic clk; logic [6:0] codeword; logic [2:0] syndrome; logic [3:0] data; hamming_decoder dut(clk, codeword, syndrome, data); initial begin clk <= '0; forever #10 clk <= ~clk; end initial begin $monitor("codeword = %b, syndrome = %b, data = %b", codeword, syndrome, data); codeword = 7'b0011001; #100 codeword = 7'b0101100; #100 codeword = 7'b1010011; #100 codeword = 7'b1011001; #100 codeword = 7'b0101000; end endmodule Может, я где-то напутал с = и <=?
×
×
  • Создать...