FPGA活用回路&サンプル記述集(2) ―― モータやLEDを駆動するパワー回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年3月 9日
● 複数の7セグメントLEDをダイナミック駆動
- 回路図:図1-2
- 主要部品:7セグメントLED,PNPトランジスタ
- 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)で構成します.
図1-2 4けたの7セグメントLEDダイナミック駆動回路
リスト1-2にけた選択モジュール(COLCONT)のソース・コードを,リスト1-3にBCDデータ選択モジュール(BCDSEL)のソース・コードを示します.COLCONTはシーケンス動作を行うので外部からクロック(今回は33.333MHz)を入力し,ちらつかない程度まで切り替え速度を落とします.今回の例では222分周していますが,これは実機を見ながら調整してください.
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;
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;
実際のけた選択の実行は,4ビットの循環レジスタで1ビットだけ'1'となったデータが循環します.このデータが'1'となったけたが選択されるものとしています.スイッチング用トランジスタはPNP型のため,選択時に"L"を出力します.またBCDSELモジュールには循環レジスタのデータをそのまま出力しています.
BCDSELはCOLCONTモジュールから出力される循環レジスタのデータを入力し,所定のBCDデータを選択してBCD7SEGモジュールへ出力する単なるセレクタです.
あさい・たけし
(株)ネクスト・ディメンション
tag: FPGA