我有一个关于陌生行为的问题,
之间的区别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仍然具有旧值。