LINUX.ORG.RU

Сообщения Aoizora

 

Схема умножения на фиксированный многочлен на Verilog

Форум — Development

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

[url=https://ibb.co/nsBVgpX][img]https://i.ibb.co/27SLnJz/1.png[/img][/url]

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

[code] 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 [/code]

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

[code] 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 [/code]

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

 , , ,

Aoizora
()

RSS подписка на новые темы