目次

夜間点滅器

 夜間点滅器は、昼夜を判定するセンサーを
 使い、夜間にランプを点滅させる回路です。

 ブロック図では、以下。



 昼夜判定のセンサーには、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の動作をエミュレートします。

 スイッチによるエミュレート回路は、以下。




目次

inserted by FC2 system