2012-12-11 2 views
3

7 세그먼트 디스플레이에서 텍스트를 스크롤하려고합니다. 텍스트는 키보드에서 입력되며 BASYS2를 FPGA로 사용하고 있습니다. 내 키보드 인터페이스는 7 개의 세그먼트 컨트롤러뿐만 아니라 완료되었습니다. 그러나 나는 shifter 모듈에 문제가 있습니다. 스캔 코드를 처리 할 때 바이트 배열을 사용해야합니다. 나는 그런 타입을 패키지로 선언했다. 그것은 "mypackage2"이다. 그러나, 내가 이해하는 한, shifter 모듈은 해당 유형, 즉 "reg_array"를 사용할 수 없습니다. 나는 무엇을 바꾸어야합니까, 아니면 제가 여기서 누락 된 것이 있습니까? VHDL을 처음 접했을 때 몇 가지 기본적인 오류가 있었을 것입니다. 또한 필자가 작성한 패키지는 창의 왼쪽에있는 프로젝트 계층 구조에 나타나지 않습니다. 어떤 도움을 주셔서 감사합니다. 고맙습니다.패키지의 VHDL 유형 선언

편집 : 다음과 같이 reg 배열을 사용하지 않아야합니다. Data_out : out reg_array(REGSIZE-1 downto 0) 너비가 이미 지정되었으므로주의했습니다. 패키지 여기

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use work.mypackage2.all; 

entity shifter is 
    generic (REGSIZE : integer := 16); -- Text will be composed of 16 characters 
    port(clk  : in std_logic; 
     Scan_Dav : in std_logic; -- this is '1' when there is a new scancode 
     Data_in : in std_logic_vector(7 downto 0); --scancode from keyboard 
     Data_out : out reg_array); 
end shifter; 

architecture bhv of shifter is 

     signal shift_reg : reg_array; 
begin 
    process (clk, Scan_Dav) begin 
     if rising_edge(clk) then 
      if Scan_Dav = '1' then 
       shift_reg(REGSIZE-1 downto 1) <= shift_reg(REGSIZE-2 downto 0); 
       shift_reg(15) <= shift_reg(0); 
      end if; 
     end if; 
     Data_out <= shift_reg; 
    end process; 
end bhv; 

것 : 그래서 난 내 코드를 조금 변경 3. 다음

에 오류의 수를 감소 쉬프터 모듈의

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

package mypackage2 is 

    subtype reg is std_logic_vector(7 downto 0); -- a byte 
     type reg_array is array (0 to 15) of reg; -- array of bytes 

end mypackage2; 


package body mypackage2 is 

end mypackage2; 

그리고이 최신 오류가 있습니다 :

ERROR:HDLParsers:807 - "F:/Projeilk/Shifter.vhd" Line 22. shift_reg can not be used with range downto. 
ERROR:HDLParsers:807 - "F:/Projeilk/Shifter.vhd" Line 22. shift_reg can not be used with range downto. 

답변

0

바이트 배열의 크기를 두 번 정의했습니다. 패키지 파일에서 reg_array을의 고정 배열로 정의했습니다. 그러나 아키텍처에서 reg_array의 크기를 다시 (REGSIZE-1 downto 0)으로 정의하여 shift_reg 크기를 지정하려고 시도하는 것처럼 reg_array은 가변 크기 배열입니다.

당신은 reg_array의 고정 선언을 유지하고 shift_reg 정의 할 수 있습니다 :

signal shift_reg : reg_array; 

또는 shift_reg의 당신의 정의를 유지하고 같은 가변 폭 배열로 reg_array을 선언

type reg_array is array (natural range <>) of reg; -- variable-length array of bytes 

이 코드에 몇 가지 오류가있을 수 있지만이 중 일부는이 문제에서 계단식으로 표시 될 수 있습니다.

+0

예, 방금 언급 한 문제를 발견하고 변경했습니다. 답변 주셔서 감사합니다. 나머지 오류는 어떻습니까? – John

+0

'reg_array'에 대한 패키지 정의는'to'를 사용하지만 코드에서'downto'를 사용하고 있습니다. 혼합해서 사용할 수 없습니다. 일관성있게 변경하실 수 있습니다. 그리고'scan_dav'는 부울로 변환 될 수 없습니다. '(Scan_dav = '1') 시도해보십시오. –

+0

도움을 주셔서 감사합니다. 내 최상위 모듈에 대한 질문이있을 수도 있습니다. – John

-1

내가 여기에서 대신 새로운 주제를 여는 것 (새로운 문제)

을 계속했다. 내가 잘못했으면 내 실수를 바로 잡으십시오.

내 모든 코드가 성공적으로 컴파일되었지만 필자가 작성한 것과 모순이 무엇인지에 대해 의견이 일치하지 않는다고 생각합니다.

이 내 최고 수준의 모듈입니다 :

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
use work.mypackage2.all; 

entity TopModule is 
    generic (REGSIZE : integer := 16); 
    Port (Clk  : in STD_LOGIC; 
      Reset  : in std_logic; -- System Reset 
      PS2_Clk : in std_logic; -- Keyboard Clock Line 
      PS2_Data : in std_logic; -- Keyboard Data Line 
      ANODES  : out STD_LOGIC_VECTOR(3 downto 0); 
      SEGMENTS : out STD_LOGIC_VECTOR(6 downto 0)); 
end TopModule; 

