ModelSIM에서 적색 신호를 어떻게 디버깅합니까?


11

조합 부분에는 NAND 게이트 만 사용하고 순차 논리에는 D 플립 플롭을 사용하여 상태 머신을 설계해야합니다. 모든 것은 1ghz / 53의 시계에서 실행되어야합니다.

"우리는 당신을 위해 숙제를하지 않겠다"고 저를 공격하기 전에, 며칠간의 일을 투자 한 후 모든 것을 폐기하고 모든 것을 다시 엄격하게 시작했다고 말씀 드리겠습니다. 나는 이것을 스스로하고 싶지만 프로젝트의 가장 간단한 부분에서 무작위로 정의되지 않은 신호를 얻습니다.

자, 우선 다음 이미지에서 상태 머신과 진리 테이블을 수행했습니다.

상태 머신 다이어그램 및 진리표

다음은 kmaps입니다.

Kmaps

D 플립 플롭 D = Q +의 경우 조합 로직의 배선 (한 번 단순화 된 블록으로 구축)이 너무 어렵지 않아야합니다.

그러나 첫 번째 문제는 Q3 +의 테스트 벤치에서 발생합니다. Q3 +를 위해 정리 한 빠른 다이어그램 정보를 단순화하기 위해 여기에 넣겠습니다.

Q3 +의 로직 다이어그램

나중에 포스트에서 VHDL에서 실제로 입력을 in1Q3plus에서 in11Q3plus (11 inputs)로 명명했음을 알 수 있습니다. 이것은 최종 블록이 아니기 때문에 (최종 조합 논리 블록은 4 개의 Q3 +, Q2 +, Q1 +, Q0 + 블록으로 구성됨) 신호에).

NAND 게이트를 사용하여 모든 것을 만들어야했기 때문에 구조적인 접근 방식을 취해야했습니다. 모든 게이트는 기본적으로 NAND 게이트를 기반으로하며 복잡성을 증가시킵니다 (단, AND, OR 및 NOT 게이트 만 NAND 게이트에서 구조적으로 작성 됨). 그런 다음 3 개의 입력이있는 OR 게이트, 3 개의 입력이있는 AND 게이트 및 5 개의 입력이있는 OR 게이트 (논리 다이어그램 예에서와 같이)가 각각 이전 2 개의 입력 AND & OR 게이트를 기반으로합니다.

모든 테스트 벤치는 Q3plus 하나 (위의 다이어그램)까지 작동했습니다. 테스트 절차는 시뮬레이션 창에서 편리하게 신호를 볼 수 있도록 각 입력에 대한 신호를 만드는 것입니다. 예를 들어, 3 입력 AND 게이트에 대한 다음 신호가 있습니다.

process
    begin
a1 <= '0' ; wait for 4ns;
a1 <= '1' ; wait for 4ns;
end process;

process
    begin
b1 <= '0' ; wait for 8ns;
b1 <= '1' ; wait for 8ns;
end process;

process
    begin
c1 <= '0' ; wait for 2ns;
c1 <= '1' ; wait for 2ns;
end process;

연결은 다음과 같습니다.

u1:ANDgate3 port map(A=>a1, B=>b1, C=>c1, fand3=>q1 );

Q3plus 테스트 벤치를 시뮬레이션하려고 할 때 문제가 발생합니다. 2ns 기간으로 0에서 1로 뒤집어지는 테스트 신호에서 가장 예상치 않은 오류가있는 것 같습니다. |. 나는 다른 모든 게이트 테스트 벤치가 완벽하게 작동했다고 다시 한번 테스트 벤치의 코드를 게시 할 것입니다.

library ieee;
use ieee.std_logic_1164.all;

entity Q3plusTEST is
end Q3plusTEST;

architecture behavior of Q3plusTEST is
    component Q3plus is
    port(outQ3plus: out std_Logic;
    in1Q3plus: in std_Logic;
    in2Q3plus: in std_Logic;
    in3Q3plus: in std_Logic;
    in4Q3plus: in std_Logic;
    in5Q3plus: in std_Logic;
    in6Q3plus: in std_Logic;
    in7Q3plus: in std_Logic;
    in8Q3plus: in std_Logic;
    in9Q3plus: in std_Logic;
    in10Q3plus: in std_Logic;
    in11Q3plus: in std_Logic);
    end component;

signal a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11, outsignal: std_logic;

begin
    process
    begin
        a1<= '0'; wait for 4ns;
        a1<= '1'; wait for 4ns;
    end process;

    process
    begin
        a2<= '0'; wait for 6ns;
        a2<= '1'; wait for 6ns;
    end process;

    process
    begin
        a3<= '0'; wait for 8ns;
        a3<= '1'; wait for 8ns;
    end process;

    process
    begin
        a4<= '0'; wait for 10ns;
        a4<= '1'; wait for 10ns;
    end process;

    process
    begin
        a5<= '0'; wait for 12ns;
        a5<= '1'; wait for 12ns;
    end process;

    process
    begin
        a6<= '0'; wait for 14ns;
        a6<= '1'; wait for 14ns;
    end process;

    process
    begin
        a7<= '0'; wait for 16ns;
        a7<= '1'; wait for 16ns;
    end process;

    process
    begin
        a8<= '0'; wait for 18ns;
        a8<= '1'; wait for 18ns;
    end process;

    process
    begin
        a9<= '0'; wait for 20ns;
        a9<= '1'; wait for 20ns;
    end process;

    process
    begin
        a10<= '0'; wait for 22ns;
        a10<= '1'; wait for 22ns;
    end process;

    process
    begin
        a1<= '0'; wait for 24ns;
        a1<= '1'; wait for 24ns;
    end process;

    U1: Q3plus port map(in1Q3plus=> a1, in2Q3plus=>a2, in3Q3plus=>a3, in4Q3plus=>a4, in5Q3plus=>a5, in6Q3plus=>a6, in7Q3plus=>a7, in8Q3plus=>a8, in9Q3plus=>a9, in10Q3plus=>a10, in11Q3plus=>a11, outQ3plus=> outsignal); end behavior;

