Nビットグレイコードカウンタ

掲載ページ:147、リスト番号:6.9

【VHDL記述】


library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;


entity GRAY_CODE_COUNTER is

generic( N : integer := 4 ); -- FFの数(Nビットグレイコードカウンタ)

port( CK, RESET : in std_logic;

Y : out std_logic_vector(N-1 downto 0));

end GRAY_CODE_COUNTER;


architecture BEHAVIOR of GRAY_CODE_COUNTER is


signal GRAY, COUNT : std_logic_vector(N-1 downto 0);


begin

process ( RESET, CK ) begin

if ( RESET = '1' ) then

COUNT <= (others => '0');

elsif ( CK'event and CK = '1' ) then

COUNT <= GRAY;

end if;

end process;


process (COUNT)

variable BIN : std_logic_vector(N-1 downto 0);

begin

-- グレイコードから2進数への変換

BIN(N-1) := COUNT(N-1);

for I in N-2 downto 0 loop

BIN(I) := BIN(I+1) xor COUNT(I);

end loop;


-- 2進数のカウントアップ

BIN := BIN + 1;


-- 2進数からグレイコードへの変換

GRAY(N-1) <= BIN(N-1);

for I in N-2 downto 0 loop

GRAY(I) <= BIN(I+1) xor BIN(I);

end loop;

end process;


Y <= COUNT;


end BEHAVIOR;

【Verilog-HDL記述】


module GRAY_CODE_COUNTER (

CK, RESET,

Y

);


parameter N = 4; // FFの数(Nビットグレイコードカウンタ)

input CK, RESET;

output[ N-1 : 0 ] Y;


reg[ N-1 : 0 ] COUNT;


always @ ( posedge CK or posedge RESET ) begin

if ( RESET ) begin

COUNT <= 0;

end else begin

COUNT <= FUNC_GRAY( COUNT );

end

end


assign Y = COUNT;


function[ N-1 : 0 ] FUNC_GRAY;

input[ N-1 : 0 ] COUNT;

reg[ N-1 : 0 ] BIN;

integer I, J;

begin

// グレイコードから2進数への変換

BIN[ N-1 ] = COUNT[ N-1 ];

for ( I = N-2; I >= 0; I = I - 1 ) begin

BIN[ I ] = BIN[ I + 1 ] ^ COUNT[ I ];

end

// 2進数のカウントアップ

BIN = BIN + 1;

// 2進数からグレイコードへの変換

FUNC_GRAY[ N-1 ] = BIN[ N-1 ];

for ( J = N-2; J >= 0; J = J - 1 ) begin

FUNC_GRAY[ J ] = BIN[ J + 1 ] ^ BIN[ J ];

end

end

endfunction

endmodule

【合成結果(N=4 の場合)】