我是VHDL编程的新手,目前尝试执行一个程序,其中FPGA板上的LED应该在发送我从Linux服务器生成的每10个以太网数据包后打开。我写的代码如下,不能正常工作。我正在试图找出问题但仍未完成。任何帮助将非常感激。
---------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
---------------------------------------------
entity notification is
port (clk, reset, qdv: in std_logic;
LED: out std_logic
);
end notification;
architecture behavior of notification is
signal qdv_a: std_logic;
signal qdv_b: std_logic;
signal packet_count: std_logic_vector (3 downto 0);
begin
no_1: process(clk, reset)
begin
if (reset = '1') then
qdv_a <= '0';
elsif rising_edge (clk) then
qdv_a <= qdv;
end if;
end process no_1;
qdv_b <= qdv and (not qdv_a);
no_2: process(clk, reset)
begin
if (reset = '1') then
packet_count <= "0000";
elsif rising_edge (clk) then
if qdv_b = '1' then
if packet_count < "1010" then
packet_count <= packet_count + 1;
LED <= '0';
else
LED <= '1';
packet_count <= (others => '0');
end if;
end if;
end if;
end process no_2;
end behavior;
答案 0 :(得分:2)
我根据你的代码做出假设:
1)每次在packet_count
上看到上升沿时,您都会尝试增加qdv
,
2)qdv
的脉冲宽度比25MHz时钟(clk_25MHz
)的周期长 - 40ns和
3)您想要异步重置。 (试图决定哪个更好 - 同步或异步复位 - 就像试图决定哪个更好 - Mac或PC。)
所以,
如果(1)和(2)为真,则需要同步边缘检测器:
signal qdv_d : std_logic;
signal qdv_r : std_logic;
...
process (clk_25MHz, reset)
begin
if reset = '1' then
qdv_d <= '0';
elsif rising_edge (clk_25MHz) then
qdv_d <= qdv;
end if;
end process;
qdv_r <= qdv and not qdv_d;
请将其绘制为原理图,以便了解其工作原理。
然后,假设(3),你需要整理你的主要过程。如果您正在编写顺序逻辑,则应该坚持使用模板。以下是具有异步复位的顺序逻辑模板,所有综合工具都应该理解:
process(clock, async_reset) -- nothing else should go in the sensitivity list
begin
-- never put anything here
if async_reset ='1' then -- or '0' for an active low reset
-- set/reset the flip-flops here
-- ie drive the signals to their initial values
elsif rising_edge(clock) then -- or falling_edge(clock)
-- put the synchronous stuff here
-- ie the stuff that happens on the rising or falling edge of the clock
end if;
-- never put anything here
end process;
只有时钟和复位进入灵敏度列表,因为顺序过程的输出(尽管它们取决于所有输入)仅在时钟和/或复位改变时才会改变。在真正的D型触发器上,复位优先于时钟,因此我们首先对其进行测试并重置应该复位。如果时钟发生了变化(当没有置位复位时)并且该变化是上升沿,则执行应该在时钟上升沿发生的所有事情(将被合成到驱动D输入的组合逻辑的东西)人字拖鞋。)
因此,使用该模板,我将编写您的主要流程:
process(clk_25MHz, reset)
begin
if reset = '1' then
packet_count <= "0000";
elsif rising_edge (clk_25MHz) then
if qdv_r = '1' then
if packet_count < "1010" then
packet_count <= packet_count + 1;
LED <= '0';
else
LED <= '1';
packet_count <= (others => '0');
end if;
end if;
end if;
end process;
现在我们有一个同步过程,它会增加packet_count
并驱动LED
输出。 (什么是q
带来的聚会?)
请