2014-11-27 10 views
0

현재 프로젝트 중간에 있으며 단일 사이클 CPU를 설계하려고합니다. 파이프 라이닝없이이 작업을 수행하는 것은 디자인의 복잡성을 크게 증가시킬 것이기 때문입니다. 나는 이것을 배우면서 단순히 아기를 밟고 있습니다. 나는 내가 이전에 만든 구성 요소를 사용하여 프로그램 카운터 (PC)를 코딩하려고 시도하고있는이 부분에 갇혀있다.신호 및 이전에 만들어진 구성 요소를 사용하는 VHDL 프로그램 카운터?

내 디자인의 모델은 picture here입니다. 죄송합니다. 어둠이 어째서 나왔는지 모르겠지만 클릭하면 올바르게 표시됩니다. PC와 theMUX는 모두 32 비트 구성 요소이므로 가산기도 있다고 가정합니다.

여기에 제가 제공 한 코드가 있습니다. 구현은 41 행의 begin 문에서 시작됩니다. 지금 당장은 신경 쓰지 말고 그냥 시도하고있는 무작위 횡설수설입니다.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 
--------------------------------------------------- 
entity pc_update is 
    port(clk: in std_logic; -- clock 
     incH_ldL: in std_logic; -- increment PC = PC + 4 when high, 
           -- load PCInput when low 
    PCInput: in std_logic_vector(31 downto 0); -- external input for PC 
    InstrAddr: out std_logic_vector(31 downto 0)); -- instruction address 
end entity pc_update; 
---------------------------------------------------- 
architecture pc_update_arch of pc_update is 
    component register32 is 
     port(clr: in std_logic; -- async. clear 
       clk: in std_logic; -- clock 
       ld: in std_logic; -- load 
       D: in std_logic_vector(31 downto 0); -- data input 
       Q: out std_logic_vector(31 downto 0)); -- data output 
    end component register32; 

    component mux2to1_32 is 
     port(sel: in std_logic; -- selection bit input 
       X0: in std_logic_vector(31 downto 0); -- first input 
       X1: in std_logic_vector(31 downto 0); -- second input 
       Y: out std_logic_vector(31 downto 0)); -- output 
    end component mux2to1_32; 

    signal PC_current: std_logic_vector(31 downto 0); -- the current state of PC reg   
    signal PC_add_4: std_logic_vector(31 downto 0); -- output from the adder 
    signal PC_next: std_logic_vector(31 downto 0); -- output from the MUX 

    begin 

    PC: register32 Port Map(
     clk, Q, clr, D);  
    MUX: mux2to1_32 Port Map(
     X0,sel,X1,Y); 

    process (incH_ldL) 
     begin 
     wait until (clk = '1'); 
     if incH_1dL = '0' then 
      InstrAddr <= X0; 
     else InstrAddr <= X1; 
     end if; 
    end process; 

end architecture pc_update_arch; 

그래서 나는 단지 신호가 작동하는 방법의 희미한 생각하고, 내가 디자인에 구성 요소를 구현하는데 얼마나 아무 생각이 상당히 새로운입니다. 나는 또한 내가 사전에 덧셈자를 만들지 않았다고 혼란 스럽다. 지금 그것을 추측하는 구성 요소로 사용해야합니까?

여하튼, 필자는 포트 맵핑과 같이 검색 할 때마다 다른 점을 시도했습니다. 그러나 나는 항상 어떤 종류의 에러를 얻는다. 현재받는 에러는 객체 Q, clr, D가 사용되지만 선언되지 않았다는 것이다. 어떻게 선언 할 수 있습니까? 이러한 명령문을 제거하면 X0, X1 및 Y 개체에 대한 오류가 간단히 반복됩니다. 올바른 방향으로 도움을 주시면 감사하겠습니다. 고마워요!

또한, 단지 경우에 당신은 , 레지스터

library ieee ; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 

--------------------------------------------------- 

entity register32 is port( 
clr: in std_logic; -- async. clear 
clk: in std_logic; -- clock 
ld: in std_logic; -- load 
D: in std_logic_vector(31 downto 0); -- data input 
Q: out std_logic_vector(31 downto 0)); -- data output 
end entity register32; 

