1HZ, 30HZ elde etmek. Nasıl?

Başlatan MC_Skywalker, 07 Ekim 2017, 17:55:20

MC_Skywalker

EPM570T100C5 CPLD ile 7 Segment LCD kullanan saaat yapmaya çalışıyorum ama bir türlü 1HZ ve 30HZ elde edemdim.

30HZ çok keskin olmasada olur 60HZ geçmeyecek bir değer de olur

Ne yaptım 50MHz clk girşi olduğunu kabul edip sayıcı kurup, 26 bit saycı'nın 20'nci birinden ~48HZ (=50Mhz/2^20) alabiliyorum. 25'ici bit ~1.7Hz ve 26'ıncı bit ~0.7Hz veriyor. EPM570T100C5 içinde PLL olmadığı için mega wizard ile clock üretimi yapılmıyor.

integer 0-49999999 saydırıp 50000000 geldiğinde tetik alsam doğruluğu ne olur acaba?


Erol YILMAZ

50MHz clk kaynağınız kadar doğru olur :)

muuzoo

@MC_Skywalker  Aslında cevabınızı vermişsiniz bit kontrolünden ziyade sayaç yaparak elde edebilirsiniz.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

MC_Skywalker

@Allegro tabiki clk giriş kaynağının doğrulu kadar olur. Benim sormak istediğim.

26 bit binary sayaç  mı yoksa integer bir sayaçmı daha doğru tercih olur

polleme

Ek bir devre yapmayı düşünürseniz piyasada saat modüllerinde kullanılan 32,768 KHz Kristal ve bir CD4060 bölücü ile 2Hz elde edilebilir. Bu da ikiye bölünürse hassas 1Hz olur (kristalin hassasiyeti önemli)

Örnek:

https://jvok.uk/clock/timebase.png

Zoroaster

Alıntı yapılan: MC_Skywalker - 07 Ekim 2017, 18:28:28
@Allegro tabiki clk giriş kaynağının doğrulu kadar olur. Benim sormak istediğim.

26 bit binary sayaç  mı yoksa integer bir sayaçmı daha doğru tercih olur

Ne demek istiyorsun anlasilmiyor ki. Integer sayac ile decimal sayactan mi bahsediyorsun acaba?

Senin yapmam gereken senkron lojik tasarimla yapilmis sayac. Binary ya da decimal olmasinin onemi yok.
Seytan deliginden kacti.

MC_Skywalker

Sormak istediğim şu şekildeydi;

Binary dediğim sayaç;
signal sayac: STD_LOGIC_VECTOR(26 down to 0);
....
sayac = sayac +1
....
clk30HZ <= sayac(20) -- 20. bitten çıkış
clk1HZ <= sayac(26)  -- 26. bitten çıkış
....


integer sayaç dediğim.
signal sayac1 : integer range 0 to 49999999 := 0; --1Hz için sayacak sayaç
signal sayac30: integer range 0 to 1048576:=0; --30Hz için sayacak sayaç
...
         if sayac1 = 49999999 then
                      sayac1 <= 0;
                      clk1HZ <=1
         else
        sayac1 <=sayac1 + 1;
        clk1HZ <=0
....


alicavuslu

Sen integer da seçsen kullandığın sentezleme aracı 26 bite düşürecektir. Çok sorun olacak bi durum değil. Kod yazma açisindan integer yerine std_logic_vector kullanman daha iyidir.

MC_Skywalker

Bu projeyi componetlere ayırarak max300 sersi CPLD için yeniden yapmak istedim fakat sanırım biryerlerde hata yaptım ama bir türlü çözemedim. LCD den görüntü alamadım. proje sıkıntısız derlenmekte ve CPLD içne yüklemenemte.

Segment LCD 50Hz clock ister com ucundan tüm segmentler 50Hz ve terslenmiş 50Hz ile xor işlemine tabi tutulmak zorunda.

Top level entry LCD_7seg.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity LCD_7seg is
      Port ( Clk_13Mhz5 : in std_logic;
   Com : out std_logic;
   a,b,c,d,e,f,g : out STD_LOGIC);
end LCD_7seg;

architecture Behavioral of LCD_7seg is
 signal segmentler: std_LOGIC_VECTOR (1 to 7);
 signal Bcd:  STD_LOGIC_VECTOR(3 downto 0);
 signal Clk_50Hz: std_LOGIC;
 signal NClk_50Hz: std_LOGIC;
 
Component Sayac is
 port ( Bcd:  STD_LOGIC_VECTOR(3 downto 0));
end Component Sayac;
 
Component Saat_bolme is

 port (Clk_13Mhz5: std_logic; 
 Clk_50Hz: std_LOGIC;
   NClk_50Hz: std_LOGIC);
