ไม่มีรายการที่เป็นไปได้ในโปรแกรมย่อย shift_left พิมพ์ข้อผิดพลาดใกล้

ฉันกำลังพยายามใช้ฟังก์ชัน shift_left() ในโครงการของฉัน แต่ฉันได้รับข้อผิดพลาด 2 ข้อที่อธิบายไม่ได้:

  1. ข้อผิดพลาด: พิมพ์ข้อผิดพลาดใกล้กับ 'shift left'; ประเภทที่คาดหวัง 'std_logic_vector'

แต่ temp เป็น std_logic_vector!

  1. ข้อผิดพลาด: ไม่พบรายการที่เป็นไปได้สำหรับโปรแกรมย่อย 'shift_left'

สัญญาณที่ใช้ในรหัสถูกกำหนดเป็น:

signal shifted_pixel, temp : std_logic_vector(15 downto 0);
signal i_data : std_logic_vector(7 downto 0);

ตัวอย่างด้านล่างนี้เขียนขึ้นภายในกระบวนการ

temp <= "00000000" & i_data;
shifted_pixel <= shift_left(temp, 5);

รหัสเต็มด้านล่าง:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;


entity project is
    port (
        i_clk     : in std_logic;
        i_rst     : in std_logic;
        i_start   : in std_logic;
        i_data    : in std_logic_vector(7 downto 0);
    );
end project;

architecture rtl of project is
    signal shifted_pixel, temp : std_logic_vector(15 downto 0);
    begin
        process(i_data)
        begin
            temp <= "00000000" & i_data;
            shifted_pixel <= shift_left(temp, 5);
        end process;
end rtl;

person Jack    schedule 27.03.2021    source แหล่งที่มา
comment
ระบุตัวอย่างที่ทำซ้ำได้น้อยที่สุด โดยที่ฟังก์ชัน SHIFT_LEFT ถูกประกาศ และพารามิเตอร์และประเภทการส่งคืนนั้นขึ้นอยู่กับการแก้ไขมาตรฐาน คุณสามารถค้นหาประเภท unsigned สำหรับอินสแตนซ์ได้ในแพ็คเกจ numeric_std ซึ่งการใช้งานจะนำมาซึ่งการแปลงประเภท   -  person    schedule 27.03.2021
comment
@ user1155120 ฉันได้ลองแคสต์เป็นแบบไม่ได้ลงนามแล้ว แต่ก็ไม่ได้เปลี่ยนแปลงอะไรเลย ฉันไม่แน่ใจว่าจะตรวจสอบการปรับปรุงมาตรฐานที่ฉันใช้อยู่ได้อย่างไร แต่ควรเป็นเวอร์ชันล่าสุด ฉันกำลังใช้ไลบรารี ieee.std_logic_1164.all และ ieee.numeric_std.all   -  person Jack    schedule 27.03.2021
comment
คุณไม่ได้สาธิตการแปลงประเภทที่ล้มเหลวในโค้ดของคุณ เอนทิตีของคุณไม่ได้วิเคราะห์ (คอมไพล์) อัฒภาคคือตัวคั่นในรายการการประกาศพอร์ตไม่ใช่ตัวสิ้นสุด - อันสุดท้ายควรถูกลบออก shifted_pixel <= std_logic_vector(shift_left(unsigned(temp), 5)); temp จะต้องพิมพ์ unsigned เพื่อใช้ SHIFT_LEFT ที่เกี่ยวข้องในแพ็คเกจ numeric_std ค่าผลลัพธ์จะต้องเข้ากันได้กับ std_logic_vector เพื่อกำหนดให้กับ shifted_pixel   -  person    schedule 27.03.2021
comment
ฟังก์ชั่นมีลักษณะเฉพาะด้วยประเภทพารามิเตอร์และประเภทการส่งคืนซึ่งกำหนดโดยบริบท ที่นี่ประเภทการส่งคืนจะต้องเป็น std_logic_vector เพื่อกำหนดพิกเซลที่เลื่อน พารามิเตอร์และประเภทการส่งคืนสำหรับฟังก์ชันที่มีอยู่ SHIFT_LEFT เป็นประเภทที่ไม่ได้ลงชื่อ และคุณต้องพิมพ์ทั้งพารามิเตอร์และผลลัพธ์ หรือค้นหา SHIFT_LEFT ที่ใช้ได้กับ std_logic_vector (ใน -2008)   -  person    schedule 27.03.2021
comment
โอเค ฉันเห็นแล้ว ขอบคุณมาก!   -  person Jack    schedule 28.03.2021


คำตอบ (1)


ฟังก์ชัน shift_left ในแพ็คเกจ numeric_std รับอาร์กิวเมนต์แรกที่ไม่ได้ลงนามและส่งกลับค่าที่ไม่ได้ลงนาม

ดังนั้นคุณต้องหล่อค่าของคุณ:

shifted_pixel <= std_logic_vector(shift_left(unsigned(temp), 5));

person lukipedio    schedule 27.03.2021