Tôi cần tạo một ứng dụng để tạo các mạch logic và xem kết quả. Điều này chủ yếu được sử dụng trong các khóa học điện toán A-Level (Anh, 16-18 tuổi nói chung). Tôi không bao giờ thực hiện bất kỳ ứng dụng như thế này, vì vậy tôi không chắc chắn về thiết kế tốt nhất để lưu trữ mạch và đánh giá kết quả (ở tốc độ có thể phục hồi, nói 100Hz trên máy tính lõi đơn 1.6Ghz). Thay vì có mạch được xây dựng từ các cổng cơ bản (và, hoặc, và, vv) Tôi muốn cho phép các cổng này được sử dụng để tạo "chip", sau đó có thể được sử dụng trong các mạch khác (ví dụ: bạn có thể muốn để tạo chip đăng ký 8 bit hoặc bộ thêm 16 bit).Tạo trình mô phỏng cổng logic
Vấn đề là số cổng tăng ồ ạt với các mạch như vậy, nếu mô phỏng làm việc trên mỗi cổng riêng biệt, nó sẽ có 1000 cổng để mô phỏng, vì vậy tôi cần đơn giản hóa các thành phần này mạch để chúng có thể được mô phỏng nhanh chóng.
Tôi nghĩ về việc tạo bảng chân lý cho từng thành phần, sau đó mô phỏng có thể sử dụng bảng tra cứu để tìm kết quả đầu ra cho một đầu vào nhất định. Vấn đề xảy ra với tôi mặc dù kích thước của các bảng như vậy tăng mạnh với đầu vào. Nếu một chip có 32 đầu vào, thì bảng chân lý cần 2^32 hàng. Điều này sử dụng một lượng lớn bộ nhớ trong nhiều trường hợp hơn là sử dụng như vậy là không thực tế cho các thành phần không tầm thường, nó cũng sẽ không hoạt động với các chip có thể lưu trữ trạng thái của chúng (ví dụ như các thanh ghi) vì chúng không thể được biểu diễn đơn giản bảng đầu vào và đầu ra.
Tôi biết tôi chỉ có thể mã hóa những thứ như chip đăng ký, tuy nhiên vì mục đích giáo dục tôi muốn nó để mọi người có thể tạo thành phần của riêng họ cũng như xem và chỉnh sửa triển khai cho các chuẩn. Tôi đã xem xét cho phép tạo ra và chỉnh sửa các thành phần như vậy bằng cách sử dụng mã (ví dụ: dll hoặc ngôn ngữ kịch bản), để một trình bổ sung ví dụ có thể được biểu diễn dưới dạng "output = inputA + inputB", tuy nhiên giả định rằng các sinh viên đã thực hiện đủ chương trình ngôn ngữ đã cho để có thể hiểu và viết các plugin như vậy để bắt chước các kết quả của mạch của chúng, đó là không phải là trường hợp ...
Có cách nào khác để thực hiện một mạch logic boolean và đơn giản hóa nó một cách tự động sao cho mô phỏng có thể xác định đầu ra của một thành phần một cách nhanh chóng?
Để lưu trữ các thành phần, tôi đã nghĩ đến việc lưu trữ một số loại cấu trúc cây, sao cho mỗi thành phần được đánh giá khi tất cả các thành phần liên kết với đầu vào của nó được đánh giá.
ví dụ như xem xét: AB + C Các mô phỏng sẽ đầu tiên đánh giá cổng AND, và sau đó đánh giá HOẶC cổng sử dụng đầu ra của cổng AND và C.
Tuy nhiên nó chỉ xảy ra với tôi rằng trong trường hợp các kết quả đầu ra liên kết ngược với đầu vào, sẽ gây ra bế tắc vì có đầu vào sẽ không bao giờ được đánh giá ... Làm thế nào tôi có thể khắc phục điều này, vì chương trình chỉ có thể đánh giá một cổng tại một thời điểm?
Tôi tự hỏi ... trong một trình mô phỏng phổ quát như vậy, sẽ không thể tạo ra "buzzer" (thuật ngữ tự phát minh)? Đó là một số mạch mà bật và tắt càng nhanh càng tốt. Nếu vậy, bạn cũng sẽ cần phải thiết lập một cái gì đó giống như một khung tham chiếu thời gian, nếu không kết quả có thể không được xác định ... –
Ahh, tôi đã nghĩ về một kế hoạch như vậy. Hãy tưởng tượng một cổng XOR nơi đầu ra của nó được kết nối với một trong các đầu vào của nó và đầu vào khác là điều khiển do người dùng điều khiển. Ngay khi người dùng đưa 1 cho đầu vào có thể điều khiển, cổng XOR sẽ tự động. Hành vi đúng trong trường hợp này là gì? –
Err, không xác định. Chắc chắn điều duy nhất để làm sau đó là phát hiện ra nó và nói với người sử dụng nó không được phép? Actaully theo một mô phỏng hiện tại (http://www.tetzl.de/java_logic_simulator.html) đầu ra là số không, mà im chắc chắn là không thực sự là trường hợp ... –