---------------------------------------------------- 

architecture register32_arch of register32 is 

begin 
    process(clk, clr) 
    begin 
     if clr = '1' then 
      q <= x"00000000"; 
     elsif rising_edge(clk) then 
      if ld = '1' then 
       q <= d; 
      end if; 
     end if; 
    end process; 
END register32_arch; 

내가 제대로 이런 짓을하는 경우

library ieee ; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 

--------------------------------------------------- 

entity mux2to1_32 is 
port(sel: in std_logic; -- selection bit input 
X0: in std_logic_vector(31 downto 0); -- first input 
X1: in std_logic_vector(31 downto 0); -- second input 
Y: out std_logic_vector(31 downto 0)); -- output 

end entity mux2to1_32; 

---------------------------------------------------- 

architecture mux2to1_32_arch of mux2to1_32 is 
begin 

    Y <= X1 when (SEL = '1') else X0; 

end architecture mux2to1_32_arch; 

는 편집이 좋아, 아무 생각이,하지만 난 재 작성하지 먹스를 그들이 필요 포트 맵. 포트 이름 (sel, clk, X0, X1..etc)이 "사용되지만 초기화되지 않았습니다."라는 오류가 발생했습니다. 그래서 clr, clk 및 ld가 초기 값을 갖습니다. 그것은 오류가 사라 졌어요. 또한 내 프로젝트에 register32 및 mux2to1_32 VHDL 파일을 추가 한 적이 없다는 것을 깨달았으며, 그렇게 한 후에 다른 오류를 제거했습니다.

그래서 코드가 컴파일되면서 테스트를 위해 VWF 시뮬레이션 파일을 프로젝트에 포함 시켰지만 결과가 정확하지 않을 것임을 알고 있습니다.

아직 잘못 된 것은 모두 알지 못하지만 PC_add_4를 사용해야합니다.이 값은 다음을 필요로합니다. 기본적으로 (PC_current + 4)가되지만,이 작업을 수행하는 방법을 모르겠다.

내가 어떤 하드웨어 할당을 해달라고 때문에 617,451,515,여기

, 그들은 도움이 경우, 핀 관련 오류는 추측 errors..im의 내 목록

PC: register32 Port Map(
    clr => '0', 
    clk => '0', 
    ld => '1', 
     Q => PC_current, 
     D => PC_next 
    ); 

MUX: mux2to1_32 Port Map(
    sel => incH_ldL, 
    X0 => PCInput , 
    X1 => PC_add_4, 
    Y => PC_next 
    ); 

process (incH_ldL) 
    begin 
    if (rising_edge(clk)) then 
     if incH_ldL = '0' then 
      InstrAddr <= PC_current; 
     else InstrAddr <= PC_add_4; 
     end if; 
    end if; 
end process; 

(다른 모든 동일) 그리고 코드의 업데이트 된 부분이다 아직 만들지 않았다.

  1. 경고 (10541) : VHDL 신호 선언 pc_update.vhd에서 경고 (38) : 신호가 값 또는 명시 적 디폴트 값을 지정하지 않았기 때문에 신호 "PC_add_4"에 대한 사용 암시 적 기본 값입니다.암시 적 기본값을 사용하면 의도하지 않은 디자인 최적화가 발생할 수 있습니다.

  2. 경고 (10492) : pc_update.vhd에서 VHDL 프로세스 문 경고 (61) : 신호 "CLK"이 프로세스 문 안에 읽을 수 있지만 프로세스 문의 감도 목록에없는됩니다

  3. 경고 : 출력 핀은 VCC 또는 GND에 붙어

  4. 경고 : 설계 로직을 구동하지 않는다 (34)의 입력 단자 (S)를 포함

  5. 경고 : 실측치 출력 핀 부하 용량 할당없이 32 개의 출력 핀

  6. ,
  7. 경고 : 모든 미사용 핀 예약 설정은 지정되지 않았으며 기본값은 '출력 출력으로 사용'입니다.

  8. 경고 : 현재 평가 모드

  9. 경고의 Quartus II 소프트웨어를 사용하고 있기 때문에 파일을 프로그램 생성 할 수 없습니다 : 없음 정확한 핀 위치 : 없음 경로 분석을

  10. 치명적 경고 타이밍 없다을 찾을 수 없습니다 (66) 총 핀

