VHDL如何工作变量



我有一个关于陌生行为的问题,

之间的区别
process(i_clk) 
variable s_sens_front :STD_LOGIC_VECTOR(1 downto 0):="00";
variable s_cons_prec : STD_LOGIC_VECTOR(9 downto 0):="0000000000";
    begin
    if rising_edge(i_clk) then
        if (s_sens_front = "01" or s_sens_front = "10") then
            s_consigne <= i_consigne;
            s_cons_prec := i_consigne;
        else
            s_consigne <= s_cons_prec;
        end if;
        s_sens_front := s_sens_front(0) & i_sens;
    end if;
end process;

process(i_clk) 
variable s_sens_front :STD_LOGIC_VECTOR(1 downto 0):="00";
variable s_cons_prec : STD_LOGIC_VECTOR(9 downto 0):="0000000000";
    begin
    if rising_edge(i_clk) then
        if (s_sens_front = "01" or s_sens_front = "10") then
            s_consigne <= i_consigne;
        else
            s_consigne <= s_cons_prec;
        end if;
        s_sens_front := s_sens_front(0) & i_sens;
        s_cons_prec := s_consigne;
    end if;
end process;

因为对我来说俩似乎完全一样...但是,如果S_Consigne比其他信号大,并且第一个工作正确,而不是第二个版本,则进行了测试。

周围的代码是

process(i_clk) 
variable s_H_prec :STD_LOGIC; 
    begin
    if rising_edge(i_clk) then
            if (i_triangle >= s_consigne) then
                s_H <='0';
            else
                s_H <= '1';
            end if;
    s_H_prec := S_H;
    end if;
end process;

i_triangle和i_sens在这里制作

process(i_clk)
variable s_triangle                 : unsigned (9 downto 0):="1000000000";
variable s_triangle_temp        : unsigned (9 downto 0):="1000000000";
variable s_sens_temp        : std_logic;
variable s_ratio_max        : unsigned (9 downto 0):="1111111111";
variable s_sens                 : std_logic; -- Signal qui indique si le triangle doit monter ou descendre
    begin

    if rising_edge(i_clk) then
        if i_reset_n = '0' then -- quand reset on remet tout au valeur du début
            s_sens := i_sens;
            s_triangle := i_init;--valeur du triangle qui va évolué
            s_triangle_temp := i_init;--valeur du triangle du début mémorisé
            s_sens_temp := i_sens;--valeur du sens mémorisé
        else
            if (s_triangle_temp = s_triangle and s_sens = s_sens_temp) then -- si on a fait une période compléte
                                                            -- on donne la nouvelle valeur si elle existe
                if (i_sens = '1') then
                    s_triangle := i_init + 1;
                else
                    s_triangle := i_init -1;
                end if;
                s_sens := i_sens;
                s_triangle_temp := i_init;--valeur du triangle du début mémorisé
                s_sens_temp := i_sens;--valeur du sens mémorisé
            else 
                if s_triangle >= s_ratio_max then --si le compteur est plus grand ou égal au max alors
                    s_sens := '0';              -- on indique qu'il faut décompter
                    s_triangle := s_ratio_max -1; -- on va à la valeur max -1
                elsif s_triangle = "0000000000" then
                    s_sens := '1';
                    s_triangle := "0000000001";
                    s_ratio_max := i_ratio_max;-- on ne le prend que quand on est au minimum
                elsif s_sens = '1' then
                    s_triangle := s_triangle + 1;
                else
                    s_triangle := s_triangle - 1;
                end if;
            end if;
        end if;
        o_sens <= s_sens;
        o_triangle <= s_triangle;
    end if;
end process;

i_init和i_sens是可变的,我用vjtag和gui

更改

和S_H的输出进入此处

process(i_clk) 
variable s_compteurH: UNSIGNED (9 downto 0) := "0000000000";
variable s_compteurL: UNSIGNED (9 downto 0) := "0000000000";
variable S_H            : STD_LOGIC;
variable S_L        : STD_LOGIC;
    begin
        if rising_edge(i_clk) then
            if (i_reset_n = '0') then
                O_L <= '0';
                O_H <= '0';
            else

                if (i_h = '0') then
                    S_H := '0';
                    s_compteurH := "0000000000";
                    if (s_compteurL >= i_retard) then
                        S_L := '1';
                    else
                        s_compteurL := s_compteurL +1;
                    end if;

                else
                    S_L := '0';
                    s_compteurL := "0000000000";
                    if (s_compteurH >= i_retard) then
                        S_H := '1';
                    else
                        s_compteurH := s_compteurH +1 ;
                    end if;
                end if;
            end if;
            o_H <= S_H;
            o_L <= S_L;
        end if;
end process;

我在示波器上看到O_H和O_L。在两种情况下,行为是不同的,我知道我理解,谢谢Staszek 问题是,在过程中,要发出信号的最后一个分配确实发生了,并且在过程完成后将出现新值。这与变量不同,分配立即发生。因此,在s_cons_prec中:= s_consigne;S_Consigne仍然具有旧值。

好吧,这不是很好的问题,没有最小的完整可验证的例子,但是我想,您不知道信号是如何工作的。问题是,在过程中,要发出信号的最后一个分配确实发生了,并且在过程完成后将出现新值。这与变量不同,分配立即发生。因此,在s_cons_prec := s_consigne;中,S_Consigne仍然具有旧值。

最新更新