2017-11-04 1 views
0

イーサネットパケット送信に使用されるLinuxサーバボックスに接続されたFPGAボードを使用しています。 10パケットごとに1つのLEDが1回点滅し、処理が続行されます。つまり、100個のパケットを送信すると、LEDが10回点滅するはずです。私は実行しようとしたVHDLのソースコードを共有しましたが、それは私が望むやり方では機能しません。何か助けや提案は本当に感謝されます。前もって感謝します。FPGA(VHDL) - イーサネットパケット受信時にLEDが点滅する

--------------------------------------------- 
 

 

 

 
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: in std_logic; 
 

 
     reset: in std_logic; 
 

 
     dv: in std_logic; 
 

 
     LED: out std_logic 
 

 
\t ); 
 

 
end notification; 
 

 
\t 
 

 
architecture behavior of notification is 
 

 
\t 
 

 
signal packet_count: std_logic_vector (3 downto 0); 
 

 
signal q: std_logic; 
 

 

 

 
begin 
 

 
process(clk) 
 

 

 

 
begin 
 

 
if reset = '1' then 
 

 
packet_count <= "0000"; 
 

 
elsif dv = '1' then 
 

 
    if packet_count < "1010" then 
 

 
    packet_count <= packet_count + 1; 
 

 
    q <= '0'; 
 

 
    else 
 

 
    q <= '1'; 
 

 
    packet_count <= (others => '0'); 
 

 
    end if; 
 

 
end if; 
 

 

 

 
LED <= q; 
 

 

 

 
end process; 
 

 
end behavior;

+0

コードにif-statementクロックがありません(rising_edge)。 VHDLで同期設計を参照してください。 – JHBonarius

答えて

0

あなたのコードは、私は以下の説明いくつかのミスが含まれています。 this oneのような、より基本的なVHDL文献を読んだり、チュートリアルを行うことを検討したいかもしれません。

まず、プロセスにタイミングコードが含まれていません。あなたは、あなたのプロセスは次のように見せることによって、それはクロック同期を行う必要があります

notification: process(clk) 
begin 
    if rising_edge(clk) then 
      --<the code you already had> 
    end if; 
end process; 

あなたは(つまりhere続きを読む、良いアイデアではないかもしれません)リセット非同期を維持したい場合は、

にそれを変更することができます
notification: process(clk) 
begin 
    if reset = '1' then 
      --<your reset conditions here> 
    elsif rising_edge(clk) then 
      --<the code you already had> 
    end if; 
end process; 

コードのもう1つの問題は、ieee.std_logic_arithieee.std_logic_unsignedの使用です。 これらのライブラリは非推奨のです。彼らの名前が示唆しているものと違って、それらは標準的なIEEEライブラリではありません。あなたは絶対にそれらを使用すべきではありません。代わりに、ieee.numeric_std.all(more here

を使用する必要があります。ただし、コードにはieee.numeric_stdをまったく使用する必要はありません。あなたは(そしておそらく、読みやすくするため必要がある)あなたのpacket_countintegerとして宣言し、整数値と比較し、整数は、合成ツールのための問題であるために使用される、すなわち

signal packet_count : integer range 0 to 10; 
notification: process(clk) 
begin 
    if rising_edge(clk) then 
     -- <all your other stuff> 
     if packet_count = 10 then 
      -- <whatever you want to do 
     end if; 
    end if; 
end process; 

が、それは何年も何年も前だことができます。最近では、カウンターのようなものに整数を使うことができます。

+0

下記をご覧ください。 –

+0

以下をご覧ください。 – DLnd

関連する問題