FPGA活用回路&サンプル記述集(2) ―― モータやLEDを駆動するパワー回路

浅井 剛

● 複数の7セグメントLEDをダイナミック駆動

外部回路
  • 回路図:図1-2
  • 主要部品:7セグメントLED,PNPトランジスタ
HDL記述
  • VHDL記述:リスト1-2リスト1-3
  • 外部入力:なし
  • 外部出力:COLSEL,MUXSEL,ODATA
  • 内部入力:BCD_A,BCD_B,BCD_C,BCD_D,CLK,RES_n,IDATA
  • 内部出力:BCD_O(IDATA)
  • パラメータ:なし
評価環境
  • 製品に搭載実績のある回路を本誌に抽出.


 7セグメントLEDも1けたの場合は図1-1の回路が最適ですが,複数けたを扱おうとすると端子数が無視できなくなります.またLEDは1セグメント当たり,結構な電力を消費しますから電源容量も心配になります.そこで人間の目の残像効果を利用してLEDを順次ダイナミックに点灯させ,端子数と消費電力の双方を低減させる回路を解説します.

 図1-2に7セグメントLEDを4けたにした場合のダイナミック駆動回路を示します.BCD7SEGモジュールと7セグメントLEDの接続は1けたの場合と同じです.電流制限用抵抗はけた数分必要と思われるかもしれません.しかし,ある時刻で点灯しているのは1けただけなので,電流制限用抵抗も1組で済むのです.あとは表示するけたを切り替える行選択論理(COLCONT),選択したけたの7セグメントLEDへ電源を供給するスイッチング用トランジスタ,そして選択したけたのBCDデータをBCD7SEGモジュールへ与えるセレクタ(BCDSEL)で構成します.

zu01_02.gif
図1-2 4けたの7セグメントLEDダイナミック駆動回路

 リスト1-2にけた選択モジュール(COLCONT)のソース・コードを,リスト1-3にBCDデータ選択モジュール(BCDSEL)のソース・コードを示します.COLCONTはシーケンス動作を行うので外部からクロック(今回は33.333MHz)を入力し,ちらつかない程度まで切り替え速度を落とします.今回の例では222分周していますが,これは実機を見ながら調整してください.

library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
 
entity COLCONT is
    port(RES_n : in std_logic; -- システム・リセット
        CLK : in std_logic; -- システム・クロック (33.333MHz)
        COLSEL : out std_logic_vector(3 downto 0); -- 桁選択トランジスタ駆動用出力
MUXSEL : out std_logic_vector(3 downto 0) -- BCDデータ選択用信号
    );
end COLCONT;
 
architecture RTL_COLCONT of COLCONT is
Signal DIVCLK : Std_logic;
Signal DIVCOUNT : Std_logic_vector(22 downto 0);
Signal SELREG : Std_logic_vector(3 downto 0);
begin
-- クロック分周器
    Process(RES_n, CLK)
    Begin
        If RES_n = '0' then
            DIVCOUNT <= "00000000000000000000000";
        Else
            If CLK'event and CLK = '1' then
                DIVCOUNT <= DIVCOUNT + "00000000000000000000001";
        End if;
      End If;
    End Process;
 
    DIVCLK <= DIVCOUNT(22);
 
-- 循環レジスタ部
    Process(RES_n, DIVCLK, SELREG)
    Begin
        If RES_n = '0' then
            SELREG <= "0001";
        Else
            If DIVCLK'event and DIVCLK = '1' then
                SELREG(0) <= SELREG(3);
                SELREG(1) <= SELREG(0);
                SELREG(2) <= SELREG(1);
                SELREG(3) <= SELREG(2);
            End if;
          End If;
        End Process;
 
-- 桁選択トランジスタ駆動用信号生成
    COLSEL(0) <= not SELREG(0); -- 桁A選択信号
    COLSEL(1) <= not SELREG(1); -- 桁B選択信号
    COLSEL(2) <= not SELREG(2); -- 桁C選択信号
    COLSEL(3) <= not SELREG(3); -- 桁D選択信号
 
-- BCDデータ選択用信号生成
    MUXSEL(0) <= SELREG(0);
    MUXSEL(1) <= SELREG(1);
    MUXSEL(2) <= SELREG(2);
    MUXSEL(3) <= SELREG(3);
end RTL_COLCONT;
リスト1-2 けた選択のためのCOLCONTのソース・コード

library ieee;
    use ieee.std_logic_1164.all;
 
entity BCDSEL is
    port(MUXSEL : in std_logic_vector(3 downto 0);
              -- BCDデータ選択用信号
        BCD_A : in std_logic_vector(3 downto 0);
              -- 桁A用BCDデータ
        BCD_B : in std_logic_vector(3 downto 0);
              -- 桁B用BCDデータ
        BCD_C : in std_logic_vector(3 downto 0);
              -- 桁C用BCDデータ
        BCD_D : in std_logic_vector(3 downto 0);
              -- 桁D用BCDデータ
        BCD_O : out std_logic_vector(3 downto 0)
              -- 選択BCDデータ出力
    );
end BCDSEL;
 
architecture RTL_BCDSEL of BCDSEL is
begin
-- データセレクタ
    Process(MUXSEL, BCD_A, BCD_B, BCD_C, BCD_D)
    Begin
        Case MUXSEL is
        When "0001" => BCD_O <= BCD_A; -- 桁Aのデータを出力
        When "0010" => BCD_O <= BCD_B; -- 桁Bのデータを出力
        When "0100" => BCD_O <= BCD_C; -- 桁Cのデータを出力
        When "1000" => BCD_O <= BCD_D; -- 桁Dのデータを出力
        When others => BCD_O <= "1111"; -- 非BCDデータを出力
        End Case;
    End Process;
end RTL_BCDSEL;
リスト1-3 BCDデータ選択のためのBCDSELのソース・コード

 実際のけた選択の実行は,4ビットの循環レジスタで1ビットだけ'1'となったデータが循環します.このデータが'1'となったけたが選択されるものとしています.スイッチング用トランジスタはPNP型のため,選択時に"L"を出力します.またBCDSELモジュールには循環レジスタのデータをそのまま出力しています.

 BCDSELはCOLCONTモジュールから出力される循環レジスタのデータを入力し,所定のBCDデータを選択してBCD7SEGモジュールへ出力する単なるセレクタです.

あさい・たけし 
(株)ネクスト・ディメンション

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日