VHDL, есть ли способ, использовать по модулю более 64 бит без знака? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть два 115-битных неподписанных вектора.Я должен выполнить некоторые модовые расчеты, но Quartus показывает эти ошибки.

Error: In lpm_divide megafunction, LPM_WIDTHN must be less than or equals to 64
Error: In lpm_divide megafunction, LPM_WIDTHD must be less than or equal to 64
Error: Can't elaborate inferred hierarchy "lpm_divide:Mod0"

Я полностью понимаю, что числа слишком велики для выполнения мода.Есть ли способ / библиотека / любая идея, как решить эту проблему?Я хотел бы избежать использования любого "цикла отвлечения" и быть максимально простым.VHDL - это не мой мир, и после академического проекта я с удовольствием от него откажусь: P

Приложение должно вычислять инверсию по модулю.Поскольку я не являюсь мастером из VHDL, я пытался сделать это, используя быстрый powerg + мод alghoritm.Приложение может отстой, оно просто должно работать: d

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use IEEE.std_logic_unsigned.all;
library altera;
use altera.altera_primitives_components.all;

entity inwersja is
    port(
        a: in unsigned(114 downto 0);
        clk: in std_logic;
        start: in std_logic;
        reset: in std_logic;
        c: out unsigned(114 downto 0);
        ready: out std_logic);
    end inwersja;


architecture i1 of inwersja is
    begin
    process(clk)
        variable tempOutput : unsigned(114 downto 0) := "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
        variable temp : unsigned (114 downto 0):= a;
        variable modul: unsigned(114 downto 0) := "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101011";
        variable power: unsigned(114 downto 0) := "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101001";
        variable counter: integer := 0;
        begin
            if reset='1' then
                tempOutput := "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
                ready <= '0';
            elsif clk'event and clk='1' then
                if start='0' then
                    ready<='0';
                else
                    if (counter < 115) then
                        if (power(counter) /= '0') then
                            tempOutput := (tempOutput * temp) mod modul;
                        end if;
                        temp := (temp * temp) mod modul;

                        counter := counter + 1;
                    elsif (counter = 115) then
                        ready <= '1';
                    end if;
                end if;
            end if;
            c <= tempOutput;
    end process;
end i1;
...