プロが教えるわが家の防犯対策術!

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;

A 回答 (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 を明示する事を
お勧めします。
    • good
    • 0
この回答へのお礼

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

追伸:確かにbiginとかありませんね。
   まだまだです。
   これから精進します。

お礼日時:2009/06/15 22:26

何をしたいのか本当のところは、それだけの情報ではわかりませんが。



とりあえず、その記述だと、in1の立下りで leが反転するようになっていますね。(clkの周波数は、in1の周波数よりもずっと早いとした場合)
つまり、1周期前のclk立ち上がりでin1が1で、今回のclk立ち上がりでin1が0になるとleが反転します。

「latchの意味」というのは答えづらい質問ですが、そうですね、in1が入力、latchが内部状態だと思えば、その回路はミーリ型のステートマシンになってます。

#ちなみに日本でHDLを勉強するならVerilogをすすめます。FPGAなんかだとサンプルがVHDLで書かれている場合もあるんで、VHDLで始めるというのもあることはあるんですが、実際に仕事でHDLを触っている人は大多数がVerilogで組んでいると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ステートマシンですか。
なるほど、テキストの先を見ると、ミーリ型とかムーア型とか出てきますね。
ということは、今の私の知識では、理解できない状態だったのですね。
NO.1さんの回答にも書きましたが、内部状態の理解が難しいです。
ステートマシンというのが関係しているとなれば、先を読むことで、理解できそうでです。
希望がわいてきました。
ありがとうございます。

あと、Verilogが多いというのは、まったく知りませんでした。
いろいろ調べてみましたが、大体は、どっちでも良いってのが一般的でした。
あと、C言語に似てるということと、VHDLを理解すると、Verilogも
理解がしやすく、Verilogを先にやった人は、VHDLをやろうとすると、
少しと惑うと書いてあったので、VHDLのテキスト買って勉強始めました。
アドバイスいただきうれしいのですが、今から変更するのは、かなり勇気が
いりますので、とりあえず、このままがんばってみます。

ありがとうございました。

お礼日時:2009/06/15 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!