概要
前回はDFFとLATCHでした。今回はCNTとDLYです。このへんからクロックを利用した回路などになってきますので、ちょっと毛色が変わってくる気がします。単体だけだとどう使うのかがよくわからない回路ですね。単体の説明だけだったらかんたんなのですが、実際にどう使うかが結構難しい気がします。
CNT/DLYマクロセル
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-16.png)
複数のマクロセルがありますが、基本は上記の形です。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-17.png)
0だけ下にピンが増えていますね。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-18.png)
SLG46826の場合には全部で8個のマクロセルがありました。
DLY
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-19-700x188.png)
いろいろなモードがあるのですが、デフォルト設定されているのがDLYです。信号を遅延させるマクロセルですね。上記のような回路を組んでみました。50u秒、100u秒、200u秒のパルスを入力して、DLYの出力がどうなるのかを試してみます。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-20.png)
設定はこんな感じです。Cunter dataのみ変更しています。ここの数値を変更するとDelay timeが変更されるようです。とりあえず150に設定して、73u秒の遅延にしてみました。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-21-700x275.png)
結果です。上が入力パルスで、一番短いのが50u秒だと思われます。結果を見ると遅延時間が75u秒なので、それ以下の50u秒のパルスが無視されていますね。これどのように使うかというと、ボタン入力などのチャタリングを防止するために、Delayを入れたりするようです。
Edge selectを変更してみます。デフォルトは立ち上がりと立ち下がり両方のBothでした。立ち下がりのFallingに設定してみます。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-22-700x275.png)
立ち上がりは入力と同じタイミングで上がっていますね。ただし、50u秒のLOWは出力に反映されていません。100u秒と200u秒のLOWはちょっと遅れてからLOWになっていますね。この遅れてからってところがDelayの時間になると思います。DelayのFalling(立ち下がり)の場合には、立ち上がりは即時反映だけれども、一瞬LOWに立ち下がっていても無視をするような回路となります。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-23-700x275.png)
次は立ち上がりのRisingに設定してみました。こちらはHIGHになってから一定時間経過してから出力に反映されています。ただしLOWに落ちた場合には即時反映ですね。
どのエッジモードを使うのかは状況次第だと思います。とりあえず早くHIGHなってほしくて、チャタリングを防止するのであればFalling(立ち下がり)。安全に倒して、立ち上がりが遅くてもいいから、すぐに停止してほしい場合にはRising(立ち上がり)なんでしょうか?
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-24-700x358.png)
他の設定はDFFなどと近いので、一番下にあるクロックを設定してみたいと思います。デフォルトはOSC1で変更していない場合には結線がありません。OSC1/8に変更してみたところ、結線が表示されます。この状態だとDelay timeが73u秒から589u秒に増えていますね。このクロックに応じて遅延時間を計算しているみたいです。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-25.png)
OSC0/64に設定してみたところです。63で2秒の遅延ですので長押し系の設定はこのあたりの設定を使うと便利そうですね。
One Shot
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-27.png)
上記の設定にしてみました。回路は前回と同じです。Counter dataは50(約25u秒)にして、Edge selectはBothにしています。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-26-700x275.png)
上記が結果です。立ち上がり、立ち下がりのエッジを検出したら、指定した50(約25u秒)のパルスを発生させています。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-28-700x275.png)
パルスを最大値の255(125u秒)にしてみました。パルス発生中のエッジは流石に検出しないですね。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-29-700x275.png)
Falling(立ち下がり)にしてみました。ちゃんと出ていますね。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-30-700x277.png)
上記はクロック的な信号を入力していますが、One ShotでエッジをBothにして、出力パルスを入力周波数の半分に設定することで、倍の周波数にすることができます。
Frequency detect
周波数を判定するためのマクロセルです。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-31-700x381.png)
上記のような設定にしました。125u秒に設定しました。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-32-700x277.png)
100u秒、200u秒、500u秒のパルスで、100u秒の短いパルスにだけ反応していますね。指定した周波数より早い場合にHIGHになるようです。
Reset counter
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-33-700x438.png)
上記のようにクロックに直結しています。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-34-700x277.png)
上が入力クロックで、下が出力です。半分の周波数になっていますね。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-35-700x277.png)
Counter dataを2にしてみました。3クロック経過したときに、カウンターからパルスが出力されていますね。設定値+1クロックをカウントしてパルスを出力するのがカウンター回路になります。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-36-700x259.png)
カウンターの場合には、下の入力がリセット信号になります。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-37-700x277.png)
上記のようにBothを選択すると、リセット信号の立ち上がりと立ち下がりでリセットがかかっています。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-38-700x277.png)
High level resetはリセット入力がHIGHの場合にリセットになり、出力もHIGHが継続しています。
Edge detect
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-39-700x332.png)
先程の回路のままです。今回Counter dataを入力しても、時間が計算されませんね。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-40-700x277.png)
入力信号のエッジでパルスを出力していますね。Counter dataは使っていないようです。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-41-700x277.png)
入力クロックをOSC1/64に変更してみましたが、結果は変わりませんね。One Shotのパルス幅が変更できないバージョンなのかな。
Deleyed edge detect
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-42-700x349.png)
名前からすると遅延付きのエッジ検出ですね。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-43-700x277.png)
Counter dataは31(125u秒)なので、100u秒、200u秒、500u秒のパルス入力の100u秒には反応していませんね。どんなときに使うのかまったくわかりません。
Counter/FSM
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-44-700x518.png)
CNT0はfinite state machine(FSM)としても使えます。有限オートマトンですね(よくわかっていません
UPはHIGHだとFSMの値をカウントアップ、LOWだとカウントダウンします。KEEPはラッチでHIGHの場合にはFSMの値が保持されます。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-45-700x516.png)
CNT0はCounter dataが65535までと大きいです。UPをHIGHに固定してみました。このままだと変化が無いので、Counter dataを65533に設定しました。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-46-700x277.png)
カウントアップ方向に動きますので、最大値の65536になったところでクロックがでます。実際にはUPは状態に応じて変更してカウント値を変更するんだと思われます。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-48-700x345.png)
KEEPの検証用回路です。KEEPは499u秒のパルスでちょっとだけタイミングをずらしています。
![](https://lang-ship.com/blog/wp-content/uploads/2021/01/image-47-700x277.png)
KEEPはラッチなので値が固定されるだけですね。LOWの場合には普通のカウンターでHIGHになっているとそのときの値が固定化されています。
まとめ
ほんとうはもう少しDFFとかと連携するオプションがありますが、理解が追いつかないので紹介しません。有限オートマトンとかもどのようなときに利用するのかがいまいちわかっていません。
DFFや加算器などは勉強した覚えがあるのですが、クロックが必要な回路は記憶にありません。勉強したかもしれませんが、記憶の彼方です、、、
CNTとDLYは基本的なマクロセルですが、単体ではおそらくなかなか使いません。DFFなどの複数のマクロセルを組み合わせるのですが、応用回路は今後に紹介したいと思っています。もう少し基本的なマクロセルの紹介が続くと思います。
コメント