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 の場合)】