Về mặt phần cứng ta không thể thu được kết quả như tui mong đợi : chẳn hạn, lấy ví dụ trên của bác. Khi tổng hợp ta thu được tín hiệu c = "0000". Nhưng sau đó ta đổi thư viện thành Use ieee.std_logic_unsigned.all; thì kết quả c vẫn là "0000" vì giá trị 13 + 3 = 16 ="10000" nên c bị tràn.
Để không bị tràn tui lấy 1 số nhỏ hơn: (xem hình)
Trong đoạn chương trình dưới (hình) ta thấy:
Code:
a <= "0001" ; --số dương 1. b <= "1000" ; --số -8 vì dùng STD_LOGIC_SIGNED. c <= a + b ; --số -7
Bây giờ ta đổi thư viện thành: use IEEE.STD_LOGIC_UNSIGNED.ALL;. Như thế :
Code:
a <= "0001" ; --số dương 1. b <= "1000" ; --số 8 vì dùng STD_LOGIC_UNSIGNED. c <= a + b ; --số 9
Như vậy cho dù dùng signed hay unsiged thì c vẫn là "1001". (mạch tổng hợp đúng như vậy). Rõ ràng ta không thấy sự khác biệt khi dùng std_logic_unsigned hay std_logic_signed .
Do đó, để nhận thấy sự khác nhau của std_logic_unsigned và std_logic_signed thì ta phải thực hiện thêm bước nữa:
1. Đổi c thành số integer, tuy vậy cách này không xài được vì các hàm chuyển sang integer như conv_integer(p,b), to_integer điều không hỗ trợ tham số vào là std_logic_vector.
2. cách khác là dùng lại ví dụ của bác ở trên và phải dùng cách nào đó để lấy được giá trị bit tràn và tùy theo cách khai báo là signed hay unsigned mà bit tràn là 0 hay 1 :
dùng std_logic_signed:
a <= "0011"; -- a nhận giá trị 3
b <= "1101"; -- b nhận giá trị -3
c <= a + b ; -- bằng 0, không có tràn
------------------------
dùng std_logic_unsigned:
a <= "0011"; -- a nhận giá trị 3
b <= "1101"; -- b nhận giá trị 13
c <= a + b ; -- bằng 16, có tràn => cần lấy bit tràn này.
Bây giờ tui chưa nghĩ ra được ví dụ nào như thế
, nhưng nếu làm được như vậy thì mới nhận thấy sự khác biệt của std_logic_unsigned và std_logic_signed , từ đó mới suy ra mạch tổng hợp sẽ có hành vi khác nhau đối với std_logic_unsigned và std_logic_signed, còn nếu chỉ dùng ví dụ như của bác hay của tui viết ở trên (hình) thì không nhận thấy sự khác biệt này.có thể những quan điểm trên đây của tui là chưa đúng, mong mấy bác cùng góp ý, bổ sung

Leave a comment: