VHDL变量Vs. 信号

dod*_*ddy 33 vhdl

我一直在阅读关于VHDL编程的文本(不要在前面,所以不能给出标题).我从文本中很难理解的一个问题是何时使用变量与信号.我想我已经清楚地了解何时使用信号(内部信号),而不是变量.

我注意到文本通常在定义一个进程之前声明并初始化信号,而一个变量在一个进程内被声明(我猜它从未初始化..).

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

SIM*_*MEL 40

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

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;
Run Code Online (Sandbox Code Playgroud)

将在流程运行之前加入ba,而不是'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;
Run Code Online (Sandbox Code Playgroud)

将值'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 =>
            --...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你们俩!我选择了 LLya 的答案,因为答案明确指出变量**仅**存在于序列化代码的过程中。看起来你们俩都在说同样的事情,但对我来说,“仅”这个关键词让它更清楚一点。 (3认同)

小智 12

变量旨在用于在进程内存储值.因此它的范围是有限的.与合成硬件的关系往往不那么直接.

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

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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)

这是因为更新已安排,但尚未实际更改.的<= 包括时间元素.


小智 7

变量:临时位置; 它们用于在"过程"中存储中间值.

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

区别:

变量:它们是本地的; 没有延迟; 在流程中声明

信号:它们是全球性的(开始之前); 由于电线延迟; 在关键词开始之前宣布