Tidak ada entri yang layak ke subprogram shift_left, ketik kesalahan dekat

Saya mencoba menggunakan fungsi shift_left() di proyek saya, tetapi saya mendapatkan 2 kesalahan yang tidak dapat saya jelaskan:

  1. Kesalahan: kesalahan ketik di dekat 'shift kiri'; tipe yang diharapkan 'std_logic_vector'

tapi temp ADALAH std_logic_vector!

  1. Kesalahan: tidak ditemukan entri yang layak untuk subprogram 'shift_left'

sinyal yang digunakan dalam kode didefinisikan sebagai:

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

cuplikan di bawah ini ditulis dalam suatu proses

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

kode lengkap di bawah ini:

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 sumber
comment
Berikan contoh minimal yang dapat direproduksi. Di mana fungsi SHIFT_LEFT dideklarasikan dan parameter serta tipe pengembaliannya bergantung pada revisi standar. Anda dapat menemukannya untuk tipe unsigned misalnya dalam paket numerik_std, dimana penggunaannya akan memerlukan konversi tipe.   -  person    schedule 27.03.2021
comment
@ user1155120 Saya telah mencoba mentransmisikannya ke unsigned dan tidak mengubah apa pun. Saya tidak yakin bagaimana cara memeriksa revisi standar yang saya gunakan, tetapi harus yang terbaru. Saya menggunakan perpustakaan ieee.std_logic_1164.all dan ieee.numeric_std.all;   -  person Jack    schedule 27.03.2021
comment
Anda tidak menunjukkan konversi jenis yang gagal dalam kode Anda. Entitas Anda tidak menganalisis (mengkompilasi), titik koma adalah pemisah dalam daftar deklarasi port, bukan terminator - yang terakhir harus dihapus. shifted_pixel <= std_logic_vector(shift_left(unsigned(temp), 5)); temp harus bertipe unsigned untuk menggunakan SHIFT_LEFT yang berlaku dalam paket numerik_std. Nilai yang dihasilkan harus kompatibel dengan std_logic_vector untuk ditetapkan ke shifted_pixel.   -  person    schedule 27.03.2021
comment
Suatu fungsi dicirikan oleh tipe parameter dan tipe kembaliannya yang ditentukan oleh konteks. Di sini tipe pengembalian harus std_logic_vector untuk ditugaskan ke piksel yang digeser. Parameter dan tipe pengembalian untuk fungsi yang tersedia SHIFT_LEFT adalah tipe yang tidak ditandatangani dan Anda harus mengetikkan konversi parameter dan hasil, atau temukan SHIFT_LEFT yang berfungsi untuk std_logic_vector (pada -2008).   -  person    schedule 27.03.2021
comment
Oke, saya mengerti sekarang, terima kasih banyak!   -  person Jack    schedule 28.03.2021


Jawaban (1)


Fungsi shift_left dalam paket numerik_std mengambil argumen pertama yang tidak ditandatangani dan mengembalikan nilai yang tidak ditandatangani.

Jadi, Anda harus memberikan nilai-nilai Anda:

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

HTH

person lukipedio    schedule 27.03.2021