首页 文章

VHDL变量Vs.信号

提问于
浏览
28

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

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

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

5 回答

  • -1

    变量:临时位置;它们用于存储"process"中的中间值 .

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

    Differences:

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

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

  • 34

    另一方面,变量不仅可以存在于进程中(还可以存在于过程中),而且它们可以是可从多个进程访问的共享变量(请参阅:http://www.ics.uci.edu/~jmoorkan/vhdlref/var_dec.html) .

  • 7

    变量 - 它们是进程的本地变量,只要变量获得新值,它们的值就会更新 .

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

    信号 - 它们的范围更大,每个进程都可以访问体系结构或特定块(如果有)中声明的信号 . 进程暂停或遇到wait语句后会有值更新 .

  • 1

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

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

    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;
    

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

  • 12

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

    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 =>
                --...
    

相关问题