VHDL过程中的块if内部的值分配

时间:2015-08-20 22:16:50

标签: vhdl

我正在尝试用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;
  

注意:sig_sel a是:'0'
  注意:sig_sel b是:'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;
  

注意:sig_sel a是:'1'   注意:sig_sel b是:'1'

这对我来说很奇怪,因为我需要在分配sig_sel值之前进行一些检查。可能有什么不对?

1 个答案:

答案 0 :(得分:0)

在VHDL中,当进程结束时(或遇到等待语句),信号赋值生效。

因此,

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

只有在sig_sel "11"进入流程时才会触发if,而不是每次从计算机编程的角度来看都会触发。

它适用于code2的原因(我只能猜测,因为你没有提供所有相关数据)是代码被执行两次。第一次取消置位reset(将sig_sel设置为"11"),第二次将Data_in(0)置为'1'(触发if)。我希望你能得到以下输出:

  

注意:sig_sel a是:&#39; 0&#39;
  注意:sig_sel b是:&#39; 0&#39;
  注意:sig_sel a是:&#39; 1&#39;
  注意:sig_sel b是:&#39; 1&#39;
  注意:我是一个人