ดังที่คำตอบหลักบอกไว้วิธีที่แนะนำมีดังต่อไปนี้:
use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
อย่างไรก็ตามฉันต้องการอธิบายอย่างละเอียดเกี่ยวกับสาเหตุที่แนะนำนี้และทำไม VHDL จึงมีวิธีที่ซับซ้อนเช่นนี้ในการแปลงจำนวนเต็มเป็น std_logic_vectors
มันลงมาเพื่อดูว่าเครื่องมือประเภทนี้ดูได้อย่างไร
standard_logic_vector เป็นพวงของ 1s หรือ 0s ฉันมี 1,0001. หมายเลขนี้คืออะไร? มันขึ้นอยู่กับ มันเซ็นหรือไม่ได้ลงชื่อ? SLV ไม่ทราบหรือไม่สนใจ มีกี่บิต? SLV ของคุณยาวแค่ไหน?
จำนวนเต็มมีการลงนามและมักจะ 32 บิต (ถ้าฉันจำได้อย่างถูกต้อง)
ขั้นตอนที่ 1: ทำให้จำนวนเต็มของฉันสั้นลงและลงนาม นั่นคือส่วนนี้:
to_unsigned(my_int, my_slv'length));
"ฉันมีจำนวนเต็มนี้ฉันต้องการให้มันไม่ได้ลงนามและฉันต้องการให้พอดีกับความยาวของ SLV ของฉัน"
ขั้นตอนที่ 2: จากนั้นนำบิตเหล่านั้นมาใช้เพื่อขับ my_slv
my_slv <= std_logic_vector(...)
"ใช้บิตเหล่านี้และใช้เพื่อขับ slv ของฉัน"
(หมายเหตุเกี่ยวกับคำศัพท์A <= B
ใน VHDL อ่านออกมาดัง ๆ ว่า "A ขับเคลื่อนด้วย B")
เมื่อรวมเข้าด้วยกันสิ่งนี้จะทำให้คุณได้รับ:
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
เมื่อมาจากพื้นหลังการเขียนโปรแกรมแบบดั้งเดิมมันง่ายมากที่จะติดอยู่ในวิธีการคิดโปรแกรม แต่ใน VHDL โค้ดที่คุณเขียนมีความหมายทางกายภาพในฮาร์ดแวร์ การรู้ว่าทำไมวิธีการนี้ถึงได้ผลและได้รับการแนะนำก็คือการคิดถึงสิ่งที่คุณเขียนในแง่ของฮาร์ดแวร์
เคล็ดลับโบนัส: ฟังก์ชั่นนำหน้าด้วย to_ เป็นฟังก์ชั่นที่ย่อ / เปลี่ยนแปลงตัวถูกดำเนินการ พวกเขาทำให้พวกเขาไม่ได้ลงนามหรือความยาวหรือทั้งสองอย่าง นี่คือเหตุผลที่ to_unsigned ต้องการให้คุณระบุความยาว ฟังก์ชั่นที่ไม่มี to_ (ตรง std_logic_vector (... ) ในตัวอย่างนี้) ถูกใช้เมื่อชนิดเข้ากันได้โดยตรงแล้ว msgstr "เอาบิตเหล่านี้มาใช้ในประเภทนี้โดยไม่จำเป็นต้องดัดแปลง" #:. สิ่งเหล่านี้ไม่มีอาร์กิวเมนต์ความยาวเนื่องจากทั้งสองด้านมีความเหมือนกันอยู่แล้ว ดังนั้นเมื่อสร้างสิ่งต่าง ๆ เช่นนี้ฉันไม่จำเป็นต้องค้นหามันฉันแค่คิดว่าฉันจะเปลี่ยนข้อมูลอย่างไร