Làm cách nào để gỡ lỗi tín hiệu màu đỏ trong ModelSIM?


11

Tôi phải thiết kế một máy trạng thái chỉ sử dụng các cổng NAND cho phần tổ hợp và D flip flop cho logic tuần tự. Mọi thứ nên chạy ở đồng hồ 1ghz / 53.

Bây giờ trước khi bạn tấn công tôi với "chúng tôi sẽ không làm bài tập về nhà cho bạn", hãy để tôi nói với bạn rằng tôi đã loại bỏ mọi thứ sau khi đầu tư nhiều ngày làm việc và bắt đầu làm lại mọi thứ một cách nghiêm ngặt hơn. Tôi muốn tự mình làm điều này, nhưng tôi liên tục nhận được các tín hiệu không xác định ngẫu nhiên trong các phần đơn giản nhất của dự án và điều đó thật khó chịu.

Ok, trước hết tôi có máy trạng thái và bảng chân lý tôi đã làm cho nó trong hình ảnh sau:

Sơ đồ máy trạng thái và Bảng chân lý cho nó

Điều tiếp theo là các kmaps:

Các Kmaps

Vì với D flip flops D = Q +, nên việc nối dây của logic tổ hợp (một khi tôi xây dựng nó thành một khối đơn giản hóa) không quá khó.

Nhưng vấn đề đầu tiên của tôi phát sinh trong băng ghế thử nghiệm cho Q3 +. Hãy để tôi đặt ở đây để đơn giản hóa thông tin một sơ đồ nhanh mà tôi đã tổng hợp cho Q3 +:

Sơ đồ logic cho Q3 +

Sau đó trong bài đăng bạn sẽ thấy rằng trong VHDL tôi thực sự đã đặt tên các đầu vào in1Q3plus thành in11Q3plus (11 đầu vào), vì đây không phải là khối cuối cùng (khối logic tổ hợp cuối cùng bao gồm bốn khối Q3 +, Q2 +, Q1 +, Q0 + có dây để tín hiệu).

Vì vậy, tôi phải làm mọi thứ bằng cổng NAND, điều này có nghĩa là tôi phải thực hiện một cách tiếp cận cấu trúc. Mọi cổng về cơ bản đều dựa trên các cổng NAND, và sau đó nó được xây dựng phức tạp (nhưng chỉ các cổng AND, OR và KHÔNG được viết theo cấu trúc từ các cổng NAND). Sau đó, tôi có một cổng OR với 3 đầu vào, một cổng AND có 3 đầu vào và một cổng OR có 5 đầu vào (như trong ví dụ về sơ đồ logic), mỗi cổng dựa trên 2 cổng AND & OR trước đó.

Mỗi băng ghế thử nghiệm cho đến khi Q3plus một (sơ đồ trên) hoạt động. Quy trình kiểm tra của tôi là tạo tín hiệu cho từng đầu vào, để tôi có thể thuận tiện xem các tín hiệu trong cửa sổ Mô phỏng. Ví dụ: tôi có các tín hiệu sau cho cổng AND 3 đầu vào:

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;

Và các kết nối sẽ trông như thế này:

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

Vì vậy, vấn đề phát sinh khi tôi muốn mô phỏng băng ghế thử nghiệm Q3plus. Có vẻ như tôi có một lỗi mà nó ít được mong đợi nhất, trên tín hiệu kiểm tra chỉ chuyển từ 0 sang 1 với khoảng thời gian 2ns: |. Tôi sẽ đăng ở đây mã của băng ghế thử nghiệm, một lần nữa tuyên bố rằng mọi băng ghế thử nghiệm cổng khác đều hoạt động hoàn hảo:

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;

Và mã cho khối Q3plus thực tế là:

 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;

Băng ghế thử nghiệm tạo ra kết quả sau:

thử nghiệm mô phỏng băng ghế

Như bạn có thể thấy, tín hiệu đầu tiên có một số hành vi kỳ lạ, các tín hiệu tiếp theo hoạt động tốt và tín hiệu cuối cùng hoàn toàn không được xác định. Tất nhiên tín hiệu cuối cùng, đầu ra, là thiếu sót.

Câu hỏi đơn giản của tôi sẽ là: làm thế nào để tôi theo dõi nơi tín hiệu bắt đầu bị hỏng? Tôi cảm thấy như một noob hoàn toàn trong mớ hỗn độn của một chương trình, và tôi thực sự muốn hoàn thành nó. Cảm ơn trước cho bất kỳ phản ứng.


1
Trình bày câu hỏi rất tốt. Mặc dù Modelim có thể cho phép 18nsnó đặc biệt bất hợp pháp trong tiêu chuẩn VHDL và sẽ vẫn như vậy. Có hai yếu tố từ vựng riêng biệt trừu tượng theo nghĩa đen 18và định danh ns. Xem IEEE Std 1076-2008 15.3 Các yếu tố từ điển, dấu phân cách và dấu phân cách, đoạn. 4 - ".... Ít nhất một dấu phân cách được yêu cầu giữa một định danh hoặc một nghĩa đen trừu tượng và một định danh liền kề hoặc nghĩa đen trừu tượng". Bạn có thể đã viết kích thích của mình dưới dạng một quá trình sử dụng thời gian gia tăng trong các câu lệnh chờ. Nó có thể đã chỉ ra tín hiệu không mong muốn trực tiếp.
dùng8352

Bạn có thể vui lòng giải thích về phần kích thích? Tôi nghĩ những gì bạn nói là thứ tôi cũng đã tìm kiếm rất nhiều nhưng không tìm thấy gì: những cảnh báo mà mỗi chiếc ghế thử nghiệm của tôi tạo ra. Bạn có nghĩa là tôi nên gõ một khoảng trắng giữa 18ns ? chỉnh sửa Xác minh, đó là vấn đề.
Azurium

Câu trả lời:


9

Rất vui khi thấy một testbench và mã phù hợp thực sự phù hợp với câu hỏi để thay đổi ...

Có hai cách dễ dàng để tín hiệu bị hỏng:

  • lái nó từ một số nguồn tín hiệu
  • đừng lái nó từ bất kỳ

Bây giờ A11 vẫn là "U" trong suốt, cho thấy nó không có trình điều khiển. Trong khi A1 thay thế giữa các giá trị hợp lệ và 'X', cho thấy nó có nhiều hơn một trình điều khiển.

Với ý nghĩ đó, hãy xem lại mã của bạn nơi bạn lái xe A1 và A11.

Bạn sẽ cười...

Để mở rộng phần "cách gỡ lỗi" của câu hỏi: làm dấy lên nghi ngờ rằng các tín hiệu không được điều khiển từ các nguồn dự kiến, bạn có thể sử dụng lệnh "trình điều khiển" của Modelim để liệt kê các trình điều khiển theo tín hiệu. Nếu bạn đã viết VHDL dài dòng hơn một chút và dán nhãn cho mỗi quy trình, điều đó sẽ giúp bạn có cùng một câu trả lời mà không phải xem lại mã của mình ...

ví dụ

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

2
Tất cả sự thất vọng đó tích lũy trong nhiều giờ bùng nổ trong một tiếng cười tốt. Ngoài ra tôi xứng đáng một cái tát tốt trên khuôn mặt của tôi. Các băng ghế thử nghiệm dường như đang làm việc bây giờ!
Azurium
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.