Хочу реализовать схему для умножения полиномов на фиксированный полином по книге. Не уверен, что все делаю правильно. По методичке, нагугленной в интернете, пытался разобраться в регистрах сдвига и написал такой код:
reg [2:0] data = 3'b000; always @(posedge clk) begin if (enable) data <= { in, data[2:1] }; end
assign out = in ^ data[2] ^ data[0]; endmodule
Я плохо понимаю, как в SystemVerilog происходит конкатенация шин:
Код:
data <= { in, data[2:1] };
Здесь получается шина, где in - старший разряд, а data[1] - самый младший? Что будет, если поменять переменные местами и написать:
Код:
data <= { data[2:1], in };
Теперь data[2] и data[1] будут старшие разряды, а in - самый младший? Будет ли схема работать по-другому, если написать:
Код:
data <= { in, data[1:0],};
Здесь регистр сдвигает полученные биты влево, поэтому конкатенация должна быть соответствующая, при которой эти биты сдвигаются влево.
И еще вопрос. Есть ли возможность сразу на широкую шину (скажем, 8 бит) выставить коэффициенты многочлена единовременно, а не по одному биту? Как это сделать?
Добавлено after 8 hours 39 minutes 47 seconds: И еще вопрос
Как задаются индексы шины при конкатенации шин? Вот например:
wire [1:0] dataIn; assign dataIn = {d1,d0};
Тут dataIn[0] содержит сигнал d0 или d1? Или это не имеет значения?
always @(posedge clk or posedge reset) begin : data_2_process if (reset == 1'b1) begin data_2_out1 <= 1'b0; end else begin if (enb) begin data_2_out1 <= In; end end end
always @(posedge clk or posedge reset) begin : data_0_process if (reset == 1'b1) begin data_0_reg[0] <= 1'b0; data_0_reg[1] <= 1'b0; end else begin if (enb) begin data_0_reg[0] <= data_0_reg_next[0]; data_0_reg[1] <= data_0_reg_next[1]; end end end
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
initial begin clk = 0; forever #10 clk = ~clk; end
initial begin clk = 1; enable = 1; in = 1; #10 $display(out);
in = 0; #10 $display(out);
in = 1; #10 $display(out);
in = 0; #10 $display(out);
in = 0; #10 $display(out);
in = 0; #10 $display(out); end endmodule
Добавлено after 1 minute 36 seconds: Re: Умножение многочленов конечного поля при помощи регистра сдв Что-то симулятор печатает странные результаты. Подаю на вход многочлен x^2 + 1 как бинарный вектор (1, 0, 1), результатом должен быть многочлен x^5 + x^4 + x^3 + 1 (бинарный вектор 111001), а симулятор печатает 010111. Похоже, если развернуть вектор, но не то.
Заголовок сообщения: Re: Умножение многочленов конечного поля при помощи регистра
Добавлено: Пн фев 13, 2023 18:14:45
Друг Кота
Карма: 67
Рейтинг сообщений: 1029
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 18969 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Да, если вы подаёте на вход "101000", на выходе должно быть "111001".
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Рассмотрим реализацию узла управления реле на примере компонентов SUNCO и реле Hongfa. Разберем оптимальные схемы и долговечные полупроводниковые компоненты для их реализации среди широкого ассортимента SUNCO. В номенклатуру компании SUNCO входят диодные мосты, выпрямительные, сигнальные и TVS-диоды, стабилитроны, биполярные, цифровые PNP- и NPN-транзисторы, маломощные тиристоры, симисторы и MOSFET.
У меня не получается умножать многочлены по этой схеме. Как ее реализовать и просимулировать?
Я вот так реализовал ее на верилоге:
Код:
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 = 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 Тут непонятно откуда появился икс, а последовательность бит вообще другая какая-то. Скажите, пожалуйста, как правильно реализовать эту схему и симулировать ее, чтобы получился верный результат.
КОМПЭЛ продолжает поддерживать и расширять список складских позиций Hongfa, представленных электромеханическими реле. Продукция компании активно применяется в таких областях, как промышленность, энергетика, бытовые приборы, автомобильная отрасль и специальная техника, требующая высокой надежности и на сегодняшний момент может легко заменить электромеханические реле ушедших из РФ брендов.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения