我现在在 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