如果 VHDL 进程中的块不起作用,则内部的值分配

Value assignment inside if block in a VHDL process not working

我正在尝试用 VHDL 实现一些东西。代码 1 输出错误,我不明白为什么。

process(Data_in, reset)
begin
  if(reset = '1') then
    sig_sel <= "00";
  elsif(reset = '0') then
    if(Data_in(0) = '1') then
      sig_sel <= "11";
      report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0));
      report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1));
      if(sig_sel = "11") then
        report "i am one and one";
      end if;
    end if;
  end if;
end process;

Note: sig_sel a is: '0'
Note: sig_sel b is: '0'

但是如果我在重置后删除或注释 if 语句(如下 - 代码 2),它会起作用!

process(Data_in, reset)
begin
  if(reset = '1') then
     sig_sel <= "00";
  elsif(reset = '0') then
    --if(Data_in(0) = '1') then
      sig_sel <= "11";
      report "sig_sel a is: " & STD_LOGIC'image(sig_sel(0));
      report "sig_sel b is: " & STD_LOGIC'image(sig_sel(1));
      if(sig_sel = "11") then
        report "i am one and one";
      end if;
    --end if;
  end if;
end process;

Note: sig_sel a is: '1'
Note: sig_sel b is: '1'

这对我来说很奇怪,因为在分配 sig_sel 值之前我需要做一些检查。有什么问题吗?

在VHDL中,对signal的赋值在进程结束(或者遇到wait语句)时生效。

因此,

sig_sel <= "11";
if sig_sel = "11" then

只有当 sig_sel"11" 时才会在进入进程时触发 if,而不是像您从计算机编程的角度所期望的那样每次都触发。

它对 code2 起作用的原因(我只能猜测,因为您没有提供所有相关数据)是代码被执行了两次。第一次 reset 无效(将 sig_sel 设置为 "11"),第二次 Data_in(0) 分配给 '1'(触发 if)。不过,我希望您能得到以下输出:

Note: sig_sel a is: '0'
Note: sig_sel b is: '0'
Note: sig_sel a is: '1'
Note: sig_sel b is: '1'
Note: i am one and one