2014 dxdy logo

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

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


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


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



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


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

Изображение

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

Код:
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
1766
Without Name в сообщении #1587581 писал(а):
Тут непонятно откуда появился икс
Из "in" на первом фронте (когда ещё ресет стоит). В "in" то никто ничего не записал до 11нс.

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


03/01/23
73
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
1766
Там проблема, что "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
73
Вот так делается буферизация?

Код:
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
1766
Without Name в сообщении #1587587 писал(а):
теперь снова "икс" появился в выводе
Это потому что регистр "out" никто не инициализировал. Его тоже можно было бы обнулить по "reset", как и "s".
Without Name в сообщении #1587587 писал(а):
А что почитать, чтобы начать разбираться самому в таком программировании?
Честно говоря, не знаю. Обычно изучают в рамках курса VLSI.
Если заниматься только FPGA, то целиком VLSI не нужен. Наверно есть какие-то курсы по FPGA.
Чтобы отдельно учили только Verilog - не видел.

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

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



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

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


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

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