在 Vhdl 中使用生成



我现在在 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 声明为全局信号,它会抱怨连接到多驱动网络?这有什么不同?

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

你的 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

虽然 fru1tbat 涵盖了您问题的解决方案,但我想涵盖您的另一个问题:

我知道我们可以在生成循环中使用一个进程,但另一种方式 周围也可以!

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

最新更新