目次

Linear Feedback Shift Register

 「tutebot」をデジタル回路で実現するための
 シミュレーションで乱数が必要になりました。

 デジタル回路の乱数生成では、LFSR(Linear Feedback Shift Register)が
 定番なので、ワンチップで実現してみました。

 動作は、以下。



 32ビットのレジスタを使うので、CPLD内部に用意。

  signal iRNDREG : std_logic_vector(31 downto 0) ;

 初期値として、16進数の「340550AF」を指定。
 リセット時に、設定すればよいでしょう。

  iRNDREG <=  X"340550AF" ;

 クロックが入るたびに、Q30とQ27の排他的論理和を
 求めて、32ビットレジスタのLSBに代入。

  -- generate datum
  iRGEN <= iRNDREG(30) xor iRNDREG(27) ;

  process ( nRESET , CLOCK )
  begin
    if ( nRESET = '0' ) then
      iRNDREG <=  X"340550AF" ;
    elsif rising_edge( CLOCK ) then
      iRNDREG <= iRNDREG(30 downto 0) & iRGEN ;
    end if ;
  end process ;

 動作していることがわかるように、32ビットレジスタの
 MSBを外部へ出力しておくことにします。

 VHDLコードで、まとめると以下。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity lfsr is
  Port (
    -- system 
    nRESET : in  std_logic ; -- system reset
    CLOCK  : in  std_logic ; -- 4MHz
    -- output control
    ENA    : in  std_logic ;
    -- output
    XMSB   : out std_logic ;
    RDAT   : out std_logic_vector(7 downto 0) -- ;
  );
end lfsr;

architecture Behavioral of lfsr is
  -- register
  signal iRNDREG : std_logic_vector(31 downto 0) ;
  -- carry
  signal iRGEN : std_logic ;
begin
  -- output
  XMSB <= iRNDREG(31) ;
  RDAT <= iRNDREG(7 downto 0) when ( ENA = '1' ) else X"00" ;

  -- generate datum
  iRGEN <= iRNDREG(30) xor iRNDREG(27) ;

  -- shift register
  process ( nRESET , CLOCK )
  begin
    if ( nRESET = '0' ) then
      iRNDREG <=  X"340550AF" ;
    elsif rising_edge( CLOCK ) then
      iRNDREG <= iRNDREG(30 downto 0) & iRGEN ;
    end if ;
  end process ;

end Behavioral;

 外部から出力指令を与えない限り、乱数の出力が
 ないようにしておきました。

 XC9572に回路を入れるとして、ピンアサインを
 次のように定義。

# system
NET "nRESET" loc = "P39" ;
NET "CLOCK"  loc = "P5"  ;

# white noise
NET "RDAT<0>" loc = "P1" ;
NET "RDAT<1>" loc = "P2" ;
NET "RDAT<2>" loc = "P3" ;
NET "RDAT<3>" loc = "P4" ;
NET "RDAT<4>" loc = "P6" ;
NET "RDAT<5>" loc = "P7" ;
NET "RDAT<6>" loc = "P8" ;
NET "RDAT<7>" loc = "P9" ;

# enable 
NET "ENA"  loc = "P11" ;
NET "XMSB" loc = "P22" ;

 乱数を8ビットで出力するとして、D/A変換には
 R-2Rの抵抗ラダーを採用します。




目次

inserted by FC2 system