2012-09-12 7 views
-1

에서 변수를 공유하고이 프로그램 (sequence.vhd)의 합성에 약간의 문제가있어 :내가 VHDL에서 (ISE 프로젝트 네비게이터와) 새로 온 사람 VHDL

LIBRARY ieee ; 
USE ieee.std_logic_1164.all; 

PACKAGE mypack IS 
VARIABLE counter: STD_LOGIC := '0' ; 
VARIABLE simultaneous : STD_LOGIC := '0' ; 
END PACKAGE mypack; 

LIBRARY ieee ; 
USE ieee.std_logic_1164.all; 
use IEEE.STD_LOGIC_ARITH.ALL; 

use IEEE.STD_LOGIC_UNSIGNED.ALL; 


--library work; 

USE WORK.mypack.ALL; 

ENTITY secuencia IS 

PORT(
    polh   : IN STD_LOGIC; --uno 
    polv   : IN STD_LOGIC; --cero 
    seq   : OUT std_logic_vector(8 downto 0):= (others => 'Z') 
); 

END secuencia; 


ARCHITECTURE registro OF secuencia IS 

SIGNAL stack : std_logic_vector(1000 downto 0); 


BEGIN 
PROCESS(polh, polv) 
BEGIN 

     IF (polh'event) and (polh='1') and (polv='0')THEN 
      stack(counter) <= '1'; 
      counter := counter +1; 

     ELSE IF (polv'event) and (polv='1') and (polh='0')THEN 
      stack(counter) <= '0'; 
      counter := counter +1; 
     ELSE IF (polh'event) and (polh='1') and (polv'event) and 
(polv='1') THEN 
      simultaneous := simultaneous+1; 

     END IF; 

END PROCESS; 

END registro; 

을 그리고 이러한 처음 두를 수 있습니다 오류 :

5 행. 여기서는 SHARED 변수 만 선언 할 수 있습니다.

Line 6. 여기서 SHARED 변수 만 선언 할 수 있습니다.

그래서 내 선언 된 변수에 문제가 있습니다 ... 목적은 아키텍처에서 사용하는 것입니다. 나는 초보자 문제라고 확신하지만 해결책을 볼 수는 없다. 정말 고마워!

PD : @Martin 톰슨을 돕는

들으 : 미안, 제대로


UPDATE를 코드를 포맷 할 수 있습니다. 나는 당신이 제안한 것과 지금 다른 타입이나 문제가있는 것을했습니다. 나는 그것에 대해 조사해 왔지만 그것은 광범위한 원인을 가진 것으로 보인다. 여기 코드

ENTITY secuencia IS 
PORT(
    polh   : IN STD_LOGIC; --uno 
    polv   : IN STD_LOGIC; --cero 
    Pedido  : IN STD_LOGIC; 
    DatoListo : OUT STD_LOGIC; 
    seq   : OUT std_logic_vector(1000 downto 0):= (others => 'Z') 

); 
END secuencia; 


ARCHITECTURE registro OF secuencia IS 

SIGNAL stack : std_logic_vector(1000 downto 0); 


BEGIN 

PROCESS(polh, polv, Pedido) 

variable counteria : natural; 
variable Listo : integer; 
variable simultaneo : integer; 
BEGIN 
    IF (counteria < 1000) THEN 

     IF (polh'event AND polh='1' AND polv='0') THEN 
     --IF (polh='1' AND polv='0') THEN 
      stack(counteria) <= '1'; 
      counteria := counteria +1; 


     ELSIF (polv'event AND polv='1' AND polh='0') THEN 
     --ELSIF (polv='1' AND polh='0') THEN  
       stack(counteria) <= '0'; 
       counteria := counteria +1;     

     ELSIF (polh'event AND polh='1' AND polv'event AND polv='1') THEN 
      simultaneo := simultaneo+1; 

END IF; 

    ELSIF (counteria = 1000)THEN 
     DatoListo <='1'; 
      IF (Pedido='1')THEN 
       Seq <= stack;    
      counteria := 0; 
     DatoListo <='0'; 
      END IF;         
    END IF; 

END PROCESS; 
END registro; 

이며이 오류를

라인 25 준다 : 신호가 합성 될 수 없다> 스택 나쁜 동기 설명. 에 사용중인 설명 스타일이 현재 소프트웨어 릴리스에서 지원되는 이 아닌 동기 요소 (레지스터, 메모리 등)를 설명합니다.


업데이트 2 :

나는 일부 내용을 변경하고 프로그램의 일부를 주석이, 그것은 합성 :

PROCESS(polh, polv, Pedido) 

    variable counteria : natural := 0; 
    variable Listo : integer; 
    variable simultaneo : integer; 
BEGIN 
    IF (counteria < 1000) THEN 
     IF rising_edge(polh) THEN 
      IF (polv='0') THEN 
       stack(counteria) <= '1';  
       counteria := counteria + 1; 
      END IF; 
--  ELSIF rising_edge(polv) THEN 
--   IF (polh='0') THEN 
--    stack(counteria) <= '0'; 
--    counteria := counteria +1;     
--   END IF; 
--  END IF; 

     ELSIF (counteria = 1000)THEN 
      DatoListo <='1'; 
       IF (Pedido='1')THEN 
        Seq <= stack;    
      counteria := 0; 
      DatoListo <='0'; 
     ENDIF;           

    END IF; 

END PROCESS; 
END registro; 

이 합성을. 그러나 ELSIF rising_edge(polv) THEN 부분의 주석을 제거하면 동일한 문제가 발생합니다. Signal stack<counteria<9:0>> cannot be synthesized...

답변

4

지금은 공유 변수를 사용하지 마십시오. 먼저 몇 가지 기본 사항을 이해해야합니다.

counter의 값을 다른 곳으로 "보내려면"port에 항목을 추가하고 거기에 쓰기를해야합니다.

저장 장치로 사용하려는 경우 내부에서 사용하는 process 안에 신고하십시오.

마지막으로,이 합성 희망하는 경우, 당신은 port을 통해 들어오는 클럭 신호가 필요하고 당신은 표준 클럭 처리해야 : 당신이 당신의 polh 및 polv 입력을 찾으려면

을 변경하려면 이전 값을 저장하고 현재 값과 다른지 확인해야합니다.

process (clk) 
    variable vpol_last : std_logic; 
begin 
    if rising_edge(clk) then 
     if vpol_last /= vpol then -- it's changed 
     -- do something 
     end if; 
     vpol_last := vpol; -- store current value for next time. 
     -- etc. 
    end if; 
end process; 
관련 문제