我是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。任何帮助将不胜感激。
答案 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