Langsung mengindeks sedikit hasil aritmatika

Untuk masalah ini, anggaplah saya memiliki sinyal berikut dan saya menggunakan paket Sinopsis std_logic_unsigned dan std_logic_arith.

signal o : std_logic;
signal i  : std_logic_vector(parameter downto 0);
constant c : integer := 5;

Saya ingin mengatur sinyal o ke bit paling kiri dari hasil (i-c). Di dalam suatu proses saya memiliki sesuatu seperti:

o <= (i-c)(i'left);

Yang tidak dapat dikompilasi di simulator saya.

Saya tahu saya bisa menyelesaikan ini dengan memperkenalkan variabel perantara, tetapi apakah ada konstruksi sintaksis untuk melakukan ini secara langsung?


person QuantumRipple    schedule 22.09.2014    source sumber


Jawaban (1)


Anda mencoba menetapkan o nilai nama yang diindeks dari hasil ekspresi.

Awalan nama yang diindeks dapat berupa nama atau pemanggilan fungsi.

 indexed_name ::=  prefix ( expression { , expression } )

 prefix ::=  
       name
     | function_call

Fungsi adalah ekspresi seperti sebagian besar atribut yang telah ditentukan sebelumnya, mis. i'length atau i'left.

Namun pemanggilan fungsi memiliki format tertentu:

 function_call ::=
    function_name [ ( actual_parameter_part ) ]

 actual_parameter_part ::=  parameter_association_list 

Mengingat semua itu serta menggunakan paket numerik_std (dalam hal ini tanpa numerik_std_unsigned) memberikan:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity indexing is
    constant parameter: natural :=7;
end entity;

architecture foo of indexing is
    signal o : std_logic;
    signal i  : signed(parameter downto 0);
    constant c : integer := 5;
begin

    o <= "-"(i,to_signed(c,i'length)) (i'left);

end architecture;

Dan tentu saja Anda dapat menggunakan konversi tipe dalam daftar asosiasi untuk daftar asosiasi panggilan fungsi "-",

Tipe signed dipilih karena konstanta Anda c ditetapkan sebagai tipe integer. Bisa saja dengan mudah mengetik unsigned, atau std_logic_vector menggunakan paket numerik_std_unsigned. Memilih tipe yang ditandatangani agak aneh, o menentukan tanda hasil dengan cara ini.

Contoh di atas menganalisis, menguraikan, dan menjalankan, sebenarnya tidak melakukan banyak hal menarik, sambil menunjukkan sintaksisnya valid.

Nama irisan juga dapat dimanipulasi.

(Dan ya, ini akan berfungsi dengan paket Synopsys std_logic_unsigned, tanpa konversi tipe dan menentukan i tipe std_logic_vector. Ada sedikit keuntungan saat menggunakan pemanggilan fungsi.)

person Community    schedule 22.09.2014
comment
Terima kasih, inilah yang saya cari. - person QuantumRipple; 23.09.2014