2014-02-07 2 views
1

순차 논리 엔티티를 다른 프로세스에서 활용하는 방법을 이해하는 데 어려움이 있습니다. 이 프로세스는 각 클록 신호에서 입력 값을 읽거나 계산을 수행하는 상태 머신입니다. 이 계산은 완료하기 위해 많은 반복이 필요합니다. 그러나 각 반복은 동일한 반복에서 필요한 몇 가지 결과를 얻기 위해 위의 원칙과 동일한 원칙을 사용하여 정의 된 하위 엔터티 (두 상태 상태 머신, 시계 기반 반복)를 사용한다고 가정합니다. 내가보기로vhdl 프로세스 내에서 엔티티를 사용하는 방법

, 나는 두 가지 옵션이 있습니다 : 주요 기업 내에서 별도의 프로세스에서 subentity을 구현하고 주요 프로세스와 subentity 실행과 동기화를 중단 할 수있는 방법을 찾는

  1. 을 -이 것 주요 엔티티 (함수 호출과 같은 기본적으로 뭔가) 과정 내에서 subentity를 구현하는 주요 기업
  2. 의 클럭 신호를 사용하고 subentity 실행이 완료 될 때까지의 주요 과정을 중단 할 수있는 방법을 찾는 의미 -이 나를 단단하게 행할 것 같다 메인 클럭 신호 사용하기

그 중 누구도 매우 매력적이며 다소 복잡해 보입니다. 그래서 나는 경험 많은 통찰력과 설명을 요구하고 있습니다. 나는 실종 된보다 전통적인 방식이 있기를 정말로 바란다.

답변

2

"엔터티"는 VHDL Entity이 원하는 것일 수도 있고 그렇지 않을 수도 있다고 제안하므로 불행한 단어 선택입니다.

대략 올바른 줄을 생각하고 있지만, "매력적"이라고하는 것이 조금 명확하지 않습니다. 그래서 당신의 목표는 불분명하고 도움이되기 어렵습니다.

는 별도로 두 가지 접근 방법을 취하려면

(1) 별도의 프로세스가 작업을 분할에 대한 유효한 방법이다. 그들은 자연스럽게 병렬로 작동 할 것입니다. 동기식 디자인 (모범 사례, 가장 안전하고 단순하며 가장 보편적 인 것은 아니지만 은 다른 어떤 이유를 강요하는 것입니다) 일반적으로 두 시스템은 동일한 시스템 클록으로 클럭됩니다.

동기화가 필요할 때 추가 "핸드 쉐이킹"신호를 사용할 수 있습니다. 일반적으로 주 SM은 서브 시스템을 시작하고, 서브 시스템이 확인 응답 할 때까지 기다린 후, 서브 시스템이 완료 될 때까지 다시 대기 한 후 결과를 사용합니다.

main_sm : process(clk) 
begin 
    if rising_edge(clk) then 
     case state is 
     ... 
     when start_op => 
     subsystem_start <= '1'; 
     if subsystem_busy = '1' then 
      state <= wait_subsystem; 
     end if; 

     when wait_subsystem <= 
     subsystem_start <= '0'; 
     if subsystem_busy = '0' then 
      state <= use_result; 
     end if; 

     when use_result => -- carry on processing 
     ... 
     end case; 
    end if; 
end process main_sm; 

일치하는 서브 시스템을 작성하는 방법을 분명히해야 ...

이 서브 시스템의 처리를 완료하는 데 큰 변수 또는 알 수없는 시간이 걸리는 경우 가장 유용합니다 - 아마도 UART로 문자를 전송 , 또는 직렬 분배기. 조심스럽게 하드웨어를 저장하기 위해 몇 개의 최상위 프로세스가 하위 시스템에 액세스하도록 허용 할 수 있습니다 (서브 시스템 핸드 쉐이킹 로직은 한 번에 하나의 프로세스에만 응답합니다!)

(2) 하위 엔터티가 구현 될 경우 이 과정에서 서브 프로그램, 즉 추측 해 보면 프로 시저 또는 함수로 작성되어야합니다. 프로세스에 로컬로 선언되면 해당 프로세스의 환경에 액세스 할 수 있습니다. 그렇지 않으면 매개 변수를 전달할 수 있습니다. 서브 프로그램이 현재 클럭주기 내에서 완료 될 수 있으면 가장 간단합니다. 코드를 체계적으로 구조화 할 수 있습니다.

main_sm : process(clk) 

    procedure wait_here (level : std_logic; nextstate : state_type) is 
    begin 
     subsystem_start <= level; 
     if subsystem_busy = level then 
     state <= nextstate; 
     end if; 
    end wait_here; 

begin 
    ... 
     when start_op => 
     wait_here('1', wait_subsystem); 
     when wait_subsystem <= 
     wait_here('0', use_result); 

핸드 셰이 킹이 재 작성 위에서 작동한다고하고 몇 가지 신디사이저 도구에 있지만, 다른 서브 프로그램에 대한 좋은 합성 지원을 제공하지 않을 수도 있습니다 :

은 당신의 합성 툴에서 다음을보십시오.

시뮬레이션 프로세스에서 여러 클록 사이클에 걸쳐있는 서브 프로그램을 사용할 수 있습니다. 그 민감성 목록을 제거하고 대신

wait until rising_edge(clk); 

을 사용하는 것이 트릭입니다. 이것은 또한 잠재적으로 합성 가능하며, 예를 들면 다음과 같이 사용될 수있다. 프로 시저의 루프에서 그러나 일부 합성 툴은 그것을 거부하고 Xilinx XST는 실제로 더 나은 것이 아니라 실제로 더 나 빠지고 있습니다.

+0

답장을 보내 주셔서 감사합니다. 사양을 제공하기 위해 문자 그대로 VHDL 엔터티를 의미했습니다. 호소력있는 방법은 복잡한 과정으로 나에게 호소하는 것이 었습니다. 단순한 솔루션을 원했기 때문에 핸드 셰이크 방식을 제공하는 것이 좋았을 것입니다. 나는 의도적으로 일반적인 수준의 문제에 대한 나의 이해를 깊게하기 위해 코드 세그먼트를 생략했다. 나는 당신의 제안을 구현할 것입니다. – user3209815

관련 문제