2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 17:21 
Аватара пользователя
Подскажите, пожалуйста, как аппаратно реализуются такие схемы? Прикладываю схемы картинками.

Изображение

Изображение

Я сделал простой расчет, пример кодирования на своем листочке и хочу повторить этот пример програмно на Verilog в симуляторе. Но что-то ничего не получается. Вот какая цепь у меня получилась по этой схеме:

Код:
module cyclic_coder_serial(
    input logic clk,
    input logic reset,
    input logic in,
    output logic out
);

    reg [3:0] lfsr;
   
    always @(posedge clk)
        if (reset)
            lfsr <= '0;
        else begin
            lfsr[3] <= in;
            lfsr[2] <= lfsr[3];
            lfsr[1] <= lfsr[2] ^ in;
            lfsr[0] <= lfsr[1] ^ in;
        end
       
    assign out = lfsr[0] ^ in;
   
endmodule


А тестбенч у меня, видимо, кривой, потому что в симуляторе получается какая-то не такая кривая последовательность:

Цитата:
xxxx1x10010$finish called at time : 110 ns


Сам тестбенч:

Цитата:
module cyclic_coder_serial_tb();

logic clk;
logic reset;
logic in;
logic out;

initial begin
clk <= 0;
forever #5 clk <= !clk;
end

cyclic_coder_serial uut(clk, reset, in, out);

initial begin
reset <= 1; #10
reset <= 0; #10
in <= 0; #10
in <= 1; #10
in <= 0; #10
in <= 1; #10
in <= 0; #10
in <= 0; #10
in <= 0; #10
in <= 0; #10
in <= 0; #10
$finish;
end

always @(posedge clk)
$write(out);
endmodule


Что я делаю не так?

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 18:20 
Плохо, что все переключения происходят на границе клока. Кто знает, как их симулятор обсчитает.
Я бы поставил задержку
Используется синтаксис C
#1 reset <= 1; #10
и
Используется синтаксис C
#2 $write(out);

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 18:29 
Аватара пользователя
Я новичок в верилоге. Можете объяснить, почему плохо переключения на границе клока, как надо делать и для чего ставят задержки?

А как работает такой код?

Код:
reset <= 1; @(posedge clk);
        reset <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        $stop;


Я поправил тестбенч. Все равно результат не совпадает.

Код:
module cyclic_coder_serial_tb();

    logic clk;
    logic reset;
    logic in;
    logic out;
   
    initial begin
        clk = 0;
        forever #5 clk = !clk;
    end
   
    cyclic_coder_serial uut(clk, reset, in, out);
   
    initial begin
        in <= 0;
        /*reset <= 1; @(posedge clk);
        reset <= 0; @(posedge clk); 
        in <= 1; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk); 
        $stop;*/
       
        // Тест u = 110
        /*reset <= 1; @(posedge clk);
        reset <= 0; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        $stop;*/
       
        /*reset <= 1; @(posedge clk);
        reset <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 1; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        in <= 0; @(posedge clk);
        $stop;*/
       
        #1 reset <= 1; #10
        #1 reset <= 0; #10
        #1 in <= 0; #10
        #1 in <= 1; #10
        #1 in <= 1; #10
        #1 in <= 0; #10
        #1 in <= 0; #10
        #1 in <= 0; #10
        #1 in <= 0; #10
        #1 in <= 0; #10
        #1 in <= 0; #10
        $stop;
    end
   
    always @(posedge clk)
        #2 $write(out);
endmodule


-- 29.03.2023, 19:03 --

Еще такой вопрос. Если я хочу своим кодером закодировать какое-то сообщение, которое передам по проводу на FPGA с микроконтроллера, передача с МК и кодирование на FPGA должны происходить на одной частоте клока? Иначе будут ошибки?

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 19:03 
Without Name в сообщении #1587384 писал(а):
#1 reset <= 1; #10
#1 reset <= 0; #10
Надо только перед первым, чтобы сдвинулось.
А так период вышел 11 вместо 10.

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 19:13 
Аватара пользователя
Вот так? Совсем другой результат стал

