VHDL上拉电阻器

时间:2013-11-07 06:00:35

标签: vhdl

我是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;

所有领先的0到5点亮了。如果线被拉高,我可能会想到一些假的0但不是连续的6。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

即使这样,你也会以时钟的速度奔跑。你的指示灯会闪烁得太快,以至于你的眼睛只是看到它们“开启”,但略微不那么明亮。也许你可以在每个状态下添加一个计数器,或检查另一个条件,如按下按钮。

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

答案 1 :(得分: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