【问题标题】:Assigning values to signals within for-generate statements在 for-generate 语句中为信号赋值
【发布时间】:2019-04-25 12:08:07
【问题描述】:

我不明白为什么以下示例中“sig2”的信号分配不会成功,而“sig1”却可以。随着时钟上升沿“sig2”变为“X”!

是什么原因?

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity Test_tb is
end entity Test_tb;

architecture Structural of Test_tb is

    signal sig1 : std_logic_vector (3 downto 0) := (others => '0');
    signal sig2 : std_logic_vector (7 downto 0) := (others => '0');
    signal clk : std_logic := '0';

begin
    clk_generate: process is
    begin
        wait for 5 ns;
        clk <= not clk;        
    end process clk_generate;

    gen_label : for gen_indx in 0 to 3 generate
    begin
        process (clk) is 
        begin
            if clk = '1' and clk'event then
                sig1 (gen_indx) <= '1';
                for loop_indx in 0 to 1 loop
                    sig2 (gen_indx * 2 + loop_indx) <= '1';
                end loop;
            end if; 
        end process;
    end generate gen_label;

end architecture Structural;

【问题讨论】:

  • 这个问题不是minimal reproducible example,使读者无法轻易复制问题或验证任何答案。一个简单的解决方案是将循环语句替换为sig2(gen_indx * 2 + 1 downto gen_indx * 2) &lt;= (others =&gt; '1');。问题是在细化设计层次结构期间用于识别驱动程序的最长静态前缀。循环参数是动态阐述的,原来最长的静态前缀是sig2。
  • @user1155120 感谢您的通知。我编辑了代码以立即验证。

标签: vhdl variable-assignment generate


【解决方案1】:

这是因为,当在 for 循环中分配信号时,假定驱动程序会影响数组(或记录)的所有元素。这是因为它无法在细化时计算出 for 循环的边界,因为它是一个运行时概念。这与生成循环不同,后者可以在细化时推断出边界。

因此,您需要从进程内部删除 for 循环,或者创建一个分配给外部 sig2 的生成循环的本地信号。例如:

gen_label : for gen_indx in 0 to 3 generate
  signal local_sig  : std_logic_vector(1 downto 0);
begin
    process (clk) is 
    begin
        if clk = '1' and clk'event then
            sig1 (gen_indx) <= '1';
            for loop_indx in 0 to 1 loop
                local_sig(loop_indx) <= '1';
            end loop;
        end if; 
    end process;

    sig2(gen_indx*2+1 downto gen_indx*2)  <= local_sig;
end generate gen_label; 

【讨论】:

  • 在细化过程中更准确地识别过程的驱动程序(IEEE Std 1076-2008 14.2)。这可能涉及局部静态表达式、全局静态表达式,但 最长静态前缀 (8.1) 不包括动态阐述的表达式 (14.6 动态阐述第 2 段"a) 使用 for 迭代方案执行循环语句……”)。原文中最长的静态前缀是 sig2 (gen_indx * 2 + loop_indx) 中的名称 sig2 和这里的 sig2(gen_indx*2+1 downto gen_indx*2),它只依赖于静态表达式。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2011-10-24
  • 2011-02-15
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多