Цитата:
// Тест 011
#1 reset <= 1; #10
reset <= 0; #10
start <= 1; #10
in <= 0; #10
in <= 1; #10
in <= 1; #10
in <= 0; #10
in <= 0; #10
in <= 0; #10
in <= 0; #10
in <= 0; #10
in <= 0;
$stop;

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 19:29 
Without Name в сообщении #1587384 писал(а):
почему плохо переключения на границе клока
Вот делаете например "write(out)" в какой-то момент времени и в этот же момент "out" меняет значение с 0 на 1.
Что он должен написать - 0 или 1?

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 23:09 
Without Name в сообщении #1587384 писал(а):
Если я хочу своим кодером закодировать какое-то сообщение, которое передам по проводу на FPGA с микроконтроллера, передача с МК и кодирование на FPGA должны происходить на одной частоте клока?
Не на "на одной частоте клока", а "используя один и тот же сигнал клока".
Но вообще можно по разному реализовывать. Можно и связь между клоковыми доменами делать. Или вообще что-то асинхронное.
Но проще всего конечно синхронный протокол с общим клоком.

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение30.03.2023, 01:55 
Аватара пользователя
Понятно. А как реализуются такие схемы?

Изображение

Как на верилоге реализуется этот переключатель с двумя положениями "вверх-вниз"? Вроде как-то при помощи элементов "и" можно его реализовать. Как вообще в целом эта схема реализуется? С регистром сдвига все понятно, но этот переключатель взрывает мне мозг.

Я написал такой код, но что-то генерируется совсем другая последовательность

Код:
module hamming_coder_nonsystematic(
    input logic clk,
    input logic enable,
    input logic in,
    output logic out
);

    logic [3:0] s;
    logic [3:0] counter = 4'b0000;
   
    always @(posedge clk)
        if (enable)
            counter <= counter + 1'h1;
   
    always @(posedge clk) begin
        if (enable) begin
            s[3] <= in;
            s[2] <= s[3];
            s[1] <= s[2];
            s[0] <= s[1];
        end else
            s <= 4'b0000;
        if (counter == 4'h0)
            s <= 4'b0000;
    end
       
    assign out = in ^ s[1] ^ s[0];
endmodule

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение30.03.2023, 02:35 
Without Name в сообщении #1587451 писал(а):
Как на верилоге реализуется этот переключатель с двумя положениями "вверх-вниз"? Вроде как-то при помощи элементов "и" можно его реализовать.
После синтеза будет мультиплексор, который сам состоит из логических элементов.
На верилоге можно по разному. Можно и логическую схему сделать. Но нагляднее явно записать if-then-else или тернарный условный оператор (cond ? val1 : val2).
Without Name в сообщении #1587451 писал(а):
Я написал такой код, но что-то генерируется совсем другая последовательность
Это похоже не код для "6.13". Только зачем тут счётчик - не понятно.

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение30.03.2023, 11:51 
Аватара пользователя
А для систематического кодера с рисунка 6.15 этот код верный? Что-то на последних 4 тактах выводятся одни нули, а проверочных символов нет.
Счетчик - чтобы считать входные биты.

Код:
module cyclic_coder_systematic(
    input logic clk,
    input logic enable,
    input logic in,
    output logic out
);

    logic [3:0] higher_lfsr;
    logic [3:0] lower_lfsr;
    logic [3:0] bit_counter = 4'b0000;
   
    wire higher_datapath = higher_lfsr[0];
    wire lower_datapath = lower_lfsr[0];
    wire feedback = (bit_counter > 11) ? higher_datapath : 0;
   
    always @(posedge clk)
        if (enable)
            bit_counter <= bit_counter + 1'h1;
       
   
    always @(posedge clk) begin
        if (enable) begin
             higher_lfsr[3] <= in ^ feedback;
             higher_lfsr[2] <= higher_lfsr[3] ^ feedback;
             higher_lfsr[1] <= higher_lfsr[2];
             higher_lfsr[0] <= higher_lfsr[1];
             
             lower_lfsr[3] <= in;
             lower_lfsr[2] <= lower_lfsr[3];
             lower_lfsr[1] <= lower_lfsr[2];
             lower_lfsr[0] <= lower_lfsr[1];
         end else begin
            higher_lfsr <= 4'b0000;
            lower_lfsr  <= 4'b0000;
        end
       
        if (bit_counter == 4'h0) begin
            higher_lfsr <= 4'b0000;
            lower_lfsr <= 4'b0000;
        end
    end
   
    assign out = (bit_counter <= 11) ? lower_datapath : higher_datapath;
       
endmodule

 
 
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение30.03.2023, 17:24 
Мне кажется "на последних 4 тактах" должно быть "bit_counter > 15", а не "bit_counter > 11" (и ниже тоже).
Это 11 начальных тактов и ещё 4 такта на прохождение 4 стадий datapath.

А Вы вообще это отлаживаете? Смотрите waveforms после симуляции?
Там сразу видно, где что когда было.

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group