VHDL: ATAU-ing bit vektor bersama-sama

11

Saya ingin ATAU potongan-potongan vektor bersama-sama. Jadi katakanlah saya memiliki vektor yang disebut example(23 downto 0)dan saya ingin ATAU semua bit ke vektor lain, apakah ada cara untuk melakukan ini yang tidak melibatkan pergi example(0) or example(1) or ...example(23)?

pengendara motor dari kiamat
sumber
Bisakah Anda membandingkan dengan nol saja? Itu akan memiliki efek yang sama.
David
Untuk memperluas komentar David (menggunakan vektor 32 bit): or_result <= '0' when input=X"00000000" else '1';Ubah jumlah nol untuk mencocokkan panjang vektor yang dimaksud.
Pengurangan logika tersedia dalam vhdl 2008, lihat stackoverflow.com/questions/20296276/…
Moberg
1
Anda juga dapat menggunakan cara yang lebih umum:result <= '0' when (example=(example'range=>'0')) else '1';
Miguel Risco

Jawaban:

12

or_reduceadalah apa yang Anda inginkan, dan tersedia di std_logic_misc. Didukung oleh A dan X untuk FPGA.

Aaron D. Marasco
sumber
and_reduceadalah yang bermanfaat lainnya.
Aaron D. Marasco
5

Verilog memiliki "operator reduksi" yang praktis yang melakukan persis seperti yang Anda minta: |example[23:0]memberikan hasil ATAU semua bit dari examplevektor.

Sayangnya VHDL tidak memiliki operator ini. Menurut comp.lang.vhdl FAQ , meskipun

Tidak ada operator VHDL yang telah ditentukan untuk melakukan operasi pengurangan pada semua bit vektor (mis., Ke "atau" semua bit vektor). Namun, operator reduksi dapat dengan mudah diimplementasikan:

[melewatkan contoh yang tidak menangani nilai 'X' dan 'Z']

    function or_reduce( V: std_logic_vector )
                return std_ulogic is
      variable result: std_ulogic;
    begin
      for i in V'range loop
        if i = V'left then
          result := V(i);
        else
          result := result OR V(i);
        end if;
        exit when result = '1';
      end loop;
      return result;
    end or_reduce;
    ...
    b <= or_reduce( b_vec ); 
Foton
sumber
Siapa pun yang turun jabatan, mau menjelaskan mengapa?
The Photon
Apakah ini dapat disintesis?
Johannes Schaub - litb
@ JohannesSchaub-litb, tentu saja, dapat disintesis ke gerbang OR yang sangat besar (atau pohon yang lebih kecil). Mungkin versi di perpustakaan standar (dalam jawaban Aaron D. Marasco) akan lebih optimal daripada sesuatu yang dihasilkan dengan cepat.
The Photon
VHDL-2008 memang memiliki operator pengurangan unary. FAQ sudah usang. Selain itu, fungsi yang disajikan adalah synthesizability dipertanyakan karena keluar awal yang beberapa alat dapat tersedak dan tidak diperlukan selain sebagai optimasi mikro untuk simulasi.
KevinThibedeau