2014-04-14 7 views
4

저는 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; 

내가 (행동) 코드를 시뮬레이션 코드, 두 결과가 잘 보인다. 그러나 두 방법 모두 똑같이 유효하다고 나는 믿을 수 없습니다. 누군가가 어떤 방법으로 어떤 빛을 비춰 줄 수 있습니까?

답변

4

코드 스 버전 2 개 구동 출력 된 조합 반면 코드 버전 1 개 레지스터 출력 :

  • count_evt
  • count_dir
  • error_evt이 3 부가 플립 차지

(그리고 Spartan 3에는 슬라이스 당 2x 레지스터가 있기 때문에 2 개의 슬라이스가 더 필요함을 의미합니다).

코드에 의해 수행되는 논리적 기능은 동일하지만 동일한 기능을 수행하지는 않습니다. 출력을 다른 블록 입력에 연결하면 버전 2의 경우 1 사이클 이전에 결과를 사용할 수 있습니다. 다운 스트림 블록이 이러한 입력을 받아 더 많은 로직을 적용한다고 가정하면 버전 2는 경로가 더 길어지고 따라서 달성 가능한 빈도가 발생합니다 낮습니다.

일부 지침에서는 타이밍을 개선하기 위해 일반적으로 출력을 블록에 등록해야한다고 설명합니다. 때로는 여러 개의 블록을 조합하여 함께 묶을 수 있기를 원합니다. 모든 가이드 라인에는 항상 예외가 있습니다. 출력이 조합 적으로 유도되는 경우 선언문에 주석을다는 것이 좋습니다. 특히 예리한 경우 일반을 사용하여 출력 레지스터를 선택적으로 만들 수 있습니다.