Kesalahan (10327): Kesalahan VHDL: tidak dapat menentukan definisi operator = ditemukan 0 kemungkinan definisi

Saya mengalami banyak kesalahan meskipun mencoba berbagai cara mengetik program saya, tetapi sebagian besar waktu menggunakan pemikiran logis. Masalahnya adalah, saya belum pernah mencoba menggabungkan hal-hal yang berbeda sebelumnya, sehingga mengalami masalah karena tidak dapat mengkompilasinya. Persyaratannya cukup banyak dan saya bisa memprosesnya secara logis, tetapi butuh bantuan untuk codingnya. Apakah boleh membimbing saya? Terima kasih.

Kode terlampir di bawah ini belum selesai, tetapi sudah banyak kesalahan.

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

entity tracking7 is
port    (   sensor      :  in  std_logic;
            reset_bar   :  in  std_logic;
            D3, D2, D1, D0          :  in std_logic;
            q           :  out std_logic;
            led         : out std_logic;
            a4,b4,c4,d4,e4,f4,g4 : out std_logic);
end tracking7;


architecture flow of tracking7 is

signal input  : std_logic_vector (3 downto 0);      --VECTORS FOR INTERNAL 
signal output : std_logic_vector (6 downto 0);    --USE IN DECODER STATEMENTS
signal count_sig: unsigned (3 downto 0); 

begin
    input <= (D3, D2 , D1, D0);
WITH input SELECT
  output <=     "0000001" when "0000",    --DISPLAY 0
                "1001111" when "0001",    --DISPLAY 1
                "0010010" when "0010",    --DISPLAY 2
                "0000110" when "0011",    --DISPLAY 3
                "1001100" when "0100",    --DISPLAY 4
                "0100100" when "0101",    --DISPLAY 5
                "0100000" when "0110",    --DISPLAY 6
                "0001111" when "0111",    --DISPLAY 7
                "0000000" when "1000",    --DISPLAY 8
                "0000100" when "1001",    --DISPLAY 9
                "0001000" when "1010",    --DISPLAY A
                "1100000" when "1011",    --DISPLAY B
                "0110001" when "1100",    --DISPLAY C
                "1000100" when "1101",    --DISPLAY D
                "0110000" when "1110",    --DISPLAY E
                "0111000" when "1111",    --DISPLAY F
                "1111111" when others;    --BLANK DISPLAY
                        

 
    process ( sensor, reset_bar) 
    begin 
        if (reset_bar = '1')    then            count_sig <= count_sig; 

    elsif  falling_edge (sensor) then if (count_sig = D3& D2& D1& D0) then  
            count_sig <= "0000"; 
            else  
            count_sig <= count_sig + 1; 
        end if;  
        end if;         
    end process; 

    
    process (D3, D2, D1, D0)
        begin
          if (q = D3&D2&D1&D0)
            then led <= '1'; --LED light up when reach ref no
          else
            led<= '0';
        
        end if;
        end process;

  a4 <= output(6);
  b4 <= output(5);
  c4 <= output(4);
  d4 <= output(3);
  e4 <= output(2);
  f4 <= output(1);
  g4 <= output(0);
        
q <= std_logic_vector (count_sig);

end flow;

Mungkin catatan singkat tentang kode saya, pada dasarnya untuk merancang sistem manajemen inventaris yang mendeteksi jumlah seragam yang dikembalikan ke dropbox. Pengguna dapat mengatur sejumlah seragam yang ingin dideteksi pada input: D3D2D1D0. Rancang sistem dengan spesifikasi berikut-

  1. Setelah nomor referensi tercapai, LED menyala dan penghitungan berhenti pada nomor referensi meskipun sensor input diaktifkan. Tampilkan jumlah seragam yang terdeteksi pada tampilan tujuh segmen dan nilai referensi pada tampilan lainnya. Misal: Jika nomor referensinya 15
  2. Saat reset diaktifkan, led dan tujuh segmen akan mencerminkan status terbaru dari seragam yang terdeteksi.

Mohon saran!


person arthur andrew    schedule 18.08.2020    source sumber
comment
Halo Arthur dan selamat datang di StackOverflow. Saat meminta bantuan, harap tentukan alat apa yang Anda gunakan (termasuk versinya, jika Anda mengetahuinya), tunjukkan perintah apa yang Anda gunakan dan pesan kesalahan apa yang Anda dapatkan. Menebak semua ini dari kode sumber Anda terlalu merepotkan. Namun hal pertama yang harus dilakukan adalah mengunjungi pusat bantuan dan khususnya bagian tentang cara mengajukan pertanyaan yang baik dan Contoh Minimal, Lengkap, dan Dapat Diverifikasi ( MCVE) adalah.   -  person Renaud Pacalet    schedule 18.08.2020
comment
Untuk ekspresi Boolean q = D3&D2&D1&D0 ini, tidak ada operator kesetaraan yang dapat menguji antara operan sebelah kiri dengan tipe dasar std_ulogic dan operan sebelah kanan dari tipe array yang tidak diketahui dengan tipe elemen dasar std_ulogic. Mungkin operator penggabungan tersebut ingin menjadi operator AND?   -  person    schedule 19.08.2020


Jawaban (1)


Masalahnya adalah q = D3&D2&D1&D0 tidak valid. Karakter & melakukan penggabungan dalam VHDL sehingga Anda sebenarnya mencoba membandingkan tipe std_logic dengan sinyal empat bit. Ini ilegal di VHDL. Anda perlu menggunakan kata kunci dan untuk menggabungkan sinyal-sinyal tersebut. Namun, hal ini perlu dilakukan di luar ekspresi dalam pernyataan if. Sesuatu seperti ini seharusnya berfungsi:

and_d <= D3 and D2 and D1 and D0;

process (and_q) is
begin
  if (q = and_d) then
    led <= '1'; --LED light up when reach ref no
  else
    led <= '0';
  end if;
end process;

Anda juga bisa menggunakan variabel di dalam blok proses untuk menggabungkan bit Dn:

process (D3, D2, D1, D0) is
  variable and_q : std_logic;
begin
  and_q := D3 and D2 and D1 and D0;
  if (q = and_d) then
    led <= '1'; --LED light up when reach ref no
  else
    led <= '0';
  end if;
end process;
person johnfpga    schedule 20.08.2020