실제 Q3plus 블록의 코드는 다음과 같습니다.

 library ieee;
use ieee.std_logic_1164.all;

entity Q3plus is
    port(outQ3plus: out std_Logic;
    in1Q3plus: in std_Logic;
    in2Q3plus: in std_Logic;
    in3Q3plus: in std_Logic;
    in4Q3plus: in std_Logic;
    in5Q3plus: in std_Logic;
    in6Q3plus: in std_Logic;
    in7Q3plus: in std_Logic;
    in8Q3plus: in std_Logic;
    in9Q3plus: in std_Logic;
    in10Q3plus: in std_Logic;
    in11Q3plus: in std_Logic);
    end Q3plus;

architecture behavior of Q3plus is
    component ORgate5 is
    port(AOR5: in std_logic;
    BOR5: in std_logic;
    COR5: in std_logic;
    DOR5: in std_logic;
    EOR5: in std_logic;
    f5or: out std_logic);
    end component;

    component ANDgate3 is
    port(A: in std_logic;
    B: in std_logic;
    C: in std_logic;
    fand3: out std_logic);
    end component;

    component ANDgate is
    port(xand: in std_logic;
    yand: in std_logic;
    fand: out std_logic);
    end component;

signal z1,z2,z3,z4,z5: std_logic;

begin
    U1: ANDgate port map(xand=> in1Q3plus, yand=> in2Q3plus, fand=> z1);
    U2: ANDgate port map(xand=> in3Q3plus, yand=> in4Q3plus, fand=> z2);
    U3: ANDgate port map(xand=> in5Q3plus, yand=> in6Q3plus, fand=> z3);
    U4: ANDgate port map(xand=> in7Q3plus, yand=> in8Q3plus, fand=> z4);
    U5: ANDgate3 port map(A=> in9Q3plus, B=> in10Q3plus, C=> in11Q3plus, fand3=> z5);
-- urmeaza toate portile de mai sus conectate la OR5
    U6: ORgate5 port map(AOR5=>z1, BOR5=> z2, COR5=> z3, DOR5=> z4, EOR5=> z5, f5or=> outQ3plus);

end behavior;

테스트 벤치는 다음과 같은 결과를 생성합니다.

테스트 벤치 시뮬레이션

보시다시피, 첫 번째 신호에는 이상한 동작이 있고 다음 신호는 정상적으로 작동하며 마지막 신호는 완전히 정의되지 않습니다. 물론 최종 신호 인 출력에 결함이 있습니다.

간단한 질문은 다음과 같습니다. 신호가 손상되기 시작하는 위치를 어떻게 추적합니까? 나는이 프로그램의 혼란에서 완전히 멍청한듯한 느낌이 들었습니다. 그리고 나는 이것을 끝내고 싶습니다. 모든 답변에 미리 감사드립니다.


1
아주 좋은 질문 발표. Modelsim은 18nsVHDL 표준에서 특히 불법을 허용 할 수 있지만 그대로 유지됩니다. 추상 리터럴 18과 식별자 라는 두 개의 개별 어휘 요소가 있습니다 ns. IEEE Std 1076-2008 15.3 어휘 요소, 구분 기호 및 구분 기호를 참조하십시오. 4- ".... 식별자 또는 추상 리터럴과 인접한 식별자 또는 추상 리터럴 사이에 하나 이상의 구분 기호가 필요합니다." wait 문에서 증분 시간을 사용하여 자극을 하나의 프로세스로 작성할 수 있습니다. 구동되지 않은 신호를 직접 가리 켰을 수 있습니다.
user8352

자극 부분을 자세히 설명해 주시겠습니까? 나는 당신이 말한 것이 내가 많이 찾은 것이지만 아무것도 발견하지 못했다고 생각합니다. 모든 테스트 벤치가 생성하는 경고. 18 에서 ns 사이의 공백을 입력해야 합니까? 편집 확인, 문제였습니다.
Azurium

답변:


9

변경 사항에 대한 질문과 실제로 일치하는 적절한 테스트 벤치와 코드를 보는 것이 좋습니다 ...

신호가 손상되는 두 가지 쉬운 방법이 있습니다.

  • 여러 신호 소스에서 구동
  • 어떤 곳에서도 운전하지 마십시오

이제 A11은 계속 'U'로 유지되며 드라이버가 없음을 나타냅니다. A1은 유효한 값과 'X'개의 유효하지 않은 값을 번갈아 사용하지만 둘 이상의 드라이버가 있음을 나타냅니다.

이를 염두에두고 A1과 A11을 운전하는 곳의 코드를 검토하십시오.

당신은 웃을거야 ...

문제의 "디버깅 방법"을 확장하려면 신호가 예상 소스에서 구동되지 않았다는 의심을 불러 일으킨 경우 Modelsim의 "drivers"명령을 사용하여 신호의 드라이버를 나열 할 수 있습니다. 약간 더 장황한 VHDL을 작성하고 각 프로세스에 레이블을 지정한 경우 코드를 검토하지 않고도 동일한 대답을 얻을 수 있습니다 ...

예 :

Drive_A1 : process
begin
   a1 <= '0' ; wait for 4ns;
   ... etc

2
몇 시간 동안 축적 된 모든 좌절은 좋은 웃음으로 터졌습니다. 또한 나는 내 얼굴을 잘 때려야한다. 테스트 벤치가 작동하는 것 같습니다!
Azurium
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.