- ベストアンサー
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;
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
手元にコンパイラもシミュレータも無いので、自信は 有りませんが回答してみます。 ついでに、私は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 を明示する事を お勧めします。
その他の回答 (1)
- rabbit_cat
- ベストアンサー率40% (829/2062)
何をしたいのか本当のところは、それだけの情報ではわかりませんが。 とりあえず、その記述だと、in1の立下りで leが反転するようになっていますね。(clkの周波数は、in1の周波数よりもずっと早いとした場合) つまり、1周期前のclk立ち上がりでin1が1で、今回のclk立ち上がりでin1が0になるとleが反転します。 「latchの意味」というのは答えづらい質問ですが、そうですね、in1が入力、latchが内部状態だと思えば、その回路はミーリ型のステートマシンになってます。 #ちなみに日本でHDLを勉強するならVerilogをすすめます。FPGAなんかだとサンプルがVHDLで書かれている場合もあるんで、VHDLで始めるというのもあることはあるんですが、実際に仕事でHDLを触っている人は大多数がVerilogで組んでいると思います。
お礼
回答ありがとうございます。 ステートマシンですか。 なるほど、テキストの先を見ると、ミーリ型とかムーア型とか出てきますね。 ということは、今の私の知識では、理解できない状態だったのですね。 NO.1さんの回答にも書きましたが、内部状態の理解が難しいです。 ステートマシンというのが関係しているとなれば、先を読むことで、理解できそうでです。 希望がわいてきました。 ありがとうございます。 あと、Verilogが多いというのは、まったく知りませんでした。 いろいろ調べてみましたが、大体は、どっちでも良いってのが一般的でした。 あと、C言語に似てるということと、VHDLを理解すると、Verilogも 理解がしやすく、Verilogを先にやった人は、VHDLをやろうとすると、 少しと惑うと書いてあったので、VHDLのテキスト買って勉強始めました。 アドバイスいただきうれしいのですが、今から変更するのは、かなり勇気が いりますので、とりあえず、このままがんばってみます。 ありがとうございました。
お礼
回答ありがとうございます。 かなりわかり安い回答で助かりました。 勉強を始めて数日であるのと、一日1時間ほどしか出来ないので、なかなか 理解が深まりませんが、示していただいたように、状態の遷移を考えることで、 なんとなく理解できたような気がします。 ただ、ちょっと理解が難しいです。 内部信号の考え方や、ラッチの考え方の理解が出来ていないのだと思います。 ハード的に回路図を書くのとは、若干視点を変える必要がありそうです。 ですが、ハード的に24ビットカウンタなどかなり作るの大変ですが、 HDLでは簡単に出来ることを知って、かなりわくわくしてます。 これからも少しずつではありますが、精進していきます。 追伸:確かにbiginとかありませんね。 まだまだです。 これから精進します。