我是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个。任何帮助都将不胜感激。
发布于 2013-11-07 16:21:48
第一:永远不要将leds的值设置回'0‘。一旦你在这个状态机中将所有的值都设置为'1‘,你就可以继续驱动'1’。您可以在case语句之前添加像led_o <= (others => '0');这样的行。
即使到那时,你也会以时钟的速度运行这些状态。你的leds将闪烁得如此之快,以至于你的眼睛只能看到它们是“亮”的,但亮度略有下降。也许您可以在每个状态中添加一个计数器,或者检查另一个条件,如按下按钮。
最后,您发布的代码没有显示任何上拉。我只是假设您在代码的另一部分中使用了它。我能看到的问题与引体向上没有任何关系。
发布于 2013-11-07 21:16:14
仅当代码被合成并转换为要加载到FPGA上的位流时,才会使用约束文件。这与模拟没有任何关系。在模拟中,您可以通过在信号上驱动'H‘(高)来创建上拉。
如果你想让led_o成为一个信号,你可以这样做:
led_o <= 'H';
led_o <= LED_DRIVE;因此,当LED_DRIVE为高阻抗(Z)时,上拉将接管并将信号拉高。这就是实现双向接口的方式,比如I2C。但我想现在我已经超越了你的理解。这里的教程展示了如何创建一个简单的发光二极管闪光灯:http://www.nandland.com/vhdl/tutorials/tutorial-your-first-vhdl-program-part1.html
https://stackoverflow.com/questions/19829027
复制相似问题