architecture Top_arch of TopModule is 

    component clkdivide is 
     Port (clkin: in std_logic; 
       clkout:out std_logic); 
    end component; 

    component SevenSegmentController is 
     Port ( CLK: in std_logic; 
        DEC1, DEC2, DEC3, DEC4: in std_logic_vector(7 downto 0); 
        SEGMENTS: out std_logic_vector(6 downto 0); 
        ANODES: out std_logic_vector(3 downto 0)); 
    end component; 

    component KeyboardController is 
     port (Clk : in std_logic; -- System Clock 
       Reset : in std_logic; -- System Reset 
       PS2_Clk : in std_logic; -- Keyboard Clock Line 
       PS2_Data : in std_logic; -- Keyboard Data Line 
       DoRead : in std_logic; -- From outside when reading the scan code 
       Scan_Err : out std_logic; -- To outside : Parity or Overflow error 
       Scan_DAV : out std_logic; -- To outside when a scan code has arrived 
       Scan_Out : out std_logic_vector(7 downto 0)); 
    end component; 

    component shifter is 
     port (clk  : in std_logic; 
       Scan_Dav : in std_logic; 
       Data_in : in std_logic_vector(7 downto 0); 
       Data_out : out reg_array); 
    end component; 

    signal clk2, scandav, scanerr, doread: std_logic; 
    signal sarray: reg_array; 
    signal datain: std_logic_vector(7 downto 0); 

    begin 
     L1: SevenSegmentController 
      port map (SEGMENTS=> SEGMENTS, CLK=> clk2, ANODES=> ANODES, 
      DEC1=> sarray(15), DEC2=> sarray(14), 
      DEC3=> sarray(13),DEC4=> sarray(12)); 

     L2: clkdivide 
      port map (clkin=>Clk , clkout=>clk2); 

     L3: KeyboardController 
      port map (Clk=> clk2, Reset=> Reset, PS2_Clk=> PS2_Clk, 
      PS2_Data=> PS2_Data, DoRead=> doread, Scan_Err=> scanerr, 
      Scan_DAV=> scandav, Scan_Out=>datain); 

     L4: shifter 
      port map (clk=>clk2, Scan_Dav=>scandav, Data_in=> datain, 
      Data_out=>sarray); 
end Top_arch; 

이것은 RTL의 개략도이다 : RTL of Top Module

구성 요소가 서로 키보드 인터페이스의 출력으로 연결되지는 쉬프터로 이동해야하고 쉬프터를 7 개 세그먼트 컨트롤러로 전환하지만, 쉬프터는 모두 자체적으로 작동합니다. 여기에 어떤 문제가 있습니까?

+0

내 연결을 두 번 확인했는데 모두 올바른 순서와 장소에있는 것 같습니다. 무엇이 문제일까요? – John

+0

새로운 문제인 경우 새로운 질문을 만드십시오.이 사이트는 "포럼"이 아니며 잘 정의 된 질문 모음입니다. –

+0

그래, 그럼 새로운 질문을하겠습니다. – John

0

아직 댓글을 추가 할 수 없으므로 다른 답변을 추가해야합니다.빠르게 보니 최상위 레벨에 아무런 문제가없는 것으로 나타났습니다. 나는 RTL 출력이 최적화의 희생자라고 생각한다. 특히 KeyboardController의 출력이 합성에서 최적화되어 있습니까? DoRead 입력은 구동되지 않습니다. 이는 원인 일 수 있지만 KeyboardController 코드를 보지 않고서 만 볼 수 있습니다.

+0

> 특히 KeyboardController의 출력이 최적화되어 있지 않다면 > 합성이되지 않습니까? 나는 당신이 여기서 의미하는 것을 얻지 못했습니다. 나는 DoRead가 나쁜 것을 일으킬 것이라고 생각하지 않지만, 키보드 인터페이스 모듈과 최상위 모듈에서 제거 할 경우를 대비하여. 문제가 계속되는 경우 :/ – John

+0

모든 모듈을 개별적으로 테스트하기로 결정 했으므로 각 모듈에 대한 프로젝트를 만들기 시작했습니다. 쉬프터는 편집하지 않는 것 같습니다. 나는 2 개의 오류를 받고 있는데, 그것은 나에게 완전한 이방인이다. 다음은 오류입니다 : 'ERROR : Pack : 2309 - "IOB"타입의 결합 된 콤보가 너무 많아서이 장치에 맞지 않습니다. 오류 : Pack : 18 - 지정된 장치 및 패키지에 대한 디자인이 너무 큽니다. 설계 요약 섹션을 확인하여 에 대한 리소스 요구 사항이 귀하의 설계가 디바이스에서 사용 가능한 리소스를 초과하는지 확인하십시오. ' 이 오류는 무엇을 의미합니까? (나는 shifter btw에서 scan_dav 입력을 취소했다.) – John

+0

이렇게 스팸을해서 유감이지만 몇 가지 진전을 보았다. 나는 패키지에서 regarray의 너비를 4로 줄 였고 shifter 모듈이 성공적으로 컴파일되었습니다. 배열의 크기를 변경하지 않고이 오류를 없애려면 어떻게해야합니까? 왜냐하면 4 자릿수의 7 세그먼트 표시를 사용하기 때문에 4 개의 요소를 사용하지 않을 것이기 때문입니다. 편집 : shifter 모듈 자체의 회로도가 여전히 손상되었습니다. 그것은 선언 한 in/output을 가지고 있지는 않지만 대신에 두 개의 입력과 하나의 출력을 I, S 및 O로 사용합니다. 저는 정말로 여기에서 혼란 스럽습니다. – John