如何使while循环,没有明确的界限,可合成?

时间:2017-01-24 07:21:40

标签: while-loop vhdl synthesis

我有这部分代码不能合成,因为循环执行的次数不确定。我是VHDL的初学者,如何将其转换为可合成的形式? 注意:我也尝试使用for循环,以及break语句,但由于break语句,它仍然无法合成。 下面的代码是计算ee的值,使得ee和Phi的最大公约数为1。

 library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity gcd11 is
Port ( ee : out integer;
       Phi : in integer);
       --gc : out integer);
end gcd11;

architecture Behavioral of gcd11 is
signal rem1,dd,dv,gc,temp: integer;
begin
process(temp,Phi,rem1,dd,dv,gc)
begin
gc<=2;
temp<=1;
while(gc/=1) loop
   temp<=temp+1;
   rem1<=1;
   if (temp<Phi)then
       dd<=Phi;
       dv<=temp;
       elsif(temp>=Phi) then
       dd<=temp;
       dv<=Phi;
   end if;
   while(rem1/=0) loop
       rem1<= dd mod dv;
       dd<=dv;
       gc<=dv;
       dv<=rem1;
   end loop;
end loop;
ee<=temp;
end process;
end Behavioral;

1 个答案:

答案 0 :(得分:1)

首先,我将首先阅读有关VHDL的书籍,因为硬件设计与软件设计截然不同。

除了那个不允许你合成的3个主要内容之外:

<强>环: 重要的是要理解VHDL循环不会像软件循环那样迭代,而是在综合过程中展开,结果逻辑(所有迭代)将作为并行硬件块运行

意思是如果你有一个运行8次的for循环,那么所描述的电路将被实例化8次。以下循环将创建8个并行&#34; AND&#34;每个门从总线A取1位输入,从信号B取1位。

for I in 0 to 7 loop
    Z(I) <= A(I) and B;
end loop;

这意味着,在您开始逻辑综合的那一刻,需要知道循环的数量,因为在合成之后无法添加/删除硬件。

<强> MOD : 模数函数通常不适用于synthisis。只有你的操作数(输入)是固定的(合成器可以预先计算输出)或者你有一个类似于你的合成器下面的代码的语句将允许它。(mod的功率为2)

z <= y mod 2**x

信号声明: 在需要合成的VHDL中,您需要告诉工具&#34; large&#34; (读:信号有多少位)。通常的做法是不使用钝的整数声明,而是使用给定范围的整数的std_logic_vector类型。    信号x:std_logic_vector(31 downto 0);    信号y:整数范围1到31;