end Component Saat_bolme;

                            
  begin
                  with Bcd select
                  segmentler <= "0000001" when "0000", --0 a b c d e f g
                                "1001111" when "0001", --1
   "0010010" when "0010", --2
   "0000110" when "0011", --3
   "1001100" when "0100", --4
   "0100100" when "0101", --5
   "0100000" when "0110", --6
   "0001111" when "0111", --7
   "0000000" when "1000", --8
   "0001100" when "1001", --9
   "0001000" when "1010", --A
   "1100000" when "1011", --b
   "0110001" when "1100", --C
   "1000010" when "1101", --d
   "0010000" when "1110", --e
   "0111000" when "1111", --F
   "1001000" when others;
 
 a<= segmentler(1) xor Clk_50Hz xor NClk_50Hz; 
                  b<= segmentler(2) xor Clk_50Hz xor NClk_50Hz;
 c<= segmentler(3) xor Clk_50Hz xor NClk_50Hz;
 d<= segmentler(4) xor Clk_50Hz xor NClk_50Hz;
 e<= segmentler(5) xor Clk_50Hz xor NClk_50Hz;
 f<= segmentler(6) xor Clk_50Hz xor NClk_50Hz; 
 g<= segmentler(7) xor Clk_50Hz xor NClk_50Hz;    
 Com<= Clk_50Hz;
                                        
end Behavioral;

50Hz ve 1Hz elde etme Saat_bolme.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Saat_bolme is
 port (Clk_13Mhz5 : in std_logic;
 Clk_1Hz   : out std_logic;
 Clk_50Hz   : out std_logic;
 NClk_50Hz  : out std_logic);
end Saat_bolme;

architecture Behavioral of Saat_bolme is
 signal Q: std_logic_vector(23 downto 0); --24bit sayac

 begin
 --13.5Mhz saat sinyalinden 1Hz ve 50Hz elde ediliyor
 process(Clk_13Mhz5)
 begin
 if rising_edge (Clk_13Mhz5) then
 Q <= Q+1;
 end if;
 end process; 
 Clk_50Hz <= Q(18);
 NClk_50Hz <= not Q(18);
 Clk_1Hz <= Q(23);
end Behavioral; 
 

bcd saydırma Sayac.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Sayac is
 Port ( Bcd: out STD_LOGIC_VECTOR(3 downto 0)); 
end Sayac;

architecture Behavioral of Sayac is
 signal sayi: std_LOGIC_VECTOR(3 downto 0);
 signal Clk_1Hz : std_logic;
begin
 process(Clk_1Hz)
 begin
 if rising_edge (Clk_1Hz) then
 sayi <= sayi +1;
 end if;
 end process; 
 Bcd <= sayi;
end Behavioral;

proje dosyaları https://drive.google.com/open?id=1OJbTWNsABZDoljK-kiikgwkbcZcPye1g


MC_Skywalker

Soruyu yanlış sormuş ve yanlış kodları paylaşmışım. Oluşturduğum komponetlerden birini diğernine bağlarken bir hata yapıyorum ama farkedemedim. esas sorum bu. yardımcı olabilecek var mı?



Çalıştığım kodlar ekte

Top level entry LCD_7seg.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity LCD_7seg is
       Port ( Clk_13Mhz5 	 : in std_logic;
				  Com 		    : out std_logic;
				  a,b,c,d,e,f,g : out STD_LOGIC);
end LCD_7seg;
	
architecture Behavioral of LCD_7seg is	

		signal segmentler		 : std_LOGIC_VECTOR (1 to 7);
		signal Clk_50Hz		 : std_logic;
		signal NClk_50Hz		 : std_logic;	
		signal Bcd				 : STD_LOGIC_VECTOR(3 downto 0);
		
Component Saat_bolme is

	port (Clk_13Mhz5: in std_logic; 
		 	Clk_50Hz: out std_LOGIC;
		   NClk_50Hz: out std_LOGIC);
end Component Saat_bolme;
				 
Component Sayac is
	port ( Bcd: out STD_LOGIC_VECTOR(3 downto 0));
end Component Sayac;
	
                           
  begin
	Saat_bolme_unit: Saat_bolme port map
		(
				Clk_13Mhz5 => Clk_13Mhz5,		
				Clk_50Hz	 => Clk_50Hz,
				NClk_50Hz => NClk_50Hz
		);

	Sayac_unit: Sayac port map
		(
				Bcd => Bcd
		);	
  
                  with Bcd select
                  segmentler <= "0000001" when "0000", --0 a b c d e f g
                                "1001111" when "0001", --1
										  "0010010" when "0010", --2
										  "0000110" when "0011", --3
										  "1001100" when "0100", --4
										  "0100100" when "0101", --5
										  "0100000" when "0110", --6
										  "0001111" when "0111", --7
										  "0000000" when "1000", --8
										  "0001100" when "1001", --9
										  "0001000" when "1010", --A
										  "1100000" when "1011", --b
										  "0110001" when "1100", --C
										  "1000010" when "1101", --d
										  "0010000" when "1110", --e
										  "0111000" when "1111", --F
										  "1001000" when others;
										 
						a<= segmentler(1) xor Clk_50Hz xor NClk_50Hz;				 
                  b<= segmentler(2) xor Clk_50Hz xor NClk_50Hz;
						c<= segmentler(3) xor Clk_50Hz xor NClk_50Hz;
						d<= segmentler(4) xor Clk_50Hz xor NClk_50Hz;
						e<= segmentler(5) xor Clk_50Hz xor NClk_50Hz;
						f<= segmentler(6) xor Clk_50Hz xor NClk_50Hz;						
						g<= segmentler(7) xor Clk_50Hz xor NClk_50Hz;    
						Com <= Clk_50Hz;
                                         
