저는 VHDL로 구적법 디코더를 구현 중이며 두 가지 해결책을 제시했습니다.VHDL 구적 디코더 : 순차/결합 논리
방법 1에서 모든 논리는 시계 및 재설정에 민감한 하나의 프로세스 내에 배치됩니다. Spartan-3A에서는 4 개의 슬라이스, 7 개의 FF 및 4 개의 입력 LUT를 사용합니다.
코드 1
architecture Behavioral of quadr_decoder is
signal chan_a_curr : std_logic;
signal chan_a_prev : std_logic;
signal chan_b_curr : std_logic;
signal chan_b_prev : std_logic;
begin
process (n_reset, clk_in) begin
if (n_reset = '0') then
-- initialize internal signals
chan_a_curr <= '0';
chan_a_prev <= '0';
chan_b_curr <= '0';
chan_b_prev <= '0';
-- initialize outputs
count_evt <= '0';
count_dir <= '0';
error_evt <= '0';
elsif (clk_in'event and clk_in = '1') then
-- keep delayed inputs
chan_a_prev <= chan_a_curr;
chan_b_prev <= chan_b_curr;
-- read current inputs
chan_a_curr <= chan_a;
chan_b_curr <= chan_b;
-- detect a count event
count_evt <= ((chan_a_prev xor chan_a_curr) xor
(chan_b_prev xor chan_b_curr));
-- determine count direction
count_dir <= (chan_a_curr xor chan_b_prev xor
count_mode);
-- detect error conditions
error_evt <= ((chan_a_prev xor chan_a_curr) and
(chan_b_prev xor chan_b_curr));
end if;
end process;
end Behavioral;
방법 2 및 별도의 순차 프로세스로 조합 논리를 분할한다. 2 개의 슬라이스, 4 개의 FF 및 4 개의 입력 LUT를 사용합니다.
architecture Behavioral of quadr_decoder is
signal chan_a_curr : std_logic;
signal chan_a_prev : std_logic;
signal chan_b_curr : std_logic;
signal chan_b_prev : std_logic;
begin
process (n_reset, clk_in) begin
if (n_reset = '0') then
-- initialize internal signals
chan_a_curr <= '0';
chan_a_prev <= '0';
chan_b_curr <= '0';
chan_b_prev <= '0';
elsif (clk_in'event and clk_in = '1') then
-- keep delayed inputs
chan_a_prev <= chan_a_curr;
chan_b_prev <= chan_b_curr;
-- read current inputs
chan_a_curr <= chan_a;
chan_b_curr <= chan_b;
end if;
end process;
process (chan_a_prev, chan_a_curr, chan_b_prev, chan_b_curr) begin
-- detect a count event
count_evt <= ((chan_a_prev xor chan_a_curr) xor
(chan_b_prev xor chan_b_curr));
-- determine count direction
count_dir <= (chan_a_curr xor chan_b_prev xor count_mode);
-- detect error conditions
error_evt <= ((chan_a_prev xor chan_a_curr) and
(chan_b_prev xor chan_b_curr));
end process;
end Behavioral;
내가 (행동) 코드를 시뮬레이션 코드, 두 결과가 잘 보인다. 그러나 두 방법 모두 똑같이 유효하다고 나는 믿을 수 없습니다. 누군가가 어떤 방법으로 어떤 빛을 비춰 줄 수 있습니까?