Проблемы преобразования поведения в структурные VHDL

Я разработал тест на простоту для алгоритма Рабина Миллера в поведенческом типе. Я использовал функции для создания своих модулей. К сожалению, когда я попытался синтезировать его своим Altera Kit через Quartus, я понял, что функция не синтезируется. Здесь я напишу всю свою программу, и мне очень нужна ваша помощь, чтобы дать мне хотя бы некоторые подсказки, чтобы изменить ее на структурную, так как это мой старший дизайн-проект. Вот моя программа:

 library ieee;
 use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;

 entity PrimeTest is
 port( N: in integer;
 Test1 : out std_logic);
 end PrimeTest;  

  Architecture Behavior1 of PrimeTest is


  function integer_binary (b1:std_logic_vector(31 downto 0)) return integer is
  variable a: integer:=0;
  variable i: integer;
   begin
    i:=0;

     while (i<32) loop
if b1(i) = '1' then
a:=a+2**i; 
end if;
i:=i+1;   
end loop;
     return a;
    end integer_binary;

       function integer_binary1 (b1:std_logic) return integer is
        variable a: integer;

       begin
if b1 = '1' then
a:= 1; 
else
  a:=0;
end if;
     return a;
     end integer_binary1;

     function binary1 (int1:integer) return std_logic_vector is
     variable int2: integer;
     variable a:std_logic_vector(31 downto 0);
  variable i: integer;

   begin
   int2:=int1;
  i:=0;
 while (i<32) loop    
  if (int2 mod 2 = 0) then
    a(i):='0';
  else
    a(i):='1';
  end if;
  i:=i+1;
    int2:=int2/2;
  end loop;
  return a;
  end binary1;

 function mul_mod (x1,y1,m1: std_logic_vector (31 downto 0)) return std_logic_vector is
variable p1: std_logic_vector (31 downto 0);
variable k: integer;
variable n: integer;
variable i: integer;
 variable j: std_logic_vector (31 downto 0);
 begin
n:=32;
i:=31;
p1:="00000000000000000000000000000000";
while(i>=0) loop

  p1:=binary1((integer_binary(p1))*2);

j:=binary1((integer_binary(y1))*((integer_binary1 (x1(i)))));

p1:=binary1((integer_binary(p1))+((integer_binary (j))));

if (p1 >= m1) then
  p1:=binary1(((integer_binary(p1))-(integer_binary (m1))));
end if;

    if (p1 >= m1) then
  p1:=binary1(((integer_binary(p1))-(integer_binary (m1))));
end if;
i:=i-1; 

end loop;
return p1;
end mul_mod;



 FUNCTION modexp3 (exp_m,exp_n: integer; 
                      exp_e: std_logic_vector(31 downto 0)) return integer is 
                 variable s:integer; 
                  variable result: integer:=1;
                        begin
    S := exp_m;

   L1: for I in 0 to 31 loop

    I2:    if (exp_e(I) = '1') then
        result := integer_binary(mul_mod(binary1(result),binary1(s),binary1(exp_n)));
       S := integer_binary(mul_mod(binary1(s),binary1(s),binary1(exp_n)));
   else
       S := integer_binary(mul_mod(binary1(s),binary1(s),binary1(exp_n)));
   end if I2;

    end loop L1 ;
    return result; 
  end modexp3;


 FUNCTION park1 (in_seed1,max1: integer) return integer is 
                 variable hi:integer;
                 variable lo:integer; 
                  variable out_seed:integer;
                  variable test:integer;
                  variable random1: integer;
                   variable rejected: integer;
                   variable a:integer:=16807;
                  variable m:integer:=2147483647;
                  variable q: integer:=127773;
                  variable r: integer:=2836;
                  variable seed:integer;

                        begin
                          seed:=in_seed1;

              for en in 0 to 1 loop
                if (en = 0) then
                  hi:=in_seed1 / q;
                 else
                  hi:=out_seed / q;
               end if;

lo:=in_seed1 mod q;
test:=((a*lo) - (r*hi));

if test > 0 then
Out_seed:= test;

else
Out_seed:= test + m;

    end if;
  end loop;
 random1:=out_seed mod max1;
 if random1 = 0 then
   seed:=(seed-1)**2;
   random1:= park1(seed,max1);
 end if;
    return random1; 
  end park1;

-- Primality Test Function
Function IS_Prime(number: integer) return STD_Logic is
Variable d: integer;
Variable d_binary: std_logic_vector(31 downto 0);
Variable s_1: integer :=0;
Variable iteration: integer :=1;
Variable x: integer;
Variable a: integer;
variable two:std_logic_vector(31 downto 0):="00000000000000000000000000000010";
Variable fake: integer;


Begin
d:= number -1; 
if ( number < 2) then
Return '0';
end if;  
if ( number = 2) then
Return '1';
end if;
if ( number /= 2 and number mod 2 = 0) then
 return '0';
