【问题标题】:VHDL Variable Vs. SignalVHDL 变量信号
【发布时间】:2013-03-07 07:35:28
【问题描述】:

我一直在阅读有关 VHDL 编程的文本(前面没有,所以无法给出标题)。我一直很难从文本中理解的一个问题是何时使用变量与信号。我想我对何时使用信号(即内部信号)有一个清晰的了解,但对于变量而言却没有那么多。

我确实注意到,文本通常在定义进程之前声明和初始化信号,而变量是在进程内部声明的(我猜从未初始化......)。

无论如何,无论是通过定义还是通过示例来清除它都会很棒!

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    变量 - 它们是进程的本地变量,一旦变量获得新值,它们的值就会更新。

    共享变量 - 类似于变量,但它们可以从不同的进程中访问。

    信号-它们的范围更大,每个进程都可以访问架构中声明的信号或特定块(如果有)。进程挂起或遇到等待语句后有值更新。

    【讨论】:

    • 随着 VHDL-2000/2002 更新,共享变量不允许与常规类型一起使用。相反,它们只能与受保护的类型一起使用。受保护的类型不允许赋值。因此,共享变量更像是对象的句柄,而不是变量。
    【解决方案2】:

    与普通并行代码不同,当您想要创建序列化代码时使用变量。 (序列化意味着命令按顺序执行,一个接一个而不是一起执行)。变量只能存在于进程内部,值的赋值不是并行的。例如,考虑以下代码:

    signal a,b : std_logic_vector(0 to 4);
    
    process (CLK)
        begin
            if (rising_edge(clk)) then
                a <= '11111';
                b <= a;
            end if;
    end process;
    

    将在进程运行之前将a 的值放入b,而不是'11111'。另一方面,代码:

    signal a,b : std_logic_vector(0 to 4);
    
    process (CLK)
        variable var : std_logic_vector(0 to 4);
        begin 
            if (rising_edge(clk)) then
                var := '11111';
                a <= var;
                b <= var;
            end if;
    end process;
    

    会将值'11111' 放入ab

    坦率地说,根据我的经验,大多数时候你不需要使用变量,我唯一使用它的地方是在一个循环中,我需要检查多个信号中的任何一个是否为 1:

    type    BitArray        is array (natural range <>) of std_logic;
    
    --...
    
    entity CAU_FARM is
        port
            (
                --   IN   --
                  REQUEST         : in BitArray(0 to (FLOW_num -1));
                  --..
            );
    end CAU_FARM;
    --...
    
    farm_proc: process(CLK_FARM, RESET)
        variable request_was_made_var : std_logic;
        begin
        if RESET = C_INIT then 
           -- ...
    
        elsif rising_edge(CLK_FARM) then
    
                -- read state machine --
            case read_state is
                when        st_read_idle =>
    
                    request_was_made_var := '0';
                    for i in 0 to (FLOW_num -1) loop
                        if (REQUEST(i) = '1') then
                            request_was_made_var := '1';
                        end if;
                    end loop;
                    if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then
                        read_state <= st_read_stage_1;
                        for i in 0 to (FLOW_num -1) loop
                            if (i = choice_out_sig) then
                                ACKNOWLEDGE(i) <= '1';
                            end if;
                        end loop;
                    else
                        read_state <= st_read_idle;
                    end if;
                ------------------------
                when        st_read_stage_1 =>
                --...
    

    【讨论】:

    • 谢谢你们!我选择了 LLya 的答案,因为答案明确表示变量 only 存在于序列化代码的进程中。似乎你们俩都在说同样的话,但对我来说,“仅”这个关键词让它更清楚了一点。
    【解决方案3】:

    变量:临时位置;它们用于在“进程”中存储中间值。

    信号:更新信号值。运行由信号变化激活的进程。当进程运行时,系统中的所有信号保持不变。

    区别:

    变量:它们是局部的;没有延迟;在进程内声明

    信号:它们是全局的(在开始之前);因电线延迟;在关键字开始之前声明

    【讨论】:

      【解决方案4】:

      顺便说一句,变量不仅可以存在于进程中(还可以存在于例如过程中),此外,它们可以是可从多个进程访问的共享变量(请参阅:http://www.ics.uci.edu/~jmoorkan/vhdlref/var_dec.html)。

      【讨论】:

        【解决方案5】:

        变量旨在用于在流程中存储值。因此它的范围是有限的。与合成硬件的关系往往不太直接。

        变量也会立即获得值,而信号则不会。以下两个过程具有相同的效果:

        signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
        
        process (CLK)
            Variable TEMP : STD_LOGIC_VECTOR(0 to 5);
            begin
                if (rising_edge(clk)) then
                    TEMP := IP;
                    IP <= NEXTP;
                    NEXTP <= TEMP(5) & TEMP(0 to 4);
                end if;
        end process;
        

        signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
        
        process (CLK)
        
            begin
                if (rising_edge(clk)) then
                    IP <= NEXTP;
                    NEXTP <= IP(5) & IP(0 to 4);
                end if;
        end process;
        

        这是因为更新已安排好,但实际上尚未更改。 &lt;= 包含一个时间元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多