无法确定VHDL中的信号值

时间:2016-08-04 01:57:01

标签: vhdl

我目前正处于12小时的调试阶段,在我的生命中,我不能通过这个驼峰。

我的代码设置方式,我有一个8位std_logic_vector映射到DE2-115板上的8个开关。每个位都与相对开关(0或1)激活的逻辑电平相反。

目标是让电路板等待8个开关中的任何一个在启动定时器之前被激活。当信号relative_time_enable设置为逻辑状态1时,将激活此信号。一旦信号设置为1,它将最终永远不会重置为0.此变量初始化如下所示:

signal relative_time_enable          : STD_LOGIC := '0';
signal signal_in                     : STD_LOGIC_VECTOR(7 downto 0);

signal_in被映射到' in'在我的实体中声明的端口,或者更确切地说,反之亦然。然而据说,signal_in与交换机相互矛盾。这是我现在的代码。

process(clk_1MHz_enable, signal_in)     
begin
    if(clk_1MHz_enable = '1') then

            if(relative_time_enable = '0') and (signal_in /= "00000000")then
                    relative_time_enable <= '1';
            end if;
    end if;
end process;

我相信我已经将问题推断为if语句总是如此。几乎就像signal_in在第一个周期内经历了多个状态,导致值立即设置为1,我无法在网上找到可以指向正确方向的任何内容。

此时,我已经尝试了一切,以确定实际值是什么,包括替换&#34; 00000000&#34;与&#34; 11111111&#34;,&#34; UUUUUUUU&#34;,&#34; ZZZZZZZZ&#34;,&#34; XXXXXXXX&#34;他们所有人都还能度过难关。

我也尝试过:

process(clk_1MHz_enable, signal_in)     
begin
    if(clk_1MHz_enable = '1') then

            if(relative_time_enable = '0') and (signal_in /= "00000000")then

                    for i in 0 to 7 loop
                            if(signal_in(i) = '1') then
                                    relative_time_enable <= '1';
                            end if;
                    end loop;

            end if;
    end if;
end process;

这种方法似乎应该“仔细检查”。但不知何故,它会在任何开关被激活之前不断通过并将值设置为1。此外,我在lCD上显示signal_in并在移动开关时发生变化,在启动时,所有内容都读取为00000000。

仅供参考:我只使用这个FPGA和VHDL工作了2周,所以我很可能错过了一些非常基础的东西。另外,我对自己在ModelSIM方面的技能并不完全自信,也不确定如何将我看到的问题转化为代码问题。

非常感谢任何帮助。如果您需要查看代码,请告诉我,我很乐意发布任何需要的内容。我只是没有全力以赴,因为有一个非常冗长的状态机来控制液晶显示器,这与这篇文章并不相关。

此外,我应该提到以下代码按预期工作,但此代码的问题是它将relative_time_enable重置为0,这是一个很大的不。我显示这个的唯一原因是因为它基本上等到开关处于激活状态之前才开始工作,但是一旦我关闭开关,时钟就会停止运行,这是一个问题。

process(clk_1MHz_enable, signal_in)     
begin
    if(clk_1MHz_enable = '1') then

            if(relative_time_enable = '0') and (signal_in /= "00000000")then
                    relative_time_enable <= '1';
            else
                    relative_time_enable <= '0';
            end if;
    end if;
end process;

1 个答案:

答案 0 :(得分:0)

您的测试适用于bit_vector,因为每个位都会采用'0'值或'1'值。所以,/= "00000000"的意思是:至少有一位是'1'。但是当您使用std_logic_vector时,每个位可以采用9个不同的值(std_logic是9值枚举类型)。所以/= "00000000"并不意味着至少有一位是'1'。这可能意味着一位设置为'U'或与'0'不同的任何其他值。在模拟开始时signal_in初始化为"UUUUUUUU&#34; (U代表未初始化)。 relative_time_enable初始化为'0',因为您已按此方式声明。因此,您的测试会在clk_1MHz_enable的第一个上升沿传递,relative_time_enable几乎立即停留在'1'

假设clk_1MHz_enable是一个时钟(奇怪的名字,但为什么不是),并且你想要一个边沿触发的D-flip-flop,下面的代码解决了这个问题:

process(clk_1MHz_enable)     
begin
  if clk_1MHz_enable = '1' and clk_1MHz_enable'event then
    for i in signal_in'range loop
      if signal_in(i) = '1' then
        relative_time_enable <= '1';
      end if;
    end loop;
  end if;
end process;

如果你想要一个电平触发的锁存器而不是一个边沿触发的D触发器:

process(clk_1MHz_enable, signal_in)
begin
  if clk_1MHz_enable = '1' then
    for in in signal_in'range loop
      if signal_in(i) = '1' then
        relative_time_enable <= '1';
      end if;
    end loop;
  end if;
end process;