Ini masalah cepat untuk kalian. Saya mendapatkan standar "0 definisi untuk operator &" di baris ini:

if(unsigned(counter) > to_unsigned("000" & x"8000000")) then

Saya tahu ada solusi yang jauh lebih sederhana termasuk hanya menambahkan sedikit ke "counter" dan menggunakan x"08000000" tetapi saya ingin tahu cara yang tepat untuk menangani situasi khusus ini untuk penggabungan di masa mendatang.

0
comc cmoc 7 Juli 2020, 21:47

1 menjawab

Jawaban Terbaik

Seperti yang disorot dalam komentar, alasan Anda mendapatkan kesalahan adalah karena to_unsigned mengharapkan argumen bertipe natural, sedangkan Anda memberinya literal vektor yang bertipe tidak ditentukan.

Bagi saya, solusi sebenarnya di sini adalah praktik pengkodean umum. Demi keterbacaan dan pemeliharaan, Anda tidak boleh memiliki 'angka ajaib' dalam kode Anda, seperti yang Anda lakukan dalam contoh Anda. Dalam waktu dua tahun, seseorang mungkin datang dan berpikir "apa pentingnya 0x08000000!?". Sesuatu seperti berikut ini akan sepenuhnya menghindari skenario dalam pertanyaan Anda:

constant COUNTER_WIDTH : natural := 30;
-- Some comment explaining why the following is a concatenation of two things
constant COUNTER_THRESHOLD : unsigned(COUNTER_WIDTH-1 downto 0) := "000" & x"8000000";
signal counter : unsigned(COUNTER_WIDTH-1 downto 0);

...

if(counter > COUNTER_THRESHOLD) then
  • Menggunakan konstanta untuk mengatur lebar yang kemudian digunakan untuk deklarasi konstanta dan sinyal
  • Memindahkan ambang angka ajaib ke konstanta yang bisa memiliki nama yang lebih bermakna lagi jika konteksnya diberikan
  • Berikan jenis penghitung unsigned di tempat pertama, untuk menghindari konversi

Perhatikan bahwa saya mungkin akan memberikan counter nama yang lebih bermakna juga, misalnya dalam UART, mungkin disebut rx_bit_counter.


Sejumlah besar pertanyaan di situs ini memiliki lebih dari satu kemungkinan solusi, jadi saya tidak berpikir itu membuat semuanya 'berdasarkan opini' dalam arti bahwa kami menggunakan frasa itu dalam pedoman pertanyaan.

2
scary_jeff 8 Juli 2020, 07:53