私は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;
まず、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
この質問はあなたの最後の質問のフォローアップであり、IMOは新しい質問を保証するものではありません。また、前回 'std_logic_arith'を使用しないようにしましたが、とにかく使用する必要はありません。私はまた、非同期リセットはおそらく悪い考えであり、ソースを引用していると書いています。 – DLnd
@Matthew Taylorの提案に従ってコードを編集しました。しかし、プロセスを順番に実行する必要があります。これらのプロセスを順番に実行するために、waitステートメントを中間に挿入することは可能ですか? –