end if;
while ( d mod 2 = 0 ) loop 
d:=d/2;
s_1:=s_1+1;
end loop;
d_binary:=binary1(d);
ii_loop: for ii in 0 to iteration-1 loop
a:=park1((ii+(s_1*100000))+number,(number-2));
x:=modexp3 (a,number,d_binary);
z4: if ((x /= 1) and (x /= number -1)) then 
 R_LOOP:         for r in 0 to s_1-1 loop
        fake:=0;
        x:=modexp3(x,number,two);
            z0: if (x = number -1) then
                fake:=1;
                 exit R_LOOP when fake = 1;
            end if z0;
            z1: if (x = 1) then 
                    return '0';
                end if z1;
    end loop R_LOOP;

        z2: if (fake/=1) then
            return '0'; 
        end if z2;

end if z4;
end loop ii_loop;
return '1';
End IS_Prime;
Begin

Test1 <= IS_Prime(N);


end Behavior1;

Я новичок в VHDL, и это действительно сбивает меня с толку, когда у меня нет прогресса в моем проекте. Пожалуйста, мне нужно, чтобы эта программа была структурного типа (сопоставление портов).


person user3300910    schedule 26.02.2014    source источник
comment
ИМО, ваша проблема более фундаментальна. Вы думаете и пишете программное обеспечение, но для синтеза вам нужно написать аппаратное обеспечение. Например, цикл while в программном обеспечении обычно превращается в конечный автомат в аппаратном обеспечении. Учитывая, что Рабин Миллер в программном обеспечении распространен, вы почти просите кого-нибудь сделать ваш проект за вас.   -  person Jerry Coffin    schedule 26.02.2014
comment
Нет, братан, я этого не делаю. Мой проект намного тяжелее этого. Это криптосистема RSA. Итак, это небольшая часть моей программы, и я уверен, что если вы мне поможете, я справлюсь. Я просто хочу понять, как играть со структурой. Затем я могу сделать свою собственную программу и завершить свой проект. Спасибо ^_^   -  person user3300910    schedule 26.02.2014
comment
Функции, безусловно, могут быть синтезированы большинством инструментов синтеза, если они написаны с учетом ограничений генерации аппаратного обеспечения. Одно правило: избегайте циклов while; for циклы с фиксированными границами должны быть в порядке.   -  person user_1818839    schedule 26.02.2014


Ответы (1)


Вы просили подсказки, поэтому я просто напишу некоторые вещи, которые приходят на ум при просмотре вашего кода, в надежде, что это будет полезно.

  • Нет проблем с использованием функций; это хороший способ организовать ваш дизайн. Их можно синтезировать, если операторы, которые вы используете в теле функции, также могут быть синтезированы.
  • Не изобретайте велосипед. Большинство написанных вами функций уже предопределены в стандартных библиотеках. Перед реализацией проведите небольшое исследование и подумайте, является ли это обычной подпрограммой, которая будет полезна большинству дизайнеров. Если это так, вероятно, есть готовое решение, особенно если оно связано с преобразованием типов или математикой.
  • Как сказал Брайан Драммонд, старайтесь избегать циклов while, потому что компилятору сложнее угадать общее количество итераций. for лупы с постоянными лимитами проще на синтезаторе. И забудьте о вложенных циклах с переменными диапазонами.
  • Джерри Коффин также прав, когда говорит, что может быть некоторая путаница между тем, как вы реализуете алгоритм на аппаратном и программном уровне. В большинстве случаев рисование аппаратной схемы перед написанием кода помогает разобраться во всем. Во многих случаях это, по крайней мере, показывает, что разработчик не очень хорошо представляет себе, что нужно для аппаратной реализации алгоритма.
  • You want to make the transition from software to hardware. A big part of it is to decide what you need to do instantly (within a single clock cycle), and what you want to do sequentially (spread over several clock cycles). So, suppose you have some behavioral (non-synthesizable) code that calculates something using a loop, and you want to make this calculation in hardware.
    • If you need to calculate it in a syngle clock cycle, the compiler will have replicate the hardware for all loop iterations, which might be huge.
    • Если вы можете распределить вычисление на несколько тактов, лучше всего разработать конечный автомат (FSM) для этого вычисления. Опять же, перед написанием кода нарисуйте схему, это очень поможет в вашем случае.

Надеюсь, это поможет указать вам правильное направление.

person rick    schedule 27.02.2014
comment
Я очень ценю вашу помощь, но ваша помощь заключалась не в том, чтобы преобразовать мой код в структурный. Я должен справиться с этим): - person user3300910; 27.02.2014
comment
Не могли бы вы объяснить более подробно, что вы называете структурным кодом? Если под структурой вы подразумеваете код, который не использует ничего, кроме экземпляров компонентов, то это действительно не имеет особого смысла как требование, особенно для старшего дизайнерского проекта. Возможно, обсуждение должно быть о синтезируемом и несинтезируемом коде. - person rick; 27.02.2014