Boolean trong VHDL? Khi nào '0/1' thất bại?


7

Tôi đã tự hỏi tại sao VHDL có kiểu dữ liệu boolean? Khi nào '0' hoặc '1' không cắt nó? Là boolean thực hiện khác nhau?

Câu trả lời:


4

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.


5

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 BOOLEANtrang 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 ý BOOLEANnên được sử dụng để mô tả chức năng và được chuyển đổi thành "mức logic" sau này.


4

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!


Trích dẫn tốt các ví dụ.
nhiệt tình

-2

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 đủ.


1
Không có gì để ngăn chặn tín hiệu là boolean
Martin Thompson
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.