目次
前
次
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の抵抗ラダーを採用します。
目次
前
次