如何制作没有明确界限的可综合的 while 循环?

问题描述 投票:0回答:2

我的这部分代码是不可合成的,因为循环执行的次数不确定。我是 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;
while-loop vhdl synthesis
2个回答
1
投票

首先,我会从阅读一本有关 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;


0
投票

您的预期行为需要几个步骤(时钟周期),这需要一个复杂的机制。正如您所写的那样,您的设计被认为是“行为”,并且需要“行为综合”,也称为 HLS(高级综合)。 不幸的是,我相信现在已经没有更多的 VHDL 行为合成器了。您被迫依赖 RTL 编码规则。我猜你刚刚进入硬件地狱......

© www.soinside.com 2019 - 2024. All rights reserved.