SECOND 편집의 66 핀 할당 (들) 는 그래서 그래 내가 고쳐 추가하여 내 코드 PC_add_4 < = (PC_current + 4); 을 입력하고 프로세스 감도 목록에 "clk"를 추가하십시오. 그러나 내 시뮬레이션의 파형은 여전히 ​​잘못된 것으로 생각됩니다 (here).

단순히 PCInput을 InstrAddr에 전달하는 것보다 명확한 신호로 incH_lDL을 처리하는 것으로 보입니다. 이는 포트 맵의 기본값 인 '0'으로 설정 한 것이 원인 일 가능성이 큽니다. 나는 "사용되었지만 선언되지 않은"오류를 내게 주었기 때문에 이전에이 작업을 수행했습니다. 아프다 그것을 망쳐 놓고 내 발견을 게시하십시오.

내가 같은 내 코드를 편집 한

세 번째 편집 :

process (incH_ldL, clk) 
    begin 
    if rising_edge(clk) then 
     if (incH_ldL = '0') then 
      InstrAddr <= PCInput ; 
     else InstrAddr <= PC_add_4; 
     end if; 
    end if; 
end process; 

내 시뮬레이션을 지금 보여줍니다 incH_lDL = 0, PCInput이 InstrAddr에로드 될 때, 그러나, incH_lDL = 1, 그것은 단순히 값 '4'를로드하고, 다음과 같은 모든 클록주기의 시작에서 증가하지 않습니다 ... PC_current를 사용해야합니다. 그러나 어떻게 확신 할 수없는 지 ........ 한 신호를 할당 할 수 없습니다. "PC_current < = PCInput"과 같은 다른 문자로 변환합니다. 나는 더 많은 것을 시도 할 것이고, 어떤 시점이라도 크게 감사 할 것입니다.

네 번째 편집 여전히이 글을 읽고 모든 독서를 지니고있는 누구에게나.

내 구현에 PC_next 및 PC_current를 사용하려고했지만 "PC_next"오류에 대해 여러 개의 상수 드라이버가 실행되었습니다.

MY 프로세스 코드 :

process (incH_ldL, clk, PC_next, PC_current) 
    begin 
    if rising_edge(clk) then 
     if (incH_ldL = '0') then 
      PC_next <= PCInput; 
     else PC_next <= PC_add_4; 
     end if; 
    end if; 
    InstrAddr <= PC_current;  
end process; 

나는이 과제는 루프 내에서 할 때이 오류가 오는 것을 알고? 나는 진정으로 다음에 무엇을 시도 할 것인가를 놓치고 있습니다.

답변

0

첫 번째 코드의 포트 맵을 신호로 포팅해야합니다. 포트 맵에 구성 요소의 포트 이름을 지정하고 있는데 이는 올바르지 않습니다. 당신이하고 싶은 것은 그 구성 요소를 연결할 수있는 신호를 만들어 포트 맵 필드에 배치하는 것입니다 (이미지의 연결과 일치시키기 위해).

+0

감사합니다. 나는이 사이트와 그것의 기계공에 아직도 새롭다, 나는 코멘트가없는 경우에 당신이주의하는 경우에 나는 모른다, 그러나 나는 세부 사항 및 몇몇 새로운 부호를 추가했다. –

+0

좋아, 파형을 사용하여 디자인을 시뮬레이션하려고하면 좋습니다. 경고는 개발 보드/FPGA 중 하나에서 디자인을 에뮬레이션하려고 할 때 핀과 관련된 의미입니다. 따라서 시뮬레이션을위한 것에 대해 걱정하지 마십시오. 에뮬레이션하려는 경우 입력 및 출력을 매핑하려는 위치를 결정해야합니다. 시작하려면 dev에 보드에 따라 altera는 .csv 파일을 가져올 수 있습니다. 프로젝트에 가져올 수 있습니다. – blueprint

+0

좋아요, 그럼 내 유일한 관심사는 처음 두 경고와 관련이 있어야합니까? 큰. 다시 게시하기 전에 모든 솔루션을 찾는 데 어려움을 겪습니다. –