Mặc dù tôi đã gắn thẻ bài tập về nhà này, nó thực sự là một khóa học mà tôi tự làm một cách miễn phí. Dù sao, khóa học này được gọi là "Từ Nand đến Tetris" và tôi hy vọng một người nào đó ở đây đã xem hoặc tham gia khóa học để tôi có thể nhận được một số trợ giúp. Tôi đang ở giai đoạn mà tôi đang xây dựng ALU với ngôn ngữ hdl được cung cấp. Vấn đề của tôi là tôi không thể lấy chip để biên dịch đúng cách. Tôi gặp lỗi khi cố gắng đặt cờ đầu ra cho ALU. Tôi tin rằng vấn đề là tôi không thể subscript bất kỳ biến trung gian, kể từ khi tôi chỉ cố gắng thiết lập các cờ để đúng hay sai dựa trên một số biến ngẫu nhiên (nói một lá cờ đầu vào), tôi không nhận được các lỗi. Tôi biết vấn đề không phải là với các chip tôi đang cố gắng sử dụng kể từ khi tôi đang sử dụng tất cả các chip được xây dựng.Làm cách nào để đặt cờ đầu ra cho ALU trong khóa học "Nand to Tetris"?
Đây là con chip ALU của tôi cho đến nay:
/**
* The ALU. Computes a pre-defined set of functions out = f(x,y)
* where x and y are two 16-bit inputs. The function f is selected
* by a set of 6 control bits denoted zx, nx, zy, ny, f, no.
* The ALU operation can be described using the following pseudocode:
* if zx=1 set x = 0 // 16-bit zero constant
* if nx=1 set x = !x // Bit-wise negation
* if zy=1 set y = 0 // 16-bit zero constant
* if ny=1 set y = !y // Bit-wise negation
* if f=1 set out = x + y // Integer 2's complement addition
* else set out = x & y // Bit-wise And
* if no=1 set out = !out // Bit-wise negation
*
* In addition to computing out, the ALU computes two 1-bit outputs:
* if out=0 set zr = 1 else zr = 0 // 16-bit equality comparison
* if out<0 set ng = 1 else ng = 0 // 2's complement comparison
*/
CHIP ALU {
IN // 16-bit inputs:
x[16], y[16],
// Control bits:
zx, // Zero the x input
nx, // Negate the x input
zy, // Zero the y input
ny, // Negate the y input
f, // Function code: 1 for add, 0 for and
no; // Negate the out output
OUT // 16-bit output
out[16],
// ALU output flags
zr, // 1 if out=0, 0 otherwise
ng; // 1 if out<0, 0 otherwise
PARTS:
// Zero the x input
Mux16(a=x, b=false, sel=zx, out=x2);
// Zero the y input
Mux16(a=y, b=false, sel=zy, out=y2);
// Negate the x input
Not16(in=x, out=notx);
Mux16(a=x, b=notx, sel=nx, out=x3);
// Negate the y input
Not16(in=y, out=noty);
Mux16(a=y, b=noty, sel=ny, out=y3);
// Perform f
Add16(a=x3, b=y3, out=addout);
And16(a=x3, b=y3, out=andout);
Mux16(a=andout, b=addout, sel=f, out=preout);
// Negate the output
Not16(in=preout, out=notpreout);
Mux16(a=preout, b=notpreout, sel=no, out=out);
// zr flag
Or8way(in=out[0..7], out=zr1); // PROBLEM SHOWS UP HERE
Or8way(in=out[8..15], out=zr2);
Or(a=zr1, b=zr2, out=zr);
// ng flag
Not(in=out[15], out=ng);
}
Vì vậy, vấn đề xuất hiện khi tôi đang cố gắng để gửi một phiên bản subscripted của 'ra khỏi' để chip Or8Way. Tôi đã thử sử dụng một biến khác với 'out', nhưng với cùng một vấn đề. Sau đó, tôi đọc rằng bạn không thể subscript biến trung gian. Tôi nghĩ có lẽ nếu tôi gửi biến trung gian cho một số con chip khác, và con chip đó đã ghi lại nó, nó sẽ giải quyết vấn đề, nhưng nó có cùng lỗi. Thật không may tôi chỉ không thể nghĩ ra một cách để thiết lập các cờ zr và ng mà không có subscripting một số biến trung gian, vì vậy tôi thực sự bị mắc kẹt!
Chỉ cần để bạn biết, nếu tôi thay thế các dòng có vấn đề với những điều sau đây, nó sẽ biên dịch (nhưng không cho kết quả đúng vì tôi chỉ sử dụng một số đầu vào ngẫu nhiên):
// zr flag
Not(in=zx, out=zr);
// ng flag
Not(in=zx, out=ng);
Bất cứ ai có bất cứ ý tưởng?
Chỉnh sửa: Đây là số appendix of the book for the course chỉ định cách thức hoạt động của hdl. Cụ thể nhìn vào phần 5 mà nói về xe buýt và nói: "Một pin nội bộ (như v ở trên) có thể không được subscripted".
Chỉnh sửa: Đây là lỗi chính xác tôi nhận được: "Dòng 68, Không thể kết nối đầu ra của cổng với một phần". Các thông báo lỗi là loại khó hiểu mặc dù, vì đó dường như không phải là vấn đề thực tế. Nếu tôi chỉ thay thế "Or8way (in = out [0..7], out = zr1);" với "Or8way (in = false, out = zr1);" nó sẽ không tạo ra lỗi này, đó là những gì dẫn tôi tìm kiếm trong phụ lục và thấy rằng biến ngoài, vì nó được bắt nguồn như là trung gian, không thể được subscripted.
Tại sao câu hỏi này bị đóng? Nó chắc chắn đã giúp rất nhiều du khách được chứng minh bằng những upvotes và câu trả lời. –
Bỏ phiếu để mở lại, bởi vì câu hỏi là về một vấn đề phổ biến khi giải quyết một vấn đề trong một khóa học trực tuyến nổi tiếng. –