Câu trả lời:
Có nhiều cách để trả lời câu hỏi của bạn, nhưng điều quan trọng nhất cần nhớ là VHDL được phát triển bởi một ủy ban của Bộ Quốc phòng Hoa Kỳ và do đó chúng ta không nên mong đợi những thứ như logic hoặc lý do-- thật mỉa mai vì chúng ta đang nói về Hợp lý.
VHDL là một ngôn ngữ "gõ mạnh" . Thông thường trong một ngôn ngữ được gõ mạnh có nhiều loại dữ liệu khác nhau tương tự nhau, nhưng chỉ khác nhau về cách sử dụng. Ví dụ: bạn có thể sử dụng kiểu dữ liệu số nguyên, SLV hoặc liệt kê cho biến máy trạng thái. Nhưng đối với hầu hết các tình huống, chỉ có một enum hoạt động "tối ưu".
Phương pháp này giúp ngăn lập trình viên giới thiệu các lỗi, đồng thời cho trình biên dịch tự do nhất để tạo mã / logic được tối ưu hóa. Với một biến trạng thái, trình biên dịch có thể chọn mã hóa trạng thái tối ưu nhất (một nóng, nhị phân, v.v.). Nếu biến trạng thái được triển khai dưới dạng số nguyên hoặc SLV, trình biên dịch sẽ không có khả năng đó. Ngoài ra, với số nguyên hoặc SLV, bạn có thể dễ dàng vô tình gán các trạng thái không hợp lệ cho biến trạng thái, tạo ra các lỗi khó chẩn đoán.
Điều tương tự cũng đúng với Boolean, mặc dù khó thấy lợi ích hơn. Nó buộc người viết phải rõ ràng ở đâu, nếu không gõ dữ liệu mạnh, mã sẽ ít "rõ ràng" hơn. Về cơ bản, thật khó để phạm sai lầm với Boolean.
Tác dụng phụ của các loại dữ liệu mạnh là một số thứ "dài dòng" hơn trong VHDL. Đó là cái giá chúng tôi phải trả.
Nhưng để trả lời trực tiếp câu hỏi của bạn ...
"Khi nào 0/1 không cắt nó?" Về mặt kỹ thuật, 0/1 sẽ hoạt động. Vấn đề chính với 0/1 là nó không cho bạn biết trạng thái nào là "đúng". Là tín hiệu đó hoạt động thấp, hay hoạt động cao? Bạn không thể nhầm lẫn với Boolean TRUE / FALSE. Nhưng trong tất cả các trường hợp khác, 0/1 sẽ hoàn toàn ổn. Boolean ở đó, không phải vì lý do kỹ thuật, mà vì lý do lập trình hậu cần.
"Boolean có được thực hiện khác không?" Không hẳn vậy. Logic được tạo ra không khác gì so với giải pháp thay thế được viết tốt. Một lần nữa, nó chủ yếu ở đó để giữ cho lập trình viên không vô tình làm điều gì đó ngu ngốc.
Tôi cũng nên chỉ ra rằng khi thảo luận về các ngôn ngữ lập trình được gõ mạnh và yếu, mọi thứ nhanh chóng biến thành một cuộc tranh luận triết học - và các sắc thái của cuộc tranh luận này không thể được hiểu đầy đủ trừ khi bạn đã viết rất nhiều mã (hơn 1 triệu dòng mã) . Một điều khác thường bị bỏ qua là có mức độ dữ liệu được gõ mạnh và yếu. Tôi sẽ mô tả C và bị gõ yếu, và C ++ như được gõ mạnh, mặc dù các bảng trên Wikipedia cho thấy hầu hết mọi ngôn ngữ đều được gõ mạnh.
Thành thật là một vấn đề của hương vị.
Trong LRM năm 1993 có một ghi chú liên quan đến BOOLEAN
trang 36, trong đó nêu rõ
loại BOOLESE có thể được sử dụng để mô hình hóa logic hoạt động cao hoặc hoạt động thấp tùy thuộc vào các chức năng chuyển đổi cụ thể được chọn đến và từ loại BIT
Hàm ý BOOLEAN
nên được sử dụng để mô tả chức năng và được chuyển đổi thành "mức logic" sau này.
Nó được thực hiện cho rõ ràng
Tôi chắc chắn trong mọi trường hợp bạn sử dụng boolean, bạn có thể sử dụng '0/1'. Cá nhân (khi sử dụng các biến được đặt tên khéo léo) Tôi nghĩ rằng nó chỉ làm cho mã sạch hơn / mô tả nhiều hơn để viết một cái gì đó như:
signal OutputEnabled : boolean;
và sau đó giới thiệu nó như là
if ( not(OutputEnabled) ) then
Output <= 'Z';
else
Output <= Input;
end if;
thay vì
signal OutputEnabled : std_logic;
và sau đó giới thiệu nó như là
if ( OutputEnabled /= '1' ) then
Output <= 'Z';
else
Output <= Input;
end if;
Một ứng dụng tuyệt vời cho booleans là trừu tượng các tín hiệu hoạt động thấp để tôi không phải tìm hiểu mã để tìm kiếm mọi nơi mà tôi thực hiện so sánh nếu tôi phải thay đổi cực tính.
Mới cho VHDL-2008
Điều thú vị là tiêu chuẩn VHDL 2008 mới thực hiện chuyển đổi các điều kiện ngầm thành boolean cho bạn mà không cần truyền, vì vậy bạn có thể viết:
signal OutputEnabled : std_logic;
và sau đó giới thiệu nó như là
if ( not(OutputEnabled) ) then
Bao gồm khá tốt trong quan điểm của tôi!
Kiểu boolean dành cho các biến trong đó 0/1 dành cho tín hiệu . Tôi không biết cụ thể sự khác biệt giữa tín hiệu và biến nhưng tôi tin rằng các biến chỉ có thể được sử dụng bên trong và không được định tuyến đến các chân bên ngoài, nhưng có các biến cho phép bạn thực hiện các tác vụ cấp cao hơn mà các bit không đủ.