目次
前
次
夜間点滅器
夜間点滅器は、昼夜を判定するセンサーを
使い、夜間にランプを点滅させる回路です。
ブロック図では、以下。
昼夜判定のセンサーには、CdSを利用。
CdSと抵抗を利用して、論理値を出力。
点滅させるには、クロックが必要なので
マスタークロックから分周して生成。
ブロック図からVHDLコードを作成。
-- divider
process ( nRESET , CLOCK )
begin
if ( nRESET = '0' ) then
iACNT <= 0 ;
elsif rising_edge( CLOCK ) then
if ( iACNT = ACNT_MAX ) then
iACNT <= 0 ;
else
iACNT <= iACNT + 1 ;
end if ;
end if ;
end process ;
iACLK <= '1' when ( iACNT < ACNT_HALF ) else '0' ;
process ( nRESET , iACLK )
begin
if ( nRESET = '0' ) then
iBCNT <= 0 ;
elsif rising_edge( iACLK ) then
if ( iBCNT = BCNT_MAX ) then
iBCNT <= 0 ;
else
iBCNT <= iBCNT + 1 ;
end if ;
end if ;
end process ;
iBCLK <= '1' when ( iBCNT < BCNT_HALF ) else '0' ;
1HzがiBCLKで出力されるので、LEDに転送します。
-- output
Lout <= iBCLK when ( ??? ) else '0' ;
クロックを転送する条件は、夜であること。
夜の場合、論理値の'1'が出力されてくるので
条件に入れて処理。
-- output
Lout <= iBCLK when ( iENV = '1' ) else '0' ;
iENVをどう扱うかが問題ですが、1kHzのクロックで
常にCdSの出力電圧を記憶して対応します。
-- latch
process ( nRESET , iACLK )
begin
if ( nRESET = '0' ) then
iENV <= '0' ;
elsif rising_edge( iACLK ) then
iENV <= CDSENV ;
end if ;
end process ;
まとめます。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity nflash is
Port (
-- system
nRESET : in std_logic ;
CLOCK : in std_logic ; -- 4MHz
-- clock monitor
ACLK : out std_logic ;
BCLK : out std_logic ;
-- CdS input
CDSENV : in std_logic ;
-- output
Lout : out std_logic --;
);
end nflash;
architecture Behavioral of nflash is
--
CONSTANT ACNT_MAX : integer := 3999 ;
CONSTANT BCNT_MAX : integer := 999 ;
CONSTANT ACNT_HALF : integer := 2000 ;
CONSTANT BCNT_HALF : integer := 500 ;
-- divider
signal iACNT : integer range 0 to ACNT_MAX ;
signal iACLK : std_logic ;
signal iBCNT : integer range 0 to BCNT_MAX ;
signal iBCLK : std_logic ;
-- latch
signal iENV : std_logic ;
begin
-- output
Lout <= iBCLK when ( iENV = '1' ) else '0' ;
-- monitor
ACLK <= iACLK ;
BCLK <= iBCLK ;
-- divider
process ( nRESET , CLOCK )
begin
if ( nRESET = '0' ) then
iACNT <= 0 ;
elsif rising_edge( CLOCK ) then
if ( iACNT = ACNT_MAX ) then
iACNT <= 0 ;
else
iACNT <= iACNT + 1 ;
end if ;
end if ;
end process ;
iACLK <= '1' when ( iACNT < ACNT_HALF ) else '0' ;
process ( nRESET , iACLK )
begin
if ( nRESET = '0' ) then
iBCNT <= 0 ;
elsif rising_edge( iACLK ) then
if ( iBCNT = BCNT_MAX ) then
iBCNT <= 0 ;
else
iBCNT <= iBCNT + 1 ;
end if ;
end if ;
end process ;
iBCLK <= '1' when ( iBCNT < BCNT_HALF ) else '0' ;
-- latch
process ( nRESET , iACLK )
begin
if ( nRESET = '0' ) then
iENV <= '0' ;
elsif rising_edge( iACLK ) then
iENV <= CDSENV ;
end if ;
end process ;
end Behavioral;
ピンアサインは、以下。
# system
NET "nRESET" loc = "P39" ;
NET "CLOCK" loc = "P5" ;
# monitor
NET "ACLK" loc = "P1" ;
NET "BCLK" loc = "P2" ;
# CdS
NET "CDSENV" loc = "P9" ;
# LED
NET "Lout" loc = "P11" ;
昼夜の判定回路を作成するのが面倒なときには
スイッチでCdSの動作をエミュレートします。
スイッチによるエミュレート回路は、以下。
目次
前
次