【问题标题】:For loop equivalent RTL descriptionFor 循环等效 RTL 描述
【发布时间】:2025-12-20 18:40:11
【问题描述】:

来自软件背景,我仍然很难想到硬件。 什么是 RTL 语言(VHDL 或 Verilog)中的 for 循环的等价物?我想我需要一个寄存器来构建一个计数器,以及一个用于分支的多路复用器,是吗?

【问题讨论】:

  • 在 VHDL 中,带有 for 迭代方案和静态循环参数规范的循环语句是符合综合条件的。循环语句表示为重复 0 次或更多次的语句序列,循环参数设置为每个离散的迭代值。也许您应该展示一个您正在尝试解决的问题和一个实际错误?
  • verilog 也有 'for' 循环,但对可合成性有一些限制。你需要说明我们真正的问题。
  • “我想我需要...” 不。另外看看here,VHDL 中有两个嵌套循环。

标签: vhdl verilog register-transfer-level


【解决方案1】:

VHDL process 或 Verilog 总是阻塞模拟一点硬件的一点点软件。进程有一个敏感度列表:这是输入列表。如果其中任何一个发生变化,那么进程(即一点点软件)将执行并且进程的输出(由该进程驱动的任何信号)得到( s) 分配。

对于组合逻辑,任何输入总是导致相同的输出,因此您可以编写一个真值表。您的一点点软件正在描述真值表。您可以使用 case 语句 来做到这一点,但这对于大量输入来说是不切实际的。取而代之的是,我们使用了一些其他软件风格的结构,例如 if 语句循环算术运算符 等等。 逻辑合成器的目的是设计一个小硬件,其行为方式与您的小软件完全相同。在此过程中,逻辑合成器可以评估您的一点点软件以确定它的真值表,然后可以基于此设计它的一点点硬件。但是,真正的逻辑合成器会使用多种技术来实现相同的目标。

所以,如果你在你的进程中放置一个for循环,如果你的一点点软件包含一个循环,那么你只会得到一个块组合逻辑。 for 循环 将确定该块的行为。由于 for 循环 的性质(以及您的逻辑合成器可能设计其少量硬件 的方式),该组合逻辑可能包含重复结构。当您考虑如何实现该模块时,这可能很重要,尤其是在 FPGA 上。关于通过块的延迟可能很重要。然而,最重要的是它将是一个组合逻辑块。

【讨论】:

  • 这确实是一条评论,但是太长了。
【解决方案2】:

首先要意识到,HDL 语言有两种不同的面貌。

  • 您在模拟中看到的那个。
  • 合成后的那个你。

在模拟中,for 循环与大多数语言中的相同:for 循环中的指令会执行多次。

要将循环转换为逻辑(因此用于综合),第一个要求是在编译期间必须知道循环大小。因此,您可以从0 to a_const 循环。但是你不能从0 to variable_whos_value_can_change 循环。

从那里开始,for 循环变得简单:重复在 for 循环中实现的任何逻辑。

因此for (i=0; i<4; i=i+1) A[i] = B[i] + C[i] 产生了 4 个加法器。所有这些都是并行运行的。

always @( * ) 
begin
   max = c[0];
   for (n=1; n<10; n++)
     if (c[n]>max) max = c[n];
end

这构成了一个组合逻辑块,其中输入了 10 个 c 值,并且在输出 max 处等于最大的 c。请注意,不涉及任何寄存器或时钟。

【讨论】:

  • 我明白了。我想我必须就我的问题提供更多细节。我正在使用凿子构建矩阵乘法器。一开始,我只是实现了矩阵乘法器算法,但人们告诉我不应该那样做。为什么 ?因为我不能在循环内部进行乘法和加法,否则会生成大量逻辑门来在一个循环中执行操作。所以我要做的就是将代码分成不同的块(累加器,乘法器......),我应该将它们连接在一起。我想知道我是否还必须使用我的 for 循环来计算索引:/
  • 换句话说,for 循环用于生成 X 个单元格,而不是执行 X 次操作,不是吗?
  • 是的,那些 X 单元可以是 X 次组合逻辑,但您也可以这样生成 X 寄存器。 “不执行 X 次操作” 这是一个命名问题。您确实有效地执行操作 X 次,但使用 X 个单独的逻辑块,而不是使用一个逻辑块 X 次。
  • 那么你如何使用这个逻辑块 X 次,你是否必须实现计数器,跟踪寄存器中的索引等...?