ข้อผิดพลาด (10327): ข้อผิดพลาด VHDL: ไม่สามารถระบุคำจำกัดความของตัวดำเนินการได้ = พบคำจำกัดความที่เป็นไปได้ 0 รายการ

ฉันมีข้อผิดพลาดมากมายแม้จะพยายามพิมพ์โปรแกรมด้วยวิธีต่างๆ แต่ส่วนใหญ่มักใช้การคิดเชิงตรรกะ ประเด็นคือฉันไม่เคยลองรวมสิ่งต่าง ๆ เข้าด้วยกันมาก่อน จึงมีปัญหาคือไม่สามารถคอมไพล์ได้ มีข้อกำหนดค่อนข้างมากและฉันสามารถประมวลผลได้อย่างสมเหตุสมผล แต่ต้องการความช่วยเหลือในการเขียนโค้ด ไม่เป็นไรที่จะนำทางฉัน? ขอบคุณ

รหัสที่แนบมาด้านล่างไม่ใช่รหัสที่สมบูรณ์ แต่มีข้อผิดพลาดมากมายอยู่แล้ว

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;

อาจเป็นข้อความสั้นๆ เกี่ยวกับโค้ดของฉัน โดยพื้นฐานแล้วเพื่อออกแบบระบบการจัดการสินค้าคงคลังที่ตรวจจับจำนวนเครื่องแบบที่ส่งคืนไปยังดรอปบ็อกซ์ ผู้ใช้สามารถตั้งค่าเครื่องแบบจำนวนเท่าใดก็ได้ที่เขาต้องการตรวจจับบนอินพุต: D3D2D1D0 ออกแบบระบบตามข้อกำหนดดังต่อไปนี้-

  1. เมื่อถึงหมายเลขอ้างอิงแล้ว ไฟ LED จะเปิดขึ้นและการนับจะหยุดที่หมายเลขอ้างอิงแม้ว่าจะเปิดใช้งานเซ็นเซอร์อินพุตก็ตาม แสดงจำนวนเครื่องแบบที่ตรวจพบบนจอแสดงผลเจ็ดส่วนและค่าของการอ้างอิงบนจอแสดงผลอื่น เช่น หากหมายเลขอ้างอิงคือ 15
  2. เมื่อเปิดใช้งานการรีเซ็ต ไฟ LED และเซ็กเมนต์ทั้งเจ็ดควรสะท้อนถึงสถานะล่าสุดของชุดเครื่องแบบที่ตรวจพบ

กรุณาแนะนำ!


person arthur andrew    schedule 18.08.2020    source แหล่งที่มา
comment
สวัสดี Arthur และยินดีต้อนรับสู่ StackOverflow เมื่อขอความช่วยเหลือ โปรดระบุเครื่องมือที่คุณใช้ (รวมถึงเวอร์ชันด้วย หากคุณทราบ) แสดงคำสั่งที่คุณใช้ และข้อความแสดงข้อผิดพลาดที่คุณได้รับ การคาดเดาทั้งหมดนี้จากซอร์สโค้ดของคุณถือเป็นงานมากเกินไป แต่สิ่งแรกที่ต้องทำคือไปที่ศูนย์ช่วยเหลือ และโดยเฉพาะส่วนที่เกี่ยวกับ วิธีถามคำถามที่ดี และตัวอย่างขั้นต่ำ สมบูรณ์ และตรวจสอบได้ ( MCVE) คือ   -  person Renaud Pacalet    schedule 18.08.2020
comment
สำหรับนิพจน์บูลีนที่คาดคะเน q = D3&D2&D1&D0 นี้ ไม่มีตัวดำเนินการความเท่าเทียมกันที่สามารถทดสอบระหว่างตัวถูกดำเนินการทางซ้ายกับประเภทฐานของ std_ulogic และตัวถูกดำเนินการทางขวาของประเภทอาร์เรย์ที่ไม่รู้จักพร้อมกับประเภทองค์ประกอบฐานของ std_ulogic บางทีตัวดำเนินการต่อข้อมูลเหล่านั้นอาจต้องการเป็นตัวดำเนินการ AND?   -  person    schedule 19.08.2020


คำตอบ (1)


ปัญหาคือ q = D3&D2&D1&D0 ไม่ถูกต้อง อักขระ & ทำการต่อข้อมูลใน VHDL ดังนั้นคุณจึงพยายามเปรียบเทียบประเภท std_logic กับสัญญาณสี่บิต สิ่งนี้ผิดกฎหมายใน VHDL คุณต้องใช้คีย์เวิร์ด และ เพื่อรวมสัญญาณเข้าด้วยกันแทน อย่างไรก็ตาม สิ่งนี้จำเป็นต้องทำนอกนิพจน์ในคำสั่ง if สิ่งนี้ควรจะได้ผล:

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;

คุณยังสามารถใช้ตัวแปรภายในบล็อกกระบวนการเพื่อรวมบิต 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