我现在在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为全球信号,它会抱怨连接多驱动网络?这有什么不同?
如果有人可以指导我完成这件事,我将非常感激
答案 0 :(得分: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
。您需要使用您的循环索引与其他索引的某种组合来索引s1
,如QuantumRipple建议的那样,或者您需要创建一些中间信号,或者其他东西。
请注意,如果您一次处理一个字节的32位数据,则可能意味着0 to 3
,而不是0 to 4
。
答案 1 :(得分:0)
虽然fru1tbat涵盖了您的问题的解决方案,但我想介绍您的另一个问题:
我知道我们可以在generate循环中使用一个进程但是其他方面 周围也有可能!
您也可以在流程声明中使用for ... loop
。它与for... generate
语句类似地运行并展开,但在进程内部。它还可以通过使用变量或覆盖赋值来实现更复杂的逻辑。以下是它的语法参考:http://www.ics.uci.edu/~jmoorkan/vhdlref/for_loop.html