2014 dxdy logo

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

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


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Схема умножения на фиксированный многочлен на Verilog
Сообщение30.03.2023, 21:53 
Аватара пользователя


03/01/23
17/02/25
91
Хочу реализовать быстрый умножитель на константный многочлен из книги. Вот схема

Изображение

По этой схеме я написал такой код на верилоге:

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

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


И тестбенч к нему:

Код:
module multiplier_tb();

    logic clk;
    logic reset;
    logic in;
    logic out;
   
    initial begin
        clk = 0;
        forever #5 clk = ~clk;
    end
   
    multiplier m(clk, reset, in, out);
   
    initial begin
        #1 reset = 1; #10
        reset = 0;
/*       
        // data 11111
        in = 1; #10
        in = 1; #10
        in = 1; #10
        in = 1; #10
        in = 1; #10
        // tail
        in = 0; #10
        in = 0; #10
        in = 0; #10
        $stop;
*/

       // data 1000
       in = 0; #10
       in = 1; #10
       in = 0; #10
       in = 0; #10
       in = 0; #10
       // tail
       in = 0; #10
       in = 0; #10
       in = 0; #10
       $stop;
    end
   
    always @(posedge clk)
        #2 $write(out);
endmodule


Но на последовательности $f(x) = 1000$ схема работает неправильно. По математический расчетам должно получиться 1101000 - результат умножения многочлена $g(x) = x^3 + x^2 + 1$ на $x^3$. В логе симулятора получается такое:
Цитата:
x00010000$stop
Тут непонятно откуда появился икс, а последовательность бит вообще другая какая-то. Скажите, пожалуйста, как правильно реализовать эту схему и симулировать ее, чтобы получился верный результат.

 Профиль  
                  
 
 Re: Схема умножения на фиксированный многочлен на Verilog
Сообщение30.03.2023, 22:07 
Заслуженный участник


18/09/21
1769
Without Name в сообщении #1587581 писал(а):
Тут непонятно откуда появился икс
Из "in" на первом фронте (когда ещё ресет стоит). В "in" то никто ничего не записал до 11нс.

 Профиль  
                  
 
 Re: Схема умножения на фиксированный многочлен на Verilog
Сообщение30.03.2023, 22:21 
Аватара пользователя


03/01/23
17/02/25
91
zykov в сообщении #1587582 писал(а):
Without Name в сообщении #1587581 писал(а):
Тут непонятно откуда появился икс
Из "in" на первом фронте (когда ещё ресет стоит). В "in" то никто ничего не записал до 11нс.

ПОнятно, спасибо. Сделал вот так и "икс" ушел

Код:
initial begin
        in = 0;
        #1 reset = 1; #10
        reset = 0; #10
/*       


Но выходная последовательность все равно неправильная. Она равна 00001000, а должно быть $x^3(x^3 + x + 1)=x^6 + x^4 + x^3 = 1011000$

 Профиль  
                  
 
 Re: Схема умножения на фиксированный многочлен на Verilog
Сообщение30.03.2023, 22:33 
Заслуженный участник


18/09/21
1769
Там проблема, что "out" напрямую зависит от "in" без буферизации.
Используется синтаксис C
assign out = in ^ s[2] ^ s[0];
Если "in" меняется, то "out" тоже сразу меняется. А меняем мы его со сдвигом 1нс, в то время как "write" выдаёт со сдвигом 2нс.
Тут либо убрать "#2" перед "write".
Либо, что лучше, сделать буферизацию для "out".
Убрать "assign" и добавить:
Используется синтаксис C
        else begin
            s[2] <= in;
            s[1] <= s[2];
            s[0] <= s[1];
            out <= in ^ s[2] ^ s[0];
        end

 Профиль  
                  
 
 Re: Схема умножения на фиксированный многочлен на Verilog
Сообщение30.03.2023, 22:42 
Аватара пользователя


03/01/23
17/02/25
91
Вот так делается буферизация?

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

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


Поправил тестбенч, теперь снова "икс" появился в выводе

Код:
module multiplier_tb();

    logic clk;
    logic reset;
    logic in;
    logic out;
   
    initial begin
        clk = 0;
        forever #5 clk = ~clk;
    end
   
    multiplier m(clk, reset, in, out);
   
    initial begin
        #1 in = 0;
        reset = 1; #10
        reset = 0; #10

       // data 1000
       in = 1; #10
       in = 0; #10
       in = 0; #10
       in = 0; #10
       // tail
       in = 0; #10
       in = 0; #10
       in = 0; #10
       in = 0;
       $stop;
    end
   
    always @(posedge clk)
        #2 $write(out);
endmodule



Это все очень интересно. А что почитать, чтобы начать разбираться самому в таком программировании?

 Профиль  
                  
 
 Re: Схема умножения на фиксированный многочлен на Verilog
Сообщение30.03.2023, 22:50 
Заслуженный участник


18/09/21
1769
Without Name в сообщении #1587587 писал(а):
теперь снова "икс" появился в выводе
Это потому что регистр "out" никто не инициализировал. Его тоже можно было бы обнулить по "reset", как и "s".
Without Name в сообщении #1587587 писал(а):
А что почитать, чтобы начать разбираться самому в таком программировании?
Честно говоря, не знаю. Обычно изучают в рамках курса VLSI.
Если заниматься только FPGA, то целиком VLSI не нужен. Наверно есть какие-то курсы по FPGA.
Чтобы отдельно учили только Verilog - не видел.

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

Модераторы: Модераторы Математики, Супермодераторы



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

Сейчас этот форум просматривают: gris


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

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