end Behavioral;


50Hz, terslenmiş 50Hz ve 1Hz elde etme Saat_bolme.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Saat_bolme is
	port (Clk_13Mhz5 : in std_logic;
			Clk_1Hz	  : out std_logic;
			Clk_50Hz	  : out std_logic;
			NClk_50Hz  : out std_logic);
end Saat_bolme;

architecture Behavioral of Saat_bolme is
	signal Q	: std_logic_vector(23 downto 0); --24bit sayac

	
	begin
		--13.5Mhz saat sinyalinden 1Hz ve 50Hz elde ediliyor
		process(Clk_13Mhz5)
		begin
				if rising_edge (Clk_13Mhz5) then
					Q <= Q+1;
				end if;
		end process;		
	
		Clk_50Hz <= Q(18);
		NClk_50Hz <= not Q(18);
		Clk_1Hz <= Q(23);	
end Behavioral;

bcd saydırma Sayac.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Sayac is
		 Port ( Bcd: out STD_LOGIC_VECTOR(3 downto 0));
				 
end Sayac;

architecture Behavioral of Sayac is
		signal sayi		: std_LOGIC_VECTOR(3 downto 0);
		signal Clk_1Hz	: std_logic;

Component Saat_bolme is
	
	port (Clk_1Hz: out std_logic);  	

	end Component Saat_bolme;		
		
		begin
			Saat_bolme_unit: Saat_bolme port map
			(
					Clk_1Hz	 => Clk_1Hz
			);

		process(Clk_1Hz)
		begin
				if rising_edge (Clk_1Hz) then
				sayi <= sayi +1;
				end if;
		end process;		
		Bcd <= sayi;
end Behavioral;

devrecii


Top level entry LCD_7seg.vhd
KodSeç

	port (Clk_13Mhz5: in std_logic; 
		 	Clk_50Hz: out std_LOGIC;
		   NClk_50Hz: out std_LOGIC);
                   Clk_1Hz: out std_LOGIC);  <-------------  bunları unutmuşsun 
 


bir de devrede xorların 3 bacağından biri bacağı boşta görünüyor bana öyle geldi.


 Nden böyle yapıyorsun lcd farklı mı sürülüyor 7seg led e göre


MC_Skywalker

#11
Alıntı yapılan: iboibo - 18 Nisan 2019, 17:38:45
Top level entry LCD_7seg.vhd
KodSeç

	port (Clk_13Mhz5: in std_logic; 
		 	Clk_50Hz: out std_LOGIC;
		   NClk_50Hz: out std_LOGIC);
                   Clk_1Hz: out std_LOGIC);  <-------------  bunları unutmuşsun 
 
bir de devrede xorların 3 bacağından biri bacağı boşta görünüyor bana öyle geldi.
 Nden böyle yapıyorsun lcd farklı mı sürülüyor 7seg led e göre

Xorlar bağlı sıkıntı yok.
port olarak tanımladığımda quartus asşağıdaki hatayı veriyor.
Error (10465): VHDL error at LCD_7seg.vhd(9): name "Clk_50Hz" cannot be used because it is already used for a previously declared item



Bu statik LCD Com ucuna 30Hz ile 100Hz arası pluse istiyor. bu frekans üreticinin kataloğunda yazayıyor.



pulse vermeden DC ile sürünce segmentler buzuluyor.

Bir yabancı amca denemiş böyle olmuş.

muuzoo

Merhaba,

Detaylı olarak incelemedim fakat ilk gözüme çarpan şu var:

segmentler(1) xor Clk_50Hz xor NClk_50Hz;

CLk işaretini kendisinin tersi ile xor işlemine tabi tutuyorsunuz, bu  işlemin sonucu her zaman "1" olur. O yüzden kodunuz şuna dönüşür

segmentler(1) xor "1";

Bu durumda ise yaptığınız iş aslında "not" kapısına tekabül eder. Yani değeri her zaman terslemiş olursunuz.

Acaba gözden kaçırdığım bir durum mu var?
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

MC_Skywalker

CD4543'e bakarak yapmaya çalışıyorum. Pluse girişini tersleyip XOR'un bir girişine girmiş dahasonra girşi terslemeli Buffer ile XOR'un diğer girşine girmiş ve kalan girşie segmenti girmiş. Orada ayrıca XOR dan sonra NOT ile birdaha tersleyip bufferlamış.


M.Salim GÜLLÜCE

Anladığım kadarıyla 50 Hz ve 1 Hz arıyorsunuz.
Neden donanımsal olarak Şebeke frekansını kullanıp elde etmiyorsunuz?
Önce gerçekten LCD problemin frekans ile mi ilgili onu bir netlersiniz böylece..