どうも。

試行錯誤をしながらも、製作実習の ステップ 2. ハードウェア設計に移った 無知無知くん です。

今回は 第二弾!Verilog HDL でハードウェアを設計するお話です。

 

※ 前回の<仕様書・基板作成編>は、こちらよりご覧ください。

目次

Verilog HDL 記述 (7セグメント LED 時計、ドットマトリクス LED)

知らなくてヤバかったこと

こうしときゃぁ良かったなポイント

次回予告

Verilog HDL 記述

半田づけと同じくらいイイ感じに距離を取っていたハードウェア言語。

さすがに観念して、Verilog HDL で 7セグメント LED 時計 (以下 7seg 時計) を設計します。

7seg 時計

時計を作るためには、外部から入力した 50MHz のクロック周波数を使って、FPGA で "1 秒間隔のパルス信号" を作る必要がありました。

まずは、Cyclone® 10 LP 評価キットの基板に搭載されているクロック周波数 50 MHz で動作するアップカウンターを作りました。

これで 50,000,000 を数えたら そこで 1 秒間。

そのカウンターをリセットさせ、同時にクロック 1 周期分のパルスを生成させました。

このパルス信号を、秒用のカウンターのクロックイネーブル信号に用いれば、

1 秒で動作するカウンターのできあがり!

 

続いて、時・分・秒 に それぞれに 1桁目用と2桁目用のカウンターを用意。

秒 と 分 のカウンターは、この2桁が 60 になるタイミングで、クロック 1 周期分のパルスを生成させ

下図のように 分、時 それぞれのカウンターのクロックイネーブルに使いました。

 

あとは、プッシュボタンが押されているか否かで、時 & 分 / 秒 のどちらを 7seg に表示するか選択させました。

ドットマトリクス LED

7seg 時計を Verilg HDL で記述した際に採用したダイナミック点灯を応用し、カウンターを使って 50000ns 経過する間に

1つのドットマトリクス LED 上のすべての LED に対して、点灯・消灯を制御する記述をしました。

こうすれば、人間の目には点灯している箇所が、同時に点いたように見えるんです!

表情を変化させる

7seg 時計の時刻と、プッシュボタンの押下状態によって点灯パターンを変えるため、2つの変数を用いました。

2つの変数の組み合わせにより、4パターンの表情を作ることができました。

そんなこんなで、ステップ 2 の課題を終えました。

振り返ってみると...

目次へ戻る

知らなくてヤバかったこと

知らヤバ 1. デコーダーって何?

前回の #1 <仕様書・基板作成編> で「まぁ いけるっしょ(笑)」と思ったのは、下図の点線枠内を作れば完成だと思った 勘違いのせいでした。

時計回路を Verilog HDL で仕上げ、"ヨシ!強敵を倒した!" と思いきや
その出力信号をピンアサインしようと考えたときに … あれ?どうつなげれば良いんだろう?
その後段で何をすれば LED を点灯・消灯させられるのか、無知無知くんには  でした。

 

先輩たち相談すると、"デコーダー" という用語が。

その後 自分で調べて、その処理がナニモノかを知ったときには 「マジかよ!そういうことかーーーッ!!!」 と声に出てしまいました。

そんな強大なアイテムがあったとは。そして、それを知らなかったオレ。

そのときは もう 自分に対して絶望しかありませんでした Ozn

知らヤバ 2. ダイナミック点灯 & case 文の使い方

前回の#1 <仕様書・基板作成編>で、7セグメント LED の使い方はダイナミック点灯で

動作させることがわかりましたが、実際にそのやり方までは全く分かっていませんでした。

 

 

グー〇ル先生や先輩たちに聞いて、どうにかこうにか辿り着いた結論が こんな感じです。

例えば 1230 と表示させる場合は、下図のとおりに各 LED を点灯させなければなりません。

でも 4桁の 7seg LED のピン仕様は各 LED との接続が 1対1 ではないので、同時に点灯させられません。そこで、各桁の 7seg LED を ある一定の時間だけ 順次点灯させる方法にしました。

グー〇ル先生で調べてみると
人間が目で追える点滅の速さは 50ms ~ 100ms くらいだそうなので
点灯時間を 10000ns に決めました。

具体的には
1ns 周期で 40000 回カウントアップするカウンター(cnt) を作成し、
case 文を使って以下のように制御しました。

         0 ns ~  9999 ns で seg1 が点灯

10000 ns ~ 19999 ns で seg2 が点灯

20000 ns ~ 29999 ns で seg3 が点灯

30000 ns ~ 39999 ns で seg4 が点灯

[10000ns 間隔は速すぎて人間の目には追えない = 同時に点灯しているように見える] ということだったんですね!

これで、無事にダイナミック点灯ができました。

目次へ戻る

こうしときゃぁ良かったなポイント

ハードウェア設計 (ステップ 2) で「こうしときゃ良かった」と実感したことが、いくつかありました。

 

 自分が考えたデザイン (デジタル論理回路) の全体構造を 理解しておけば良かった

    … 仕様書の内容をもっとしっかりと書いておけば良かったと 猛反省

 

 Verilog HDL 記述で自分の回路をいきなり記述する前に、
   新人研修中の言語講座で出された課題の演習を 改めてやっておけば良かった

目次へ戻る

次回予告

ステップ 1 の終盤で調子に乗ったら ステップ 2 で即ヘシ折られ、慎重派になった無知無知くん。

「もう 同じ過ちはしないぞ!」

 

次回、ソフトウェア設計編 (feat. Nios® II) です。

目次へ戻る