「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



昨日の実験のVHDL、ちょこっと手直ししてみました。
一つのカウンタを2つのprocess文から更新するような
処理を行う場合に上手く動かなかったっていうお話
の続き。


まずは、カウンタのカウントアップ処理とリセット処理が
別々のprocess文に分けて更新していたのを、一つの
process文内にまとめてみました。

…これでもまだエラー。

じゃぁ、さらに修正。2つの条件文に分かれていた
条件式(カウントアップとリセットの更新)を、
一つの条件文に無理矢理押し込んでみます。

…これでもまだエラー。でもエラーの内容が変わった…。

一つの条件文の中に、クロック入力とリセット入力の
両方の立ち上がり(「'event」で指定)が混在している
ことが悪いみたい…。

うーん、言われてみれば、物理的に2つの入力信号が
同時に立ち上がるっていうことは基本的に有り得ない
んだろうけど、Quartus君にはなんとかやりたいことを
汲み取って欲しいなぁ。
汲み取ってはくれないんだなぁ…。

ひとまず、信号の立ち上がりエッヂを拾うのはクロック
信号だけにして、再度コンパイル。

…やっと通った…!!!!


でも、当初の設計内容と意味が変わっちゃってるん
だよなぁ。だからと言って計算式を優先すれば
エラーだし。仕方ない、ひとまずは計算式をちょっと
見直す方向で。(設計内容とインプリメントが異なって
いるっていうのは気持ち悪いことこの上無い…)

まぁ、計算式をチョコチョコッと見直したら
シミュレーションは思ったとおりの結果が得られた
ってことで、ひとまずこれはこれでいいことに
します。


それにしても、同時処理っていうのはなんとなく
解ってきた気がするんだけど、なんとなく理解には
至ってないなぁ。

一般的なカウンタICって、カウンタへのパルス入力
とカウンタリセットの信号がそれぞれ独立して動作
できると思うんだけどな。
この部分の理解が間違えてるのかな?


というわけで、調査。調査。
EKジャパン「よくわかるディジタル回路の基礎の基礎」
を引っ張り出してきて、あらためてJK-FFの真理値表を
よーく眺めてみる…

うーん、入力側に、J、K、リセット、セットと、
CP(クロックパルス)があるな。入力信号が5つ
全部一まとめに書いてある。
うん。そういえば当たり前かな。リセットだけ切り離して
書いてある真理値表は見た事無い気がする。

…これら全部の組み合わせについていっぺんに
指定しないとだめってことなのかな?つまり、
カウンタを更新する条件は一まとめにしておかない
とダメなのよ…と。

D-FFも大体似たような感じ。
どちらも、CPの立下りで入力を拾って立ち上がり
で出力に反映されるという動作。

ということは…

やっぱりリセットだけ別に切り離したVHDLを記述
するってことはできないってことなのかもしれないな。
なんとなく解ったような、解んないような…


一つ目の疑問はなーんとなく解消したつもりに
なってみる。


もう一つの方。ある信号が立ち上がったという情報を、
クロック信号の立ち上がりに同期させて取り込むって
言うこと。これはどうやったらできるんだろう???

これを理解するにはもうちょっとお勉強が必要
なのかな。


そうそう。このprocess文の出力をもう一個の
process文が入力して、それを出力ピンに編集出力
するっていう回路も組み込んでみたんですが、
これはちゃんと同時処理ができるみたい。
つまり、複数のprocess文が存在するからといって
エラーになるわけではない、ということ。
(当たり前ですが)


今回判った鬼門は2つ。

(1)一つのsignalに対して更新をかけられるのは、
   1箇所に纏まった条件文(if,case)だけ。
   複数に分散されているとエラーになるっぽい

(2)立ち上がり/立下りエッヂを拾えるのは1つの
   信号だけ。いっぺんに2つの信号からエッヂを
   拾うような条件文はエラーになるっぽい。

もう少しきちんと裏取りしたい…。

やっぱり、読書中断中のFPGAボードで学ぶ論理回路設計
をもう一回引っ張り出してきて、後半のところを自分の手で
VHDL打ちながらちゃんと勉強進めないといけないな。

解った気になっちゃって、思い込みでモノ作ると
得てしてズッコケるんだろうな。今回みたいに。

でも、ずっこけてから本を読むのと、ズッコケる
前に本を読むのでは、理解度や集中度は違うはず
なので、前向きになって読み直そう。

今度時間出来たら、一度全部手で打ち込んで動かして
みよう。

動かしているうちに、普通のVHDLがどうなのかとか、
こんな動作の時にはどういう書き方・考え方するのか
といったことは解ってくるんじゃぁないかな?



コメント ( 3 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




とあるモノを作ろうと思っていて、そのお試しに
久々にVHDLを書いてみました。相変わらず上手く
いきませんねぇ。(TへT)


ちょっと書き足してはコンパイル、ちょっと書き
足してはコンパイル…ってやっているんだけど、
エラーが出ると理由が良くわからない…

process文を一つ一つ切り割りしてコンパイルする
とちゃんと通って、シミュレーションもそれなりの
結果が出てくるんだけどな…。

Can't resolve multiple constant driversって
いうのは、一つのsignalに対して複数のprocess文
から代入を行う処理になってるからダメよって
言われているのか???

イメージ的には、D-FFやJK-FFでリセット入力付きの
カウンタを書きたいだけなんだけどなぁ。

カウンタ値を設定するprocess文って、カウントアップ
、カウンタリセットに関わらず一つのprocess文内に
まとめて書かないといけないのかなぁ?
別々の処理にしたいんだけどなぁ。

そんなこともまだ良く解ってないんだよなぁ…。

そういえば、ステートマシンを書く時って、
ステートの更新を行うのは別々のprocess文で
やってたと思うんだけどな…。
と思って、前に書いたVHDLを開いて見る…
おぉ、やっぱ一つのprocess文内で纏まってるなぁ。

するとやっぱり原因はアレか?複数の
process文に分かれているのが原因か?


でも、一つのprocess文の中に更新条件を記述する
っていうのは、オイラの頭ではなかなか難しいなぁ。

しかもマクロセルの消費を抑えるために、カウントする
条件がちょっと複雑だったり、カウントアップの
条件にカウンタ値が含まれていたり…と、やっぱり
オイラの頭では難しいなぁ。


多分、「同時処理」っていうことの根本が理解できて
居ないんだろうなぁ。
ソフトウェアの頭から進歩してないってことなん
だろうなぁ。


Z80とかAVRとかのCPUコアのIPを作って公開
してる人たちって…もう、凄いね。
頭の中、どうなってるんだろう?



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする