【问题标题】:Using Generate in Vhdl在 Vhdl 中使用 Generate
【发布时间】:2014-11-20 15:27:47
【问题描述】:

我在 Vhdl 中有以下代码,现在我想将此信号 S1 有条件地重定向到输出端口,如果有人能指导我完成此操作,我将不胜感激。

Gen: for index in 0 to 4 generate

 signal s1 : ARRAY_TYPE; --- array of (0 to 7) std_logic_vector (7 downto 0);
 begin  
  process(CLK)
  begin
    if (rising_edge (CLK)) then
        S1(counter_index) <= S_in((index*8+7) downto (index*8));
      end if;  
    end  if;
  end process;
end generate Gen;

我知道我们可以在生成循环中使用进程,但也可以使用其他方法!如果我将 S1 声明为全局信号,它会抱怨连接到多驱动网络?这有什么不同?

如果有人能指导我完成这个,我将非常感激

【问题讨论】:

  • 尚不清楚您要做什么。部分问题可能是您使用counter_index 索引S1,这不是您的生成循环变量。
  • 非常感谢您的回复。我尝试将 32 位输入数据存储到我提到的 1Dx1D 数组类型的 Fifo。这个 Counter_index 是一个索引,它就像一个状态机控制的 write_pointer。请让我知道如果我仍然不清楚,我很乐意再次描述它。
  • 如果您在 for ... generate 循环中分配任何目标不是循环的本地对象、由循环变量索引或有条件地设置为仅循环变量的一个值 (if index=0 then ... ),您将遇到多个驱动程序问题。
  • 如果 S1(counter_index)std_logic_vectors 数组中的 8 位条目,并且您尝试存储 32 位输入,则需要在数组中使用 4 个连续点喜欢S1(counter_index*4 + index) &lt;= S_in((index*8+7) downto (index*8));。请注意,您将在 8 位数组中消耗 4 个点。根据您要执行的操作,最好使用 32 位向量数组。
  • 亲爱的 Quantumripple,非常感谢您的回答,如果我的理解正确,您的意思是因为我使用状态机(对于 .. gen 而言在此之外)来控制 counter_index,任何开箱即用(这个循环)会有类似的抱怨!!!

标签: vhdl hardware-design


【解决方案1】:

您的 for-generate 循环(从 0 到 4)将在细化时展开,因此您最终得到的实际上是(为简洁起见,省略了流程代码):

对于索引 = 0:

signal s1_0 : ARRAY_TYPE; --- array of (0 to 7) std_logic_vector (7 downto 0);

s1_0(counter_index) <= S_in(7 downto 0);

对于索引 = 1:

signal s1_1 : ARRAY_TYPE; --- array of (0 to 7) std_logic_vector (7 downto 0);

s1_1(counter_index) <= S_in(15 downto 8);

等等

您会得到“副本”,因为您在生成循环中声明了信号,每个信号都是该生成块的本地。当您尝试使s1“全局”(不是真正的全局,具有不同的内涵;只是为整个架构声明)时,您会得到:

对于索引 = 0:

s1(counter_index) <= S_in(7 downto 0);

对于索引 = 1:

s1(counter_index) <= S_in(15 downto 8);

看看那里发生了什么?这些语句是并发的,并且分配给相同的位。这就是为什么您在使用多个驱动程序时遇到问题的原因。

问题似乎是counter_index。正如 QuantumRipple 建议的那样,您需要将循环索引与其他索引的某种组合对 s1 进行索引,或者您需要创建一些中间信号或其他东西。

请注意,如果您一次处理一个字节的 32 位数据,您可能指的是0 to 3,而不是0 to 4

【讨论】:

  • 我什至没有注意到数组是在循环内声明的。我有一种感觉,这不是原始代码,因为如果它是 S1 数组,则不能在循环之外使用(从不读取它),我们从头到尾都显示了。
  • 不清楚,确切地说,因为代码不完整。我认为发布的代码可能是一个实验。无论哪种方式,您在一个进程中使用 for 循环的建议总体上可能会更好 - 我似乎记得偶尔在不同进程中分配数组的不同部分时遇到问题,我不记得确切原因。
【解决方案2】:

虽然 fru1tbat 涵盖了您的问题的解决方案,但我想涵盖您的其他问题:

我知道我们可以在生成循环中使用一个进程,但除此之外 周围也可以!

您也可以在流程语句中使用for ... loop。它的功能和展开类似于for... generate 语句,但在进程内部。它还可以通过使用变量或覆盖赋值来实现更复杂的逻辑。这是它的语法参考:http://www.ics.uci.edu/~jmoorkan/vhdlref/for_loop.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多