1

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

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

4

2 回答 2

2

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

于 2014-11-20T16:03:00.567 回答
0

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

我知道我们可以在生成循环中使用一个进程,但其他方式也是可能的!

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

于 2014-11-20T16:27:06.390 回答