Здравствуйте! Мне нужно реализовать арифметические операции в системе остаточных классов (СОК) на языке Verilog. Мне не совсем понятно как реализовать такие алгоритмы на языке Verilog.
Для начала я попробовал сделал вот такой модуль для преобразования из обычной десятичной системы счисления в систему остаточных классов:
`define GET_DATA 3'b000 `define EXECUTE_ALGORITHM 3'b001 `define SEND_DATA 3'b010 module direct_converter(input[2:0] m, input[2:0] number, output reg[2:0] x, input[2:0] state); reg[2:0] m_ [2:0]; reg[2:0] x_ [2:0]; integer index = 2; always @(*) case (state) `GET_DATA: begin m_[index] = m; index = index - 1; end `EXECUTE_ALGORITHM: begin x_[2] = number % m_[2]; x_[1] = number % m_[1]; x_[0] = number % m_[0]; index = 2; end `SEND_DATA: begin x = x_[index]; index = index - 1; end endcase endmodule
Здесь через m передаем элементы базиса,
number - само число
через x выводим это же число, но уже преобразованное
state - состояние
Когда state равен GET_DATA мы получаем по одному числу из базиса и записываем в массив регистров m_ Когда state равен EXECUTE_ALGORITHM мы в массив регистров x_ записываем остатки от деления числа на соответствующие элементы базиса. Когда state равен SEND_DATA, мы по одному из массива x_ через выход x выводим элементы преобразованного в заданный базис числа.
Нормальное ли у меня решение? Или можно сделать по-другому и лучше? Подойдет ли он, чтобы использовать его для реализации арифметических операций? Нужно ли делать синхровход clock в этом модуле?