0

我对 vhdl 相当陌生,我正在努力了解是否可以将它用于项目。

我创建了一个项目来了解如何实现上拉电阻器并了解它们是如何工作的。我一定做错了什么。

我对电线的约束条目是

net "rx_i" PULLUP;
net "rx_i" loc="p88";

该项目的过程是

Process (clk_i)
 type state_type is (qInit, qZero, qZero1, qZero2, qZero3, qZero4);
 variable state: state_type:= qInit;

Begin
if (rising_edge(clk_i)) then
  case state is
    when qInit =>
      if (rx_i = '0') then
        led_o(0) <= '1';
        state := qZero;
      end if;

    when qZero =>
      if (rx_i = '0') then
        led_o(1) <= '1';
        state := qZero1;
      end if;

    when qZero1 =>
      if (rx_i = '0') then
        led_o(2) <= '1';
        state := qZero2;
      end if;

    when qZero2 =>
      if (rx_i = '0') then
        led_o(3) <= '1';
        state := qZero3;
      end if;

    when qZero3 =>
      if (rx_i = '0') then
        led_o(4) <= '1';
        state := qZero4;
      end if;

    when qZero4 =>
      if (rx_i = '0') then
        led_o(5) <= '1';
        state := qInit;
      end if;

    end case;

end if;

End Process;

所有 LED 的 0 到 5 都亮起。如果电线被拉得很高,我预计可能会出现一些虚假的 0,但不会连续出现 6 个。任何帮助,将不胜感激。

4

2 回答 2

1

首先:您永远不会将 LED 的值设置回“0”。在此状态机中将所有值设置为“1”后,您将继续驱动“1”。您可以led_o <= (others => '0');在案例陈述之前添加一行。

即便如此,您仍将以时钟的速度穿越各个州。您的 LED 将闪烁得如此之快,以至于您的眼睛只会将它们视为“开启”,但亮度会稍低。也许您可以在每个状态中添加一个计数器,或者检查另一个条件,例如按下按钮。

最后,您发布的代码没有显示任何引体向上。我只是假设您在代码的另一部分中使用它。我能看到的问题与引体向上无关。

于 2013-11-07T08:21:47.960 回答
1

您的约束文件仅在代码被合成并转换为要加载到 FPGA 的比特流时使用。它与模拟无关。在模拟中,您可以通过将“H”(高)驱动到信号上来创建上拉电阻。

如果您希望 led_o 成为被拉起的信号,您可以这样做:

led_o <= 'H';
led_o <= LED_DRIVE;

因此,当 LED_DRIVE 为高阻抗 (Z) 时,上拉电阻将接管并将信号拉高。这就是实现双向接口(如 I2C)的方式。但我想现在我已经超越了你的头脑。这里的教程展示了如何创建一个简单的 LED 闪光灯: http: //www.nandland.com/vhdl/tutorials/tutorial-your-first-vhdl-program-part1.html

于 2013-11-07T13:16:13.867 回答