logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Błąd kompilacji kodu VHDL dla wyświetlacza 7-segmentowego - jak naprawić?

ginar 11 Mar 2008 15:05 3645 7
REKLAMA
  • #1 4896919
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    witam
    mam problem z skompilowaniem ponizszego kodu
    --Wyświetlacz----
    --*************************
    ---biblioteki-------------	
    
    library IEEE;
    use IEEE.STD_LOGIC_1164.all;
    ---zdefiniowanie portów--- 	  
    
    entity wyswietlacz_kod is								 --nazwa układu
    	 port(
    		 DANE : in STD_LOGIC_VECTOR(3 downto 0);		--dane: wektor in 4-bitowy 
    		 ADRES : in STD_LOGIC_VECTOR(3 downto 0);		--adres: wektor in 4 -bitowy
    		 LED1 : out STD_LOGIC_VECTOR(6 downto 0);	    --led1: wektor out 7-bitów
    		 LED2 : out STD_LOGIC_VECTOR(6 downto 0);	    --led2: wektor out 7- bitów   
    		 zapis: in STD_LOGIC); 
        
    end wyswietlacz_kod;
    
    
    ---cialo funkcji:---- 	
    
    architecture behave of wyswietlacz_kod is
    signal zdekodowane_bin_7seg : STD_LOGIC_VECTOR(6 downto 0);	--pomocnicza zmienna do dekodowania Danej(bin) na 7-seg
    
    begin 	
    	
    process (zapis)   --reaguj na zbocze opadające sygnału zapis
    begin
    if zapis'event and zapis='0' then				             
    
       with DANE select
       zdekodowane_bin_7seg <=   "1000000" when "0000",  --0
    			                  "1111001" when "0001",  --1
    			                  "0100100" when "0010",  --2
    			                  "0110000" when "0011",  --3
    			                  "0011001" when "0100",  --4
    			                  "0010010" when "0101",  --5
    			                  "0000010" when "0110",  --6
    			                  "1111000" when "0111",  --7
    			                  "0000000" when "1000",  --8
    			                  "0010000" when "1001",  --9
    			                  "0100000" when "1010",	  --a
    							  "0000011" when "1011",	  --b  
    							  "0100000" when "1100",	  --c  
    							  "0100001" when "1101",	  --d 					 
    							  "0000100" when "1110",	  --e	 
    							  "0001110" when "1111",	  --f
    							  "1111111"	when others;	  -- inne - nie świeć  
       with ADRES select	
       LED1<=              zdekodowane_bin_7seg  when "0000",	    --zaswiec LED1 gdy adres 0 h 
    					   zdekodowane_bin_7seg  when "1010",	    --zaswiec LED1 gdy adres A h
    					   zdekodowane_bin_7seg when "1100",	    --zaswiec LED1 gdy adres C h 
    					   zdekodowane_bin_7seg  when "1101",	    --zaswiec LED1 gdy adres D h 
    						          "1111111" when others; 
    
    
    
       with ADRES select	
       LED2<= 			   zdekodowane_bin_7seg  when "0100",	    --zaswiec LED1 gdy adres 4 h
    					   zdekodowane_bin_7seg  when "1010",	    --zaswiec LED1 gdy adres A h
    					  			   "1111111" when others ;
    				   					   
     end if;	
    end process; 
    end behave;
    


    wyskakuje
    # Error: COMP96_0019: wyswietlacz_kod.vhd : (31, 4): Keyword "end" expected.
    # Error: COMP96_0019: wyswietlacz_kod.vhd : (49, 4): Keyword "end" expected.
    # Error: COMP96_0015: wyswietlacz_kod.vhd : (63, 6): ';' expected.
    # Error: COMP96_0016: wyswietlacz_kod.vhd : (64, 1): Design unit declaration expected.


    chodzi mi o to aby cała funkcja wykonywałą sie tylo prz opadającym zboczu zmiennej zapis

    wszystko jest ok jesli dam w komentarz
    process (zapis)   --reaguj na zbocze opadające sygnału zapis
    begin
    if zapis'event and zapis='0' then		


    to wszystko jest ok
    jest to w zasadzie mój pierszy progr.w tym języku więc błąd pewnie jest widoczny
    z góry dzięki
  • REKLAMA
  • #2 4897279
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    ginar napisał:
    wszystko jest ok jesli dam w komentarz
    
      process (zapis)   --reaguj na zbocze
      begin 
      if zapis'event and zapis='0' then 

    podejrzewam, ale tylko podejrzewam, bo moja znajomosc vhdl
    jest bardzo slaba, ze 'with - select' opisuje tylko logike kombinacyjna,
    wiec nie moze byc uzyte wewnatrz sekwencyjnego procesu;
    zmien 'with - select' na case i moze problem zniknie;
    ew. przenies poza process, a w procesie tylko zapisuj do rejestrow
    wynik 'combo-logic';

    J.A
  • REKLAMA
  • #3 4897662
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    miałeś racje :p with select nie jeset do sekwencyjnego procesu.
    Pozostała mi jeszcze jedna sprawa :
    w instrukcji case is chece przypiać wartoość do dwóch wektrorów jednocześnie:
    	   
       case  ADRES is	   
            when "0000" => LED1 <= zdekodowane_bin_7seg; 	
    	when "1010" => LED1,LED2 <=zdekodowane_bin_7seg; 	    
    	when "1100" => LED1 <= zdekodowane_bin_7seg; 	    
    	when "1101" => LED1 <= zdekodowane_bin_7seg;	   
            when "0100" => LED2 <= zdekodowane_bin_7seg;        
    	when others => LED2,LED2 <= "1111111";	
    				end case;

    powyższy spossób nie przechodzi, da się wpisać wartość do dwóch wektorów jednocześnie nie tworząc nowej instrukcji case is ?
  • Pomocny post
    #4 4898835
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    ginar napisał:
    /.../

    ja uzywam na codzien verilog, vhdl znam z widzenia,
    ale stawiam na to, ze powinno byc tak:

    
      case  ADRES is      
         when "0000" => LED1 <= zdekodowane_bin_7seg;    
         when "1010" => LED1 <=zdekodowane_bin_7seg;  
                        LED2 <=zdekodowane_bin_7seg; 
         when "..."  =>  .....;   


    a poza tym ... pewnie zajeloby ci 15 minut znalezienie
    tego w internecie, leniu jeden ... :)

    J.A
  • #5 4899627
    sesil
    Poziom 16  
    Posty: 281
    Pomógł: 14
    Ocena: 22
    Z tego co pamiętam musisz zrobić coś takiego:

    case ADRES is
    when "0000" | "1100" | "1101" =>
    LED1 <= zdekodowane_bin_7seg;
    when "1010" =>
    LED1<=zdekodowane_bin_7seg;
    LED2<=zdekodowane_bin_7seg;
    when "0100" =>
    LED2 <= zdekodowane_bin_7seg;
    when others =>
    LED2 <= "1111111";
    end case;

    W ostatniej linijce when było dwa razy LED2. Podejrzewam że powinno być LED1, jeśli tak to zamień jak w przypadku "1010"
  • REKLAMA
  • #6 4903099
    ginar
    Poziom 21  
    Posty: 595
    Pomógł: 26
    Ocena: 34
    programik sie kompiluje.
    czytam sobie tutorail o vhdl i piszą tam:
    "Wszystkie podstawienia sygnałów wewnątrz bloku ARCHITECTURE wykonywane są w sposób równoległy. "
    zastanawim sie teraz czy moja zmienna signal zdekodowane_bin_7seg : STD_LOGIC_VECTOR(6 downto 0) nie powinna być typu variable ? bo to ma być ukł sekwencyjny. No chyba, że w process
    wszystko załatwia
  • REKLAMA
  • #7 4903571
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    ginar napisał:
    zastanawim sie teraz, czy moja zmienna/.../nie powinna być typu variable ?

    wewnatrz fpga masz zestaw bramek logicznych i przerzutnikow,
    bramki produkuja wyjscie 'natychmiast' po zmianie swoich wejsc,
    przerzutniki przepisuja swoje wejscie na wyjscie w chwili
    zbocza zegara i nie zmienisz tego deklarujac sygnaly w inny sposob;
    problem bierze sie stad, ze jezyk [vhdl] powstal wczesniej niz
    fpga i wcale nie byl przeznaczony do ich programowania, zostal
    do programowania fpga zaadoptowany, poniewaz stal sie powszechnie
    znany i uzywany do modelowania i symulacji;
    oczywiscie dobrze jest poeksperymentowac z jezykiem i zobaczyc, jak
    kompilator rozumie twoj opis, ale w praktyce pisalbym tak, by jak
    najprostszymi metodami osiagnac wymagany rezultat;
    bo moze sie okazac, ze narzedzie innego producenta nieco inaczej
    zrozumie twoj opis rtl;
    ale eksperymentuj i sprawdzaj rezultat, bo inaczej nie nauczysz sie ani
    jezyka, ani fpga, tyle ze do takich eksperymentow uzywaj raczej
    schematic view niz sprawdzania, czy diody nadal mrugaja, diody
    nie pokaza ci jakie zmiany wew. fpga spowodowala inna deklaracja
    zmiennej;

    J.A
  • #8 4903849
    pndemon
    Poziom 19  
    Posty: 444
    Pomógł: 35
    Ocena: 18
    Syntezowanie się zmiennych bywa czasem nieokreślone, dlatego ja np. w ogóle ich nie używam (no prawie :)), sygnał to sygnał i już, albo jest to kawałek jakiejś ścieżki, albo przerzutnik/latch. Poza tym o tym, że układ jest sekwencyjny nie decyduje istnienie w kodzie procesu, w którym skądinąd instrukcje wykonują się jedna po drugiej (żeby nie powiedzieć sekwencyjnie), decyduje o tym, to że na liście czułości procesu jest sygnał zegarowy i to najlepiej (jeśli proces ma być synchroniczny) żeby nic oprócz niego się tam nie znajdowało.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z kompilacją kodu VHDL dla sterowania wyświetlaczem 7-segmentowym. Głównym błędem było użycie konstrukcji 'with - select' wewnątrz procesu sekwencyjnego, co jest niepoprawne, ponieważ 'with - select' służy do opisu logiki kombinacyjnej i nie może być stosowane w procesach sekwencyjnych. Zalecane jest zastąpienie jej instrukcją 'case' lub przeniesienie logiki kombinacyjnej poza proces. W przypadku przypisywania wartości do dwóch wektorów jednocześnie w instrukcji 'case', poprawnym sposobem jest rozdzielenie przypisań na osobne linie w danym warunku. Omówiono także różnice między sygnałami (signal) a zmiennymi (variable) w VHDL, podkreślając, że sygnały modelują fizyczne połączenia i przerzutniki w FPGA, a zmienne mogą mieć nieokreślone zachowanie przy syntezie. Sekwencyjność układu definiuje obecność sygnału zegarowego na liście czułości procesu. Wskazano, że w praktyce warto pisać kod VHDL w sposób prosty i zgodny z oczekiwaniami narzędzi syntezy FPGA, a eksperymenty z różnymi konstrukcjami powinny być wspierane symulacją i analizą wyników.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA