2013-07-03 35 views

Trả lời

19

Nếu giá trị 8 bit được hiểu là ký (bổ sung 2 của), sau đó phương pháp VHDL chuyển đổi nói chung và giữa các ý kiến ​​để sử dụng thư viện numeric_std IEEE:

library ieee; 
use ieee.numeric_std.all; 

architecture sim of tb is 
    signal slv_8 : std_logic_vector(8 - 1 downto 0); 
    signal slv_16 : std_logic_vector(16 - 1 downto 0); 
begin 
    slv_16 <= std_logic_vector(resize(signed(slv_8), slv_16'length)); 
end architecture; 

Vì vậy, đầu tiên std_logic_vector được chuyển đổi với một giá trị đã ký, sau đó thay đổi kích thước được áp dụng, mà sẽ ký mở rộng giá trị đã ký, và kết quả cuối cùng được chuyển đổi trở lại std_logic_vector.

Chuyển đổi khá dài, nhưng có lợi thế là nó nói chung và hoạt động ngay cả khi độ dài mục tiêu được thay đổi sau này.

Thuộc tính 'chiều dài chỉ đơn giản trả về chiều dài của std_logic_vector slv_16, do đó 16.

Đối với đại diện unsigned thay vì ký tên, nó có thể được thực hiện bằng unsigned thay vì signed, do đó với mã này:

slv_16 <= std_logic_vector(resize(unsigned(slv_8), slv_16'length)); 
+0

Tôi đã cố gắng thay đổi kích thước từ 16 đến 8 bit như: resized_var1: = std_logic_vector (thay đổi kích thước (unsigned (Kp) * unsigned (integration1)), 8); Tôi đã nhận được lỗi như: "Loại chuyển đổi (để std_logic_vector) không thể có toán hạng tổng hợp." Tại sao nó không hoạt động? –

+0

Bởi vì, 8 nên được bên trong các parens cho thay đổi kích thước() và không std_logic_vector(). –

4
architecture RTL of test is 
    signal s8: std_logic_vector(7 downto 0); 
    signal s16: std_logic_vector(15 downto 0); 
begin 
    s16 <= X"00" & s8; 
end; 
+0

'X' trong dòng 5 là gì nghĩa là gì? –

+2

Chữ 'x' dành cho "thập lục phân". Vì vậy, x "00" là cơ bản "00000000" nhị phân. – Passepartout

+0

Nếu tôi muốn chuyển đổi "11111111" thành "1111111111111111" –

2

Để hoàn chỉnh, một cách khác đó là thỉnh thoảng hữu ích:

-- Clear all the slv_16 bits first and then copy in the bits you need. 
process (slv_8) 
begin 
    slv_16 <= (others => '0'); 
    slv_16(7 downto 0) <= slv_8; 
end process; 

tôi đã không phải làm điều này cho các vectơ mà tôi có thể nhớ lại, nhưng tôi đã cần điều này trong những hoàn cảnh phức tạp hơn: chỉ sao chép một vài tín hiệu phù hợp vào một bản ghi lớn hơn, phức tạp hơn là một lần.

+1

Và phần mở rộng ký hiệu được thực hiện với lệnh đầu tiên là 'slv_16 <= (others => slv_8 (7)); ' –

+0

Chính xác là chức năng, nhưng tôi cho rằng nếu bạn muốn mở rộng ký, bạn nên sử dụng các kiểu số thích hợp (tức là' signed') và sau đó sử dụng chức năng 'resize' - như bạn đã đề xuất trong câu trả lời của bạn :) –

1

này xử lý việc chuyển đổi mà không cần phải chỉnh sửa độ rộng của zero nếu một trong hai std_logic_vector thay đổi:

architecture RTL of test is 
    signal s8: std_logic_vector(7 downto 0); 
    signal s16: std_logic_vector(15 downto 0) := (others => '0'); 
begin 
    s16(s8'range) <= s8; 
end; 
Các vấn đề liên quan