2010-10-28 26 views
16

Tôi muốn có một mô-đun đơn giản để thêm hai std_logic_vectors. Tuy nhiên, khi sử dụng mã bên dưới với toán tử + nó không tổng hợp.Lỗi khi thêm std_logic_vectors

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_arith.all; 

entity add_module is 
     port(
    pr_in1 : in std_logic_vector(31 downto 0); 
    pr_in2 : in std_logic_vector(31 downto 0); 
    pr_out : out std_logic_vector(31 downto 0) 
     ); 
end add_module; 

architecture Behavior of add_module is 

begin 

    pr_out <= pr_in1 + pr_in2; 

end architecture Behavior; 

Thông báo lỗi tôi nhận được từ XST

Dòng 17. + không thể có toán hạng như vậy trong bối cảnh này.

Tôi có bỏ lỡ thư viện không? Nếu có thể, tôi không muốn chuyển đổi các đầu vào thành các số tự nhiên.

Rất cám ơn

Trả lời

19

Bạn muốn trình biên dịch biết liệu std_logic_vectors của bạn được ký hoặc chưa ký? Thực hiện Adder không giống nhau trong hai trường hợp này, vì vậy bạn cần phải trình bày rõ ràng trình biên dịch những gì bạn muốn nó làm ;-)

Lưu ý: Tô sáng cú pháp VHDL trong StackOverflow là crappy. Sao chép/dán mã này trong trình soạn thảo VHDL ưa thích của bạn để đọc nó dễ dàng hơn.

library IEEE; 
use IEEE.std_logic_1164.all; 
-- use IEEE.std_logic_arith.all; -- don't use this 
use IEEE.numeric_std.all; -- use that, it's a better coding guideline 

-- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these 
-- are the worst libraries ever. They automatically cast all your vectors 
-- to signed or unsigned. Talk about maintainability and strong typed language... 

entity add_module is 
    port(
    pr_in1 : in std_logic_vector(31 downto 0); 
    pr_in2 : in std_logic_vector(31 downto 0); 
    pr_out : out std_logic_vector(31 downto 0) 
); 
end add_module; 

architecture Behavior of add_module is 
begin 

    -- Here, you first need to cast your input vectors to signed or unsigned 
    -- (according to your needs). Then, you will be allowed to add them. 
    -- The result will be a signed or unsigned vector, so you won't be able 
    -- to assign it directly to your output vector. You first need to cast 
    -- the result to std_logic_vector. 

    -- This is the safest and best way to do a computation in VHDL. 

    pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2)); 

end architecture Behavior; 
0

Lời khuyên tốt từ @Aurelien để sử dụng numeric_std.

Lưu ý rằng việc thêm hai giá trị 32 bit có thể dẫn đến giá trị 33 bit và quyết định cách bạn muốn xử lý tràn.

4

Không sử dụng std_logic_arith - Tôi đã written about this (ở độ dài nào đó :).

Làm sử dụng numeric_std - và sử dụng đúng loại trên cổng đối tượng của bạn. Nếu bạn đang làm số học, hãy sử dụng các loại số (số nguyên hoặc (un) các vectơ đã ký, nếu thích hợp). Chúng sẽ tổng hợp hoàn hảo.

std_logic_vector s là tốt cho

  • khi bạn không quan tâm đến giá trị số (một tập hợp các bit điều khiển, một số bit dữ liệu ngẫu nhiên)
  • khi bạn không biết về loại của đầu vào (nói một trình bổ sung có thể hoạt động trên cả hai số đã ký và chưa ký dựa trên cờ điều khiển).
+0

tôi khuyên bạn nên kiểm tra ra liên kết Martin. – George

-1

Cách đơn giản để giải quyết lỗi này là:
Thêm thư viện của unsign,
Sau đó mã của bạn bắt đầu làm việc.

Sử dụng

ieee.std_logic_unsigned.all; 
pr_out <= pr_in1 + pr_in2; 
+0

như @Martin Thompson cho biết, không nên sử dụng thư viện này. – grorel

+0

bạn có thể giải thích? –

+0

Mọi thứ đều có trong liên kết trong câu trả lời của Martin Thompson. 'std_logic_arith''std_logic_unsigned' và' std_logic_signed' là các thư viện không chuẩn được phát triển bởi tóm tắt. 'numeric_std' là thư viện chuẩn. – grorel

Các vấn đề liên quan