Pmod SSD 用 VHDL デュアル 7 セグメント ディスプレイ コントローラー – 簡単な FPGA 統合
この記事では、Pmod SSD で 2 桁の数字を表示できる VHDL モジュール、Digilent の 7 セグメント ディスプレイを紹介します。デュアル 7 セグメント ディスプレイは Pmod インターフェイスと互換性があるため、はんだ付けなしで使用できます。これは、多くの FPGA 開発ボードで標準となっている Pmod コネクタに適合します。
VHDL 実装をテストするために、Pmod コネクタを備えた低コスト FPGA 開発ボードである Lattice iCEstick を使用しています。 iCEstick に加えて、iCEstick のパラレル Pmod コネクタから 7 セグメント ディスプレイが期待する直列バージョンのプラグに変換するには、2×6 ピンからデュアル 6 ピン Pmod スプリッタ ケーブルが必要です。最後に、iCEstick をコンピュータの USB ポートに直接接続するのは現実的ではないため、USB タイプ A 延長ケーブルを入手することをお勧めします。
7 セグメント ディスプレイの仕組み
市場にはさまざまな 7 セグメント ディスプレイが販売されています。桁数はそれらの間で異なり、物理インターフェイスとピン配置も異なります。遭遇する可能性のあるすべての 7 セグメント ディスプレイをカバーする汎用ソリューションは、おそらくあまりユーザーフレンドリーではないでしょう。ただし、この記事で紹介されているコードをベースとして使用し、ニーズに合わせて変更することができます。
上の画像は、Digilent Pmod モジュールのデータシートからのものです。 7 セグメント ディスプレイが Pmod ピンにどのように接続されているかを示します。これらのピンは、iCEstick 上の FPGA に直接アクセスできます。
7 本のピンがそれぞれディスプレイ上の 1 つのセグメントを制御します。このようなピンに論理 High 値を駆動すると、対応するセグメントがディスプレイ上で点灯します。しかし、このディスプレイには 2 つの桁があり、一度に制御できるのは 1 つだけです。 J2 コネクタの P4/C ピンは、どちらかの桁を選択します。このピンのロジック電圧が '0' の場合 '1' の場合、右の数字が点灯します。 、左の数字が有効になります。
「DP」小数点は接続されていないため、アクセスできません。
エンティティ
以下のコードは、seg7 VHDL モジュールのエンティティを示しています。エンティティには、clk_cnt_bits という名前の定数を持つ汎用ポートがあります。 。これは、ディスプレイのリフレッシュ レート、つまり左桁と右桁が切り替わる頻度を制御する内部カウンターの長さを定義します。
正確な頻度は必須ではありません。 50 ヘルツから数百ヘルツの範囲内のカウンタ長を選択します。リフレッシュ レートを決定する式はrefresh_hz =2clk_cnt_bits / clk_hz です。 .
entity seg7 is generic ( -- refresh_hz = (2 ** clk_cnt_bits) / clk_hz clk_cnt_bits : integer ); port ( clk : in std_logic; rst : in std_logic; value : in integer range 0 to 99; segments : out std_logic_vector(6 downto 0); digit_sel : out std_logic ); end seg7;
クロックとリセットに加えて、エンティティには 1 つの入力信号があります。これは、7 セグメント ディスプレイに表示される値です。 value signal は、0 ~ 99 の範囲に制限された整数型です。これは、2 桁のみを使用して表示できる数値がこれらの値だけであるためです。
出力信号は、ベクトルとしての 7 つのセグメントと、点灯する左または右の桁を選択するための桁セレクター信号です。
2進化10進数の表現
ディスプレイに表示される数字を表すには、2 進化 10 進数 (BCD) として知られる形式を使用します。バイナリ表現は 10 進数を格納する最も効率的な方法ですが、ディスプレイに表示するためにそれを左右の桁に分割しようとすると問題が発生します。数値を格納するために使用されるベクトルをスライスするだけでは、10 進数を区別することはできません。
subtype digit_type is integer range 0 to 9; type digits_type is array (1 downto 0) of digit_type; signal digit : digit_type; signal digits : digits_type;
上記のコードに示すように、10 進数 1 桁で表現できる値を記述するために、0 ~ 9 の範囲の整数のサブタイプを宣言します。次に、そのような 2 つの BCD 値を保持できる新しい配列型を宣言します。 digit 信号は、ディスプレイの左側または右側に現在表示されている番号を保持します。一方、digits は 信号には、画面を見ている人に表示される 2 桁の個別の小数文字が含まれています。
10 進数を BCD に変換
このモジュールへの入力、value は、0 ~ 99 の範囲の整数であり、数値のバイナリ表現です。この 1 つの整数を 0 ~ 9 の範囲の 2 つの整数 (BCD) に変換する必要があります。
このための標準アルゴリズムは Double Dabble で、shift-and-add-3 とも呼ばれます。 アルゴリズム。これを使用するのは問題ありませんが、この場合は区切る桁が 2 桁しかないため、より短い解決策を選択します。
digits(1) <= value / 10; digits(0) <= value - ((value / 10) * 10);
上記のコードに示すように整数の除算を使用すると、10 進数の最上位桁を分離し、それを digits(1) に割り当てることができます。 信号。最下位桁を取得するには、value から最上位桁を減算します。 信号が残ると、digits(0) に割り当てる番号だけが残ります。 信号。
クロック サイクルのカウント
FPGA での遅延時間は、単にクロック サイクルをカウントするだけの問題です。クロック周期は、VHDL コード内で信頼できる唯一の予測可能な時間間隔です。以下のコードは clk_count を示しています。 クロックサイクルをカウントするために使用する信号。 clk_cnt_bits generic は、この符号なし信号用に予約するビット数を決定します。
signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);
ディスプレイの正確なリフレッシュ レートはそれほど重要ではないため、ここでは符号なしタイプを選択しました。これにより、符号なし信号の自己ラッピング動作を利用できるようになります。私たちがしなければならないことは、クロックの立ち上がりエッジごとにカウンターをインクリメントすることだけです。以下のコードは、これを処理するリセットを伴う同期プロセスを示しています。
COUNT_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then clk_cnt <= (others => '0'); else clk_cnt <= clk_cnt + 1; end if; end if; end process;
数字を交互に入力
フリーランニング カウンタが動作するようになったので、符号なしカウンタ信号の最上位ビット (MSB) を使用して 2 桁を切り替えることができます。 MSB は '0' の間で切り替わります。 と '1' 50%のデューティサイクルで。以下のコードの最初の行は、digit_sel を設定します。 MSB の値に基づいて信号を決定します。 2 行目は、MSB をセレクターとして使用するマルチプレクサーを実装します。 digits からアクティブな数字の値を転送します。 配列を digit に設定します 信号。
digit_sel <= clk_cnt(clk_cnt'high); digit <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);
BCD から 7 セグメントへのエンコーダ
seg7 モジュールの最後のステップは、digit に格納されている BCD を変換することです。 7 セグメント ディスプレイ上の視覚的表現に信号を送ります。以下のコードは、case ステートメントを使用してこれを実現するプロセスを示しています。
各ビット リテラルのベクトル内の位置は、ディスプレイ上の 1 つのセグメントに対応します。インデックス 0 はセグメント A に等しく、インデックス 1 は B に等しく、セグメント G を制御するインデックス 6 まで続きます。ベクトル インデックスへのセグメントのマッピングは、Digilent 7 セグメント ディスプレイのデータシートから導出されます。
ENCODER_PROC : process(digit) begin case digit is when 0 => segments <= "0111111"; when 1 => segments <= "0000110"; when 2 => segments <= "1011011"; when 3 => segments <= "1001111"; when 4 => segments <= "1100110"; when 5 => segments <= "1101101"; when 6 => segments <= "1111101"; when 7 => segments <= "0000111"; when 8 => segments <= "1111111"; when 9 => segments <= "1101111"; end case; end process;
出力
seg7 VHDL モジュールは、value に割り当てたものをすべてディスプレイ上にレンダリングします。 入力信号。テストベンチでは、value をインクリメントします。 1秒に1回信号を送ります。次に、value の折り返し点を観察できるように、100 秒強シミュレーションします。 カウンター。
上の波形は ModelSim からのものです。これはシミュレーションの最初の部分を示しており、値は 0 から 15 までカウントされています。 digits 内の数字が確認できます。 配列もカウントされます。 (0) のもの value が発生するたびにカウントされます 信号が変化し、10 の位 (1) 10 番目の数字ごとに増加します。
以下のフォームを使用して、テストベンチを含む ModelSim プロジェクトをダウンロードできます。
seg7 モジュールを FPGA の最上位モジュールとして実装すると、ディスプレイには安定した「00」が表示される可能性が高くなります。それは '0' だからです FPGA の初期化されていない信号に与えられる最も一般的なデフォルト値です。 value の場合 信号がすべて 0 に設定されると、ディスプレイにはその値が表示されます。
考えられるすべての入力番号を循環するために、value をインクリメントするラッパー VHDL モジュールを作成しました。 1秒間に10回信号を送ります。次に、デザインを Lattice iCEstick に実装する前に、ラッパーで seg7 モジュールをインスタンス化しました。以下のループ Gif ビデオは、実装されたデザインが 7 セグメント ディスプレイにどのように表示されるかを示しています。
Pmod SSD の購入:7 セグメント ディスプレイ
このブログ投稿で使用されている 7 セグメント ディスプレイは Digilent 製です。 Pmod モジュールは、Digilent Web ショップから購入することも、多くの再販業者の 1 つから入手することもできます。以下のリストでは、その商品を取り扱ういくつかのオンライン家電量販店で展示されている商品ページにリンクしています。
- デジレント
- デジキー
- マウザー
- RS エレクトロニクス (英国)
(RS Electronics のメイン ページに移動して、あなたの国のサイトを選択してください) - ファーネル (英国)
(Farnell メイン ページに移動して、あなたの国のサイトを選択してください)
Digilent 7 セグメント ディスプレイをLattice iCEstickで使用したい場合はご注意ください。 、または 6×2 ピン Pmod コネクタを備えたその他の FPGA 開発ボードの場合は、スプリッタ ケーブルも必要です。ケーブルはDigilent から入手できます。 、デジキー 、マウザー 、 そしてRS エレクトロニクス .
さらに、すべてのコンポーネントは Amazon や eBay のさまざまな販売者から入手できます。
Digilent 7 セグメント ディスプレイを使用した VHDL コース
まったくの初心者向けの新しい VHDL および FPGA コースを開始しました。コースでは、Digilent の 7 セグメント ディスプレイと、VHDL の指導に Lattice iCEstick FPGA 開発ボードを使用します。コースの詳細については、下のリンクをクリックしてください。
FPGA および VHDL ファーストトラック:
まったくの初心者のためのハンズオン
プログラミングには精通していますが、VHDL については初めてですか?
この馴染みのない主題について簡単に説明する必要がありますか?
スケジュールがいっぱいで、勉強する時間がなくなっていませんか?
VHDL を使用した FPGA 開発の基本を数晩で理解します。このコースは、主題を簡単に理解する必要がある IT プロフェッショナルと学生を対象としています。このコースと低コストの Lattice iCEstick 開発ボードを使用すると、数時間以内に実際のハードウェアを開発できるようになります。
詳細を読んで登録するには、ここをクリックしてください:
FPGA および VHDL ファストトラック:まったくの初心者向けのハンズオン
VHDL
- VHDL でループと終了を使用する方法
- VHDL コード ロック モジュール用の Tcl 駆動型テストベンチを作成する方法
- VHDL で有限ステート マシンを作成する方法
- TEXTIO を使用して読み取った BMP ファイルのビットマップ イメージ
- VHDL で同時実行ステートメントを作成する方法
- VHDL で関数を使用する方法
- VHDL テストベンチでシミュレーションを停止する方法
- FPGA とプログラマブル ロジックの紹介
- 初めての VHDL プログラムの作成方法:Hello World!
- TEXTIO を使用してテストベンチで読み込まれたスティミュラス ファイル
- VHDL で信号ベクトルを作成する方法:std_logic_vector