接收以太网数据包后接通LED

时间:2017-11-08 01:05:21

标签: vhdl

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

1 个答案:

答案 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带来的聚会?)

  • 请记住,我还没有模拟过这个
  • 请勿在不试图了解其工作原理的情况下输入内容