2017-11-08 6 views
-1

私はVHDLプログラミングの初心者で、現在Linuxサーバから生成した10個のイーサネットパケットをすべて送信した後、FPGAボードのLEDがオンになるプログラムを実行しようとします。私が書いたコードは、以下では正しく動作しません。私は問題を理解しようとしていますが、まだ取り消しています。どんな助けでも大歓迎です。私はあなたのコードに基づいて仮定を作っていますイーサネットパケットを受信した後に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, reset, qdv: in std_logic; 
 
     LED: out std_logic 
 
    ); 
 
end notification; 
 
\t 
 
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;

+2

まず、VHDLでプログラムを書くのではなく、ハードウェアを設計します。あなたが全く異なる方法で考えなければならないので、違いは重要です。第二に、 'std_logic_arith'と' std_logic_unsigned'を使用しないでください。代わりに 'numeric_std'を使用してください。 [ここ](https://vhdlguru.blogspot.com/2010/03/why-library-numericstd-is-preferred.html)を読んでください。第3のrising_edge()は、合成に使用されるとき、クロック信号用です。 qdvは時計ですか?また、qdvは機密リストに含まれていないため、シミュレーションでもうまく動作せず、そのために立ち上がりを検出できません。 – Staszek

+1

この質問はあなたの最後の質問のフォローアップであり、IMOは新しい質問を保証するものではありません。また、前回 'std_logic_arith'を使用しないようにしましたが、とにかく使用する必要はありません。私はまた、非同期リセットはおそらく悪い考えであり、ソースを引用していると書いています。 – DLnd

+0

@Matthew Taylorの提案に従ってコードを編集しました。しかし、プロセスを順番に実行する必要があります。これらのプロセスを順番に実行するために、waitステートメントを中間に挿入することは可能ですか? –

答えて

2

1)あなたはpacket_countあなたがqdvの立ち上がりエッジを見るたびにインクリメントしようとしている、

2) qdvのパルス幅は、25MHzクロックの周期(clk_25MHz) - 40nsおよび

0123よりも長くなります

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; 

:trueの場合、あなたは同期エッジ検出器を必要としています。

次に、(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は何ですか?)

私はこの

  • のいずれかをシミュレートしていない心の中で

    • 熊はそれがどのように動作するかを理解しようとせず、それを入力しないでください
  • +0

    あなたの前提は間違いありません。しかし、今は順番に実行する必要がある2つのプロセスがあります。最初のプロセスは同期エッジ検出用で、2番目のプロセスは主なプロセスです。これら2つのプロセス間でwaitステートメントを使用することは可能ですか? #Matthew Taylor –

    +0

    編集したコードを見てください。 –

    +0

    @AbdullahAlMamunA順番に実行しますか?それは意味をなさない。 VHDLはハードウェア記述言語です。ソフトウェアを書くのではなく、ここでハードウェアを設計しています。 'begin'と' end architecture; 'の間のすべてが同時に実行されます。それは理由のためです:それはハードウェアがするものです。 –

    関連する問題