我的这部分代码是不可合成的,因为循环执行的次数不确定。我是 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;
首先,我会从阅读一本有关 VHDL 的书开始,因为硬件设计与软件设计有很大不同。
接下来的 3 个主要内容将不允许您合成:
循环: 重要的是要理解,VHDL 循环不会像软件循环那样迭代,而是在综合期间展开,并且生成的逻辑(所有迭代)将作为并行硬件块运行
这意味着如果您有一个将运行 8 次的 for 循环,则所描述的电路将被实例化 8 次。以下循环将创建 8 个并行“AND”门,每个门从总线 A 获取 1 位输入,从信号 B 获取 1 位。
for I in 0 to 7 loop
Z(I) <= A(I) and B;
end loop;
这意味着在开始逻辑综合时需要知道循环数量,因为综合后无法添加/删除硬件。
模组: 模函数通常不适合综合。仅当您的操作数(输入)是固定的(合成器可以预先计算输出)或者您有一个类似于合成器下面的代码的语句时才允许它。(mod 为 2 的幂)
z <= y mod 2**x
信号声明: 在需要合成的 VHDL 中,您需要告诉工具信号有多大(读作:有多少位)。通常的做法是不使用直白的整数声明,而是使用给定范围的整数的 std_logic_vector 类型。 信号 x : std_logic_vector(31 降到 0); 信号 y :整数范围 1 到 31;
您的预期行为需要几个步骤(时钟周期),这需要一个复杂的机制。正如您所写的那样,您的设计被认为是“行为”,并且需要“行为综合”,也称为 HLS(高级综合)。 不幸的是,我相信现在已经没有更多的 VHDL 行为合成器了。您被迫依赖 RTL 编码规则。我猜你刚刚进入硬件地狱......