• ベストアンサー

VHDLの記述で、わからない記述があり困っています

VHDLの勉強を始めて数日になるのですが、ある参考書に載っている記述が理解できませんので、質問させていただきました。 「基本クロックに同期してleをトグルする」という説明の後に、下記の様な 記述がありました(信号名などはオリジナルとは変えてます)。 一番不明なのは、”latch”信号です。 2~5行めを簡単に説明すると、”clk”の立ち上がりで、in1とlatchが 0であった場合、leが反転し、latchが1になるということだと思いますが、 いまいち理解が出来ません。 6、7行目をみてもさっぱりで、in1とlatchが1だったら latchが1になる。 これは、いったい何を意味しているのでしょうか。 ブロック図的なものでもあればわかりやすいのかもしれませんが、 そのあたりの説明は一切載ってませんので、どう考えてよいのかがわ からないのです。 はじめは、T型フリップフロップのイメージかと思ったのですが、 どうも違うようです。 このlatch信号の意味をどなたかわかる方がいらっしゃいましたら ご教授願いたいのですが、よろしくお願いします。    process (clk)     if clk'event and clk = '1' then       if in1 = '0' and latch ='0' then        le <= not le;        latch <='1';       elsif in1 = '1' and latch = '1' then        latch <= '0';       elsif in1 = '0' and latch = '1' then        latch <= '1';       end if;     end process;

質問者が選んだベストアンサー

  • ベストアンサー
  • monova
  • ベストアンサー率68% (68/100)
回答No.1

手元にコンパイラもシミュレータも無いので、自信は 有りませんが回答してみます。 ついでに、私はVerlog 派 なのですが… 初期値 in1 = 0,latch = 0 と、します。 if in1 = '0' and latch ='0' then を、状態A elsif in1 = '1' and latch = '1' then を、状態B elsif in1 = '0' and latch = '1' then を、状態C と、します。 初期値より、先ず状態A になります。 この時、leの出力は反転、latch は 1 に変化します。 ここで in1 = 0 latch = 1 になるので、状態は C に遷移します。 状態C では、latch = 1になるので、 in1 = 0 latch = 1 なので、状態は C のままです。 状態C の時に、in1 = 1 になると、状態はBに遷移し latch = 0に なります。 in1 = 1 latch = 0 となります。 この状態を定義する条件が有りませんので、仮に状態X と定義 します。 恐らく、状態X の時は 出力が不変になると思います。 状態X の時、in1 = 0 になると、latch = 0を受け継ぎ、状態Aに 遷移します。 以降、先頭に戻る。 この回路は全体として、in1 = 0 をきっかけとする、ワンショット トリガ回路で、in1 を入力する度に、leを反転、保持を行っている のでは無いでしょうか? これは、状態A から 状態Cに遷移中 の時、latch が 0から1 に変化 するまで、入力 in1 が …1,0,1,0… と変化しても、le の出力状態を 保証しているのだと思います。 従って、latch は 出力le の状態を保持する為の信号 なのでは ないでしょうか? 余談ですが、begin と end ifが足りない様な気がするのですが、 大丈夫でしょうか? 更に余談ですが、if文 を使う時は、必ず else を明記し、 不明な状態を無くした方が良いと思います。 if、elseif の条件に当てはまらない状態が発生した場合、 必ず、出力保持とは限りません。 コンパイラやターゲットLSI に寄っては出力が変わって来る事が あります。 中には、出力が不定になるものも有ります。 同じ理由から、switch case には default を明示する事を お勧めします。

gakugaku23
質問者

お礼

回答ありがとうございます。 かなりわかり安い回答で助かりました。 勉強を始めて数日であるのと、一日1時間ほどしか出来ないので、なかなか 理解が深まりませんが、示していただいたように、状態の遷移を考えることで、 なんとなく理解できたような気がします。 ただ、ちょっと理解が難しいです。 内部信号の考え方や、ラッチの考え方の理解が出来ていないのだと思います。 ハード的に回路図を書くのとは、若干視点を変える必要がありそうです。 ですが、ハード的に24ビットカウンタなどかなり作るの大変ですが、 HDLでは簡単に出来ることを知って、かなりわくわくしてます。 これからも少しずつではありますが、精進していきます。 追伸:確かにbiginとかありませんね。    まだまだです。    これから精進します。

その他の回答 (1)

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

何をしたいのか本当のところは、それだけの情報ではわかりませんが。 とりあえず、その記述だと、in1の立下りで leが反転するようになっていますね。(clkの周波数は、in1の周波数よりもずっと早いとした場合) つまり、1周期前のclk立ち上がりでin1が1で、今回のclk立ち上がりでin1が0になるとleが反転します。 「latchの意味」というのは答えづらい質問ですが、そうですね、in1が入力、latchが内部状態だと思えば、その回路はミーリ型のステートマシンになってます。 #ちなみに日本でHDLを勉強するならVerilogをすすめます。FPGAなんかだとサンプルがVHDLで書かれている場合もあるんで、VHDLで始めるというのもあることはあるんですが、実際に仕事でHDLを触っている人は大多数がVerilogで組んでいると思います。

gakugaku23
質問者

お礼

回答ありがとうございます。 ステートマシンですか。 なるほど、テキストの先を見ると、ミーリ型とかムーア型とか出てきますね。 ということは、今の私の知識では、理解できない状態だったのですね。 NO.1さんの回答にも書きましたが、内部状態の理解が難しいです。 ステートマシンというのが関係しているとなれば、先を読むことで、理解できそうでです。 希望がわいてきました。 ありがとうございます。 あと、Verilogが多いというのは、まったく知りませんでした。 いろいろ調べてみましたが、大体は、どっちでも良いってのが一般的でした。 あと、C言語に似てるということと、VHDLを理解すると、Verilogも 理解がしやすく、Verilogを先にやった人は、VHDLをやろうとすると、 少しと惑うと書いてあったので、VHDLのテキスト買って勉強始めました。 アドバイスいただきうれしいのですが、今から変更するのは、かなり勇気が いりますので、とりあえず、このままがんばってみます。 ありがとうございました。

関連するQ&A