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