2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 17:21 
Аватара пользователя


03/01/23
73
Подскажите, пожалуйста, как аппаратно реализуются такие схемы? Прикладываю схемы картинками.

Изображение

Изображение

Я сделал простой расчет, пример кодирования на своем листочке и хочу повторить этот пример програмно на 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 
Заслуженный участник


18/09/21
1764
Плохо, что все переключения происходят на границе клока. Кто знает, как их симулятор обсчитает.
Я бы поставил задержку
Используется синтаксис C
#1 reset <= 1; #10
и
Используется синтаксис C
#2 $write(out);

 Профиль  
                  
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 18:29 
Аватара пользователя


03/01/23
73
Я новичок в верилоге. Можете объяснить, почему плохо переключения на границе клока, как надо делать и для чего ставят задержки?

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

Код:
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 
Заслуженный участник


18/09/21
1764
Without Name в сообщении #1587384 писал(а):
#1 reset <= 1; #10
#1 reset <= 0; #10
Надо только перед первым, чтобы сдвинулось.
А так период вышел 11 вместо 10.

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


03/01/23
73
Вот так? Совсем другой результат стал

Цитата:
// Тест 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 
Заслуженный участник


18/09/21
1764
Without Name в сообщении #1587384 писал(а):
почему плохо переключения на границе клока
Вот делаете например "write(out)" в какой-то момент времени и в этот же момент "out" меняет значение с 0 на 1.
Что он должен написать - 0 или 1?

 Профиль  
                  
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение29.03.2023, 23:09 
Заслуженный участник


18/09/21
1764
Without Name в сообщении #1587384 писал(а):
Если я хочу своим кодером закодировать какое-то сообщение, которое передам по проводу на FPGA с микроконтроллера, передача с МК и кодирование на FPGA должны происходить на одной частоте клока?
Не на "на одной частоте клока", а "используя один и тот же сигнал клока".
Но вообще можно по разному реализовывать. Можно и связь между клоковыми доменами делать. Или вообще что-то асинхронное.
Но проще всего конечно синхронный протокол с общим клоком.

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


03/01/23
73
Понятно. А как реализуются такие схемы?

Изображение

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

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

Код:
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 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Реализация кодера циклического кода на Verilog в VivadoXilin
Сообщение30.03.2023, 11:51 
Аватара пользователя


03/01/23
73
А для систематического кодера с рисунка 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 
Заслуженный участник


18/09/21
1764
Мне кажется "на последних 4 тактах" должно быть "bit_counter > 15", а не "bit_counter > 11" (и ниже тоже).
Это 11 начальных тактов и ещё 4 такта на прохождение 4 стадий datapath.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group