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

VHDL - Pomiar okresu sygnału prostokątnego, wyświetlacz 7-seg pokazuje 88. Co robić?

lauba1 26 Lis 2012 18:20 2046 3
REKLAMA
  • #1 11577513
    lauba1
    Poziom 10  
    Posty: 13
    Ocena: 2
    Witam,
    Mam zrealizować pomiar okresu sygnału prostokątnego generowane przez generator, który jest wyprowadzony na wejście CLK0 pin 39. Zmiana wartości częstotliwości tego sygnału następuje po przez zmiane nastawy potencjometru POT1 w zakresie 10kHz..50kHz. Natomiast na wejście CLK2 mamy wyprowadzoną częstotliwość sygnału wzorcowego 1MHz. Po jednokrotnym naciśnięciu klawisza start ma nastąpić jednorazowy pomiar, który będzie wyświetlony na dwóch pozycjach w wyświetlaczu 7-seg. Wyświetlacz pokazuje cały czas 88 i nie mam pojęcia już co jest nie tak.
    
    library IEEE;
    use IEEE.STD_LOGIC_1164.all;
    use IEEE.NUMERIC_STD.all;
    entity Fub3 is
    	port(
    	 	 clk2 : in STD_LOGIC; //sygnał wzorcowy 1Mhz
    		 clk0 : in STD_LOGIC; //sygnał generowany przez generator CLK0
    		 START : in STD_LOGIC; //przycisk po naciśnięciu którego następuje pomiar.
    		 NET1047 : out STD_LOGIC;//8 bitów, którymi wysyłamy  2 cyfry po 4 bity.
    		 NET316 : out STD_LOGIC;
    		 NET320 : out STD_LOGIC;
    		 NET328 : out STD_LOGIC;
    		 NET332 : out STD_LOGIC;
    		 NET926 : out STD_LOGIC;
    		 NET930 : out STD_LOGIC;
    		 NET934 : out STD_LOGIC
    	     );
    end Fub3;
    
    
    
    --}} End of automatically maintained section
    
    architecture Fub3 of Fub3 is
    begin
     process (clk2) is
     variable okres : unsigned (0 to 6) := "0000000";	
     variable liczba1 : unsigned (0 to 6) := "0000000";
     variable liczba2 : unsigned (0 to 6) := "0000000";
    
     begin
       if rising_edge (clk2) then
    		 if (START = '0') then
    		   if clk0 = '1' then
    			   okres := okres + "0000001";
    			 if okres > "1011010" then 	--jezeli wieksze od 90
    				 liczba1 := okres - "1011010"; --okres - 90 = liczba1 (jednosci)
    				 liczba2 := "0001001"; 
    			 elsif okres > "1010000" then --jezeli wieksze od 80
    				 liczba1 := okres - "1010000"; --okres - 80 = liczba1 (jednosci)
    				 liczba2 := "0001000";
    			 elsif okres > "1000110" then --jezeli wieksze od 70
    				 liczba1 := okres - "1000110"; --okres - 70 = liczba1 (jednosci)
    				 liczba2 := "0000111";
    			 elsif okres > "0111100" then --jezeli wieksze od 60
    				 liczba1 := okres - "0111100"; --okres - 60 = liczba1 (jednosci)
    				 liczba2 := "0000110";
    		     elsif okres > "0110010" then --jezeli wieksze od 50
    				 liczba1 := okres - "0110010"; --okres - 50 = liczba1 (jednosci)
    				 liczba2 := "0000101";
    		     elsif okres > "0101000" then --jezeli wieksze od 40
    				 liczba1 := okres - "0101000"; --okres - 40 = liczba1 (jednosci)
    				 liczba2 := "0000100";
    		     elsif okres > "0011110" then --jezeli wieksze od 30
    				 liczba1 := okres - "0011110"; --okres - 30 = liczba1 (jednosci)
    				 liczba2 := "0000011";
    			 elsif okres > "0010100" then --jezeli wieksze od 20
    				 liczba1 := okres - "0010100"; --okres - 20 = liczba1 (jednosci)
    				 liczba2 := "0000010";
    			 elsif okres > "0001010" then --jezeli wieksze od 10
    				 liczba1 := okres - "0001010"; --okres - 10 = liczba1 (jednosci)
    				 liczba2 := "0000001";
    			 else
    				 liczba1 :="0000000";
    				 liczba2 :="0000000";
    		  end if;
    		  elsif clk0= '0' then
    			  okres:= "0000000";
    		  end if;
    		NET1047 <= liczba2(0);
    		NET316 <= liczba2(1);
    		NET320 <= liczba2(2);
    		NET328 <= liczba2(3);
    		
    		NET332 <= liczba1(0);
    		NET926 <= liczba1(1);
    		NET930 <= liczba1(2);
    		NET934 <= liczba1(3);
    		 end if; 
    		end if;
     		
    
     end process;
    		-- enter your statements here --
    
    end Fub3;
    
    
    
    
    
    
    library IEEE;
    use IEEE.STD_LOGIC_1164.all;
    
    entity Fub2 is
    	 port(
    	 	 NET1047 : in STD_LOGIC;
    	 	 NET316 : in STD_LOGIC;
    		 NET320 : in STD_LOGIC;
    		 NET328 : in STD_LOGIC;
    		 NET332 : in STD_LOGIC;
    		 NET926 : in STD_LOGIC;
    		 NET930 : in STD_LOGIC;
    		 NET934 : in STD_LOGIC;
    		 cyfra : out STD_LOGIC_VECTOR(6 downto 0);
    	     cyfra2 : out STD_LOGIC_VECTOR(6 downto 0)
    		 );
    end Fub2;
    
    --}} End of automatically maintained section
    
    architecture Fub2 of Fub2 is
    begin	   
    	process (NET1047, NET316, NET320, NET328, NET332, NET926, NET930, NET934) is
    	variable dana1 : std_logic_vector (3 downto 0):="0000";
    	variable dana2 : std_logic_vector (3 downto 0):="0000";
    	variable cyfra1 : std_logic_vector (6 downto 0):= "0000000";
    	variable cyfra3 : std_logic_vector (6 downto 0):= "0000000";
    	begin
    		
    		dana2 (3) := NET1047;
    		dana2 (2):=NET316; 
    		dana2 (1):=NET320;
    		dana2 (0):=NET328;
    		
    		dana1 (3):=NET332;
    		dana1 (2):=NET926;
    		dana1 (1):=NET930;
    		dana1 (0):=NET934;
    		
    		if dana1 ="0000"then cyfra1:="0000001";	
    		elsif dana1 = "0001" then cyfra1 := "1001111";
    		elsif dana1 = "0010" then cyfra1 := "0010010";
    		elsif dana1 = "0011" then cyfra1 := "0000110";
    		elsif dana1 = "0100" then cyfra1 := "1001100";
    		elsif dana1 = "0101" then cyfra1 := "0100100";
    		elsif dana1 = "0110" then cyfra1 := "0100000";
    		elsif dana1 = "0111" then cyfra1 := "0001111";
    		elsif dana1 = "1000" then cyfra1 := "0000000";
    		elsif dana1 = "1001" then cyfra1 := "0000100";
    		else cyfra1:="0000000";	 
    		end if;
    
    		if dana2 ="0000"then cyfra3:="0000001";	
    		elsif dana2 = "0001" then cyfra3 := "1001111";
    		elsif dana2 = "0010" then cyfra3 := "0010010";
    		elsif dana2 = "0011" then cyfra3 := "0000110";
    		elsif dana2 = "0100" then cyfra3 := "1001100";
    		elsif dana2 = "0101" then cyfra3 := "0100100";
    		elsif dana2 = "0110" then cyfra3 := "0100000";
    		elsif dana2 = "0111" then cyfra3 := "0001111";
    		elsif dana2 = "1000" then cyfra3 := "0000000";
    		elsif dana2 = "1001" then cyfra3 := "0000100";
    		else cyfra3:="0000000";	 
    		end if;		
    		
    		cyfra<=std_logic_vector(cyfra1);
    		cyfra2<=std_logic_vector(cyfra3);
    		end process;
    			
    	 -- enter your statements here --
    
    end Fub2;
    
  • REKLAMA
  • #2 11579920
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    o ile czegos nie przegapilem, to podstawowa usterka
    jest taka, ze masz 2 niezalezne moduly, w zaden sposob
    ze soba nie 'powiazane', najprawdopodobniej skompilowales
    tylko jeden z nich;
    sprobuj sprawdzic w jakims 'rtl view', 'schematics' co
    tam masz w swoim narzedziu, jak kompilator widzi twoj
    projekt;

    nazwy typu: 'NET316' przemianowalbym na jakies bardziej
    'user-friendly';

    zaczynasz liczyc po aktywacji guzika 'start', przy pewnym
    pechu moze sie zdarzyc, ze zaczynasz liczyc pod sam
    koniec okresu, wiec wynik bedzie bledny;
    'start' powinien 'uzbrajac' licznik, ale start zliczania
    powinien byc aktywowany przejsciem z '0' na '1' mierzonego
    sygnalu;

    jesli sie nie myle we wrazeniu 'na pierwszy rzut oka',
    to zmienne 'liczba1,2/okres' sa zerowane gdy 'clk0'
    jest '0', wiec nic ci sie nie wyswietli, nawet jak bedzie
    poprawnie zliczane;

    moze zamiast odejmowania od zliczonych impulsow
    liczby zaleznej od 'okres' bardziej elegancko
    byloby zrobic 2 proste liczniki modulo10 ?
    -----------------------
    na drugi rzut oka -
    ... niepotrzebna uwaga ... :)
    -----------------------
    powinienes zmienic:
    elsif okres > "xxxxxx" na elsif okres >= "xxxxxx"

    oraz:
    else
    liczba1 := "0000000";
    liczba2 := "0000000";

    na
    else
    liczba1 := okres; --"0000000";
    liczba2 := "0000000";


    j.a
  • REKLAMA
  • #3 11581459
    lauba1
    Poziom 10  
    Posty: 13
    Ocena: 2
    dzięki, słuszne uwagi, przetestuje to jak będę miał dostęp do sterownika i zdam relacje z tego co było nie tak.
  • #4 11582514
    J.A
    Poziom 28  
    Posty: 596
    Pomógł: 159
    Ocena: 12
    przede wszystkim - kod najpierw sie symuluje, potem sprawdza na sprzecie;
    symulacja pozwala 'obejrzec' kazdy sygnal kodu, sprzet tylko
    koncowy wynik, z ktorego zazwyczaj nic nie wynika;

    j.a
REKLAMA