首页 文章

无法确定VHDL中的信号值

提问于
浏览
0

我目前正处于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一样,我找不到任何可以指向正确方向的在线状态 .

在这一点上,我已经尝试了一切,以确定实际值是什么,包括用“11111111”,“UUUUUUUU”,“ZZZZZZZZ”,“XXXXXXXX”替换“00000000”,所有这些仍然可以通过 .

我也尝试过:

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两周,所以我很可能错过了一些非常基础的东西 . 另外,我对ModelSIM的技能并不完全自信,也不确定如何将我看到的代码问题转化为代码 .

任何帮助将不胜感激 . 如果您需要查看代码,请告诉我,我很乐意发布所需的任何内容 . 我只是没有全力以赴,因为有一个相当冗长的状态机控制LCD,这与这篇文章无关 .

此外,我应该提到以下代码按预期工作,但此代码的问题是它将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

    您的测试将使用 bit_vector ,因为每个位将采用 '0' 值或 '1' 值 . 所以, /= "00000000" 的意思是:至少有一位是 '1' . 但是当您使用 std_logic_vector 时,每个位可以采用9个不同的值( std_logic 是9值枚举类型) . 所以 /= "00000000" 并不意味着至少有一位是 '1' . 这可能意味着一位设置为 'U' 或与 '0' 不同的任何其他值 . 在模拟开始时 signal_in"UUUUUUUU 初始化“( U 代表 Uninitialized ) . relative_time_enable'0' 初始化,因为你就这样声明了 . 所以你的测试在 clk_1MHz_enable 的第一个上升沿传递, relative_time_enable 几乎立刻被卡在 '1' .

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

    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;
    

相关问题