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?
50MHz clk kaynağınız kadar doğru olur :)
@MC_Skywalker Aslında cevabınızı vermişsiniz bit kontrolünden ziyade sayaç yaparak elde edebilirsiniz.
@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
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
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.
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
....
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.
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
(https://i.postimg.cc/SNJpzr4z/IMG-2469-1.jpg)
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ı?
(https://i.postimg.cc/bwkKCRrm/LCD-7seg.jpg)
Ç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;
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
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.
(http://3.bp.blogspot.com/-2OMFubdkjvQ/T1Mg4mnjn7I/AAAAAAAAAdI/7OLS6rt_x_0/s1600/PIC16F917+pIC16f1807+lcd+driver+raw+7+seg+lcd+driver+using+pic+microcontroller+(2).bmp)
pulse vermeden DC ile sürünce segmentler buzuluyor.
Bir yabancı amca denemiş böyle olmuş.
(http://kevinrye.net/index_files/s101d22tr_6310-2.jpg)
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?
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ış.
(https://i.postimg.cc/X7My5wGV/cd4543.jpg)
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..
Sorun 1Hz ve 50Hz üretmeyel ilgili değil. Doğru kristal rezanatör ile elede etmek sorunsuz oluyor. Buradaki sorun benin kotu kod yazmam nedeniye VHDL ile oluşturduğum componetleri bağlayamam.
EML deyken 7490 ve 7446 ile saat yapmıştım onu elimde kalan 32 marcro celli CPLD ile yapmak.
Uzun zaman ara verdiğim 7 segment LCD sürücüye geri döndüm LCD de 0 sayısını görmeyi başardım lakin 4 bit saycı ilerletemdim he 0 da kalıyor.
sayacı kodunu sanırım düzenleme yaparken bozdum ama nereyi bozdum bulamadım. Hızlıca bakıp fikir verebilecek birini tavsiyesine ihtiyacım var.
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); -- out
end Component Saat_bolme;
begin
Saat_bolme_unit: Saat_bolme port map
(
Clk_1Hz => Clk_1Hz
);
process(Clk_1Hz)
begin
if Clk_1Hz= '1' and Clk_1Hz'event then
if sayi = "1111" then
sayi <= "0000";
else
sayi <= sayi +1;
end if;
end if;
end process;
Bcd <= sayi;
end Behavioral;
(https://i.postimg.cc/0jrDMp9R/IMG-2562.jpg)
Donanım hayatta mı hocam,
kabloların yerini değiştirip "g" segmentini yakabiliyormusunuz kontrol ettiniz mi...
denemek için
"1111110" when "0000",
kısnını
"0000001" when "0000",
yaptım g segmenti yandı dşğer tümü söndü
Şematik verirsen daha iyi anlaşılır.
port (Clk_1Hz: out std_logic); -- out bu doğru değil input değil mi bu;
entity Sayac is
Port ( Bcd: out STD_LOGIC_VECTOR(3 downto 0));
end Sayac; vdll bilmiyorum ama burada clk1 i de tanımlaman gerekir bence.
port (Clk_1Hz: out std_logic); -- out bu doğru değil input değil mi bu;
O saat bölme kompentinde Clk_1HZ çıkışı olduğunu gösteriyor
Saat_bolme_unit: Saat_bolme port map
(
Clk_1Hz => Clk_1Hz
);
Saatbölme komponentinden gelen sinyali
signal Clk_1Hz : std_logic;
burada sayaç komponetine bağladım.
(https://i.postimg.cc/26ycfZvK/LCD-7seg.jpg)
Hocam şemada gördüğün gibi sayaç modulüne clocku bağlamamış.
Evet bende onu farkettim. fakat nerede hata yaptığımı anlayamadım.
Clk_1Hz i sinyal yerine, entity kısmında Clk_1Hz i port olarak tanımlayıp syntsize et dediğimde sorun oluyor ve Clk_1Hz ile ilgili hata veriyor.
Şemada ki sayac compenetine baktığımda Clk_1Hz girişi var görünüyor.
Yarın tüm kodu sıfırdan temiz yazacağım. Nerede hata yaptığımı bulurum. şansa büyük proje değil :) :)
quartusta hille yapı componetleri şematikte birleştirip yapınca 32 Macrocell yetmedi.
Viadoya geçip basts için düzenleyip top lvl'i yeniden yazdım. sonuç sorunsuz.
(https://i.postimg.cc/dt7jm4Wx/Untitled-1.jpg)
Fikir verenlere teşekürler.
video eklemeyi unutmuşum :)
(https://i.postimg.cc/vBFVgVTc/single-Digit-LCD-SSD.gif)
https://i.postimg.cc/vBFVgVTc/single-Digit-LCD-SSD.gif