我有这部分代码不能合成,因为循环执行的次数不确定。我是